Ich muss diese doppelt verkettete Liste implementieren. Die Liste benötigt einen vorderen Zeiger, der auf das erste gültige Element zeigt, und einen hinteren Zeiger, der auf das letzte gültige Element zeigt.Doppelt verkettete Liste zurück Zeiger
mit diesem Code Mein Problem mit den letzten Zeilen ist, wenn ich T implementieren müssen & zurück und definieren das Ende iterator.What ich derzeit haben, ist nicht
#ifndef List_dllist_h
#define List_dllist_h
#include <iterator>
template <class T>
class DList
{
struct Node
{
Node(const T& x,Node* y = 0):m_data(x),m_next(y),m_prev(y){}
T m_data;
Node* m_next;
Node* m_prev;
};
Node* m_head;
Node* m_back;
public:
class iterator
{
Node* m_rep;
public:
friend class DList;
inline iterator(Node* x=0):m_rep(x){}
inline iterator(const iterator& x):m_rep(x.m_rep) {}
inline iterator& operator=(const iterator& x)
{
m_rep=x.m_rep; return *this;
}
inline iterator& operator++()
{
m_rep = m_rep->m_next; return *this;
}
inline iterator operator++(int)
{
iterator tmp(*this); m_rep = m_rep->m_next; return tmp;
}
inline iterator& operator--()
{
m_rep= m_rep->m_prev; return *this;
}
inline iterator operator--(int)
{
iterator tmp(*this); m_rep= m_rep->m_prev; return tmp;
}
inline T& operator*() const { return m_rep->m_data; }
inline Node* operator->() const { return m_rep; }
inline bool operator==(const iterator& x) const
{
return m_rep == x.m_rep;
}
inline bool operator!=(const iterator& x) const
{
return m_rep != x.m_rep;
}
};
DList() : m_head(0), m_back(0) {}
~DList() { clear(); }
inline T& front() { return *begin(); }
inline const T& front() const { return *begin(); }
inline T& back() { return *--end(); }
inline const T& back() const { return *--end(); }
inline iterator begin() { return iterator(m_head); }
inline iterator end() { return iterator(m_back); }
};
#endif
bearbeiten arbeiten: hinzugefügt --operator
Vielen Dank für Ihre Erklärung. Ich fügte den --operator hinzu und änderte zurück zu * - end(). Ich verstehe, warum m_back + 1 für mich nicht funktioniert. Aber ich bin immer noch verwirrt darüber, wie man mit der Arbeit fertig wird. – Lin0523
Der Weg zum Erreichen von end() besteht darin, herauszufinden, wie man alle Anforderungen erfüllt, die ein End-Iterator-Wert erfüllen muss. Ein üblicher Weg, aber nicht der einzige Weg ist, immer einen Dummy-Knoten am Ende der Liste zu haben, so dass eine leere Liste nur den Dummy-Knoten enthält. Ein Zeiger auf diesen Dummy-Knoten ist Ihr end() - Iterator, und alle echten Knoten in der Liste werden davor eingefügt. Oder haben Sie end() durch einen Nullzeiger dargestellt, aber dann muss der Iterator auch einen Zeiger auf seine eigene Liste enthalten, damit operator-- korrekt arbeiten kann. Es gibt viele Möglichkeiten, dies zu tun. –