C++ 打印单链表的头和尾

C++ 打印单链表的头和尾,c++,memory,linked-list,nodes,singly-linked-list,C++,Memory,Linked List,Nodes,Singly Linked List,下面我有一个单链表,它根据导演的名字按字母顺序打印出电影对象的列表。我试图打印列表中的第一个元素(头部)和最后一个元素(尾部),但我很难弄清楚如何打印。我试图打印下面的头,但出于某种原因,它只是打印内存地址,而不是实际的对象值 至于尾部,我不太确定如何访问列表中的最后一个元素,我想知道是否有人可以提供指导或将我推向正确的方向 编辑:实际上我意识到我应该调用head->data->print(),就像我对当前节点所做的那样来打印头部。我只需要弄清楚如何在我的列表中保持一个头部和尾部,而不仅仅是头部

下面我有一个单链表,它根据导演的名字按字母顺序打印出电影对象的列表。我试图打印列表中的第一个元素(头部)和最后一个元素(尾部),但我很难弄清楚如何打印。我试图打印下面的头,但出于某种原因,它只是打印内存地址,而不是实际的对象值

至于尾部,我不太确定如何访问列表中的最后一个元素,我想知道是否有人可以提供指导或将我推向正确的方向

编辑:实际上我意识到我应该调用head->data->print(),就像我对当前节点所做的那样来打印头部。我只需要弄清楚如何在我的列表中保持一个头部和尾部,而不仅仅是头部

List.cc

void List::print() const{
  Node* current = head;

  while (current != NULL) {
    current->data->print();
    current = current->next;
  }
  cout << "HEAD: \n" << head->data->print() << endl; //prints memory address?
 // cout << "TAIL: \n" << head << endl;
}

实际上有两种选择:

  • 跟踪尾部:这听起来可能很愚蠢,但只需在类中添加一个私有节点*,用于跟踪列表中的最后一个元素。如有必要,不要忘记更新此指针
  • 在列表中移动:您知道头部节点指向下一个节点。反过来,该节点将指向其后续节点。你看到模式了吗?您可以这样做,直到您击中一个不指向下一个节点的节点。这是您的最后一个节点
    如果您有一个很长的列表,那么第1点将是有利的。如果在本例中使用第2点,实际上必须遍历整个列表。然而,无论您选择哪种方案,我建议您从实施方案2开始。我认为这个选项会给你一些很好的洞察力。

    “我只需要弄清楚如何维护尾部。”这与你之前的问题“如何访问列表中的最后一个元素”完全不同。具体点。问题是,您不知道如何找到尾部,或者您不知道如何将尾部成员添加到列表类以维护尾部。两者都不难,但一个很琐碎,另一个更复杂。我需要打印列表的开头和结尾。通过这样做,我试图维护一个尾部来跟踪列表中的最后一个元素,以便最终打印出尾部。我想我的问题是如何调整我的链表来跟踪一个头部和尾部,而不仅仅是头部
    #ifndef LIST_H
    #define LIST_H
    
    #include "Movie.h"
    
    class List{
      class Node{
        public:
          Movie* data;
          Node*    next; 
      };
    
      public:
        List();
        ~List();
        void add(Movie*); 
        void print() const;
    
      private:
        Node* head;
    };
    
    #endif