Я хочу распечатать связанный список, который я только что сделал.
Я понял, как распечатать первый и последний элемент, но не могу придумать, как напечатать весь список.
Мне нужно перейти от первого элемента к следующему элементу
и нужно условие остановки в конце.
но я не реализую итератор на этом.
Просто используя указатель и узлы, я могу напечатать весь список?
int main ()
{ LinkedList name_list;
name_list.TraPrinhead(name_list); }
void LinkedList::TraPrinHead(const LinkedList& p)
{
cout << "The First Element of this List is : ";
cout << header->next->elem; // print out the first element
cout << endl;
cout << "The Last Element of this List is : ";
cout << tail->prev->elem; // print out the first element
cout << endl;
cout << "Now the whole list.......";
cout << ??????????????????????
}
class LinkedList {
public: class Nodes { // Doubly Linked List Node
public:
Nodes(const string& e);
void ToNodeValue(const string& e);
string getElemValue() const;
void printNodeValue();
private:
string elem; // node element value
Nodes* prev; // previous node in list
Nodes* next; // next node in list
// pointer that points to current node is this pointer
public:
void ConnectSingly(Nodes* a, Nodes* b);
void ConnectDoubly(Nodes* a, Nodes* b);
friend class LinkedList;
};public:
LinkedList();
virtual ~LinkedList();
bool empty() const;
const string& getFirst() const;
const string& getLast() const;
void addtoFront(const string& e);
void addtoBack(const string& e);
void TraPrinHead(const LinkedList& p);
private:
Nodes* header;
Nodes* tail;
protected:
void InsertDoublyBefore(Nodes* d, const string& e);
void InsertDoublyAfter(Nodes* d, const string& e);
friend class Nodes;
};void LinkedList::InsertDoublyBefore(Nodes* d, const string& e) {
if (header->next == tail)
{ // header->next->elem = e;
Nodes* n = new Nodes;
n->elem = e;
n->next = tail;
n->prev = tail->prev;
tail->prev->next = tail->prev = n;
header->next = n;
}
else
{
Nodes* n = new Nodes;
n->elem = e;
n->next = d;
n->prev = d->prev;
d->prev->next = d->prev = n;
}
}
void LinkedList::InsertDoublyAfter(Nodes* d, const string& e)
{
InsertDoublyBefore(d->next, e);
}
void LinkedList::addtoFront(const string& e) { InsertDoublyBefore(header->next, e); }
void LinkedList::addtoBack(const string& e) { InsertDoublyBefore(tail, e); }void LinkedList::Nodes::ConnectSingly(Nodes* a, Nodes* b)
{
a->next = b; // a's next pointer points to b
}
void LinkedList::Nodes::ConnectDoubly(Nodes* a, Nodes* b)
{
a->next = b; // a's next pointer points to b
b->prev = a; // b's prev pointer points to a
}
Node* p = myList.head;
while(p) {
std::cout << p->elem << " ";;
p = p->next;
}
Он делает, как и следовало ожидать, продолжает переходить к следующему элементу, пока он не будет равен NULL (достигает конца)
NULL изменяется на 0 компилятором, а 0 == false
Вы должны попробовать просмотреть свои лекционные заметки, так как я уже ответил на вопрос об этом уроке для вас.
Кроме того, я считаю, что, как правило, хвост указывает на последний элемент, а не один за ним.
Таким образом, печать последнего элемента должна быть
cout << tail->elem; // print out the first element
Если ваш инструктор не определил иначе.
И очевидно, что для большинства этих переменных вам понадобятся функции getter, так как они объявлены как частные.
Весь смысл связанного списка в том, что вы можете использовать один элемент для доступа к следующему элементу. Так что вам просто нужно перебрать список с помощью указателя.
Nodes* currentNodes = header->next; //pointer used to iterate through list; initially points at first element of list
while(currentNodes != tail) { //condition to stop
cout << currentNodes->elem << endl;
currentNodes = currentNodes->next;
}