代码之家  ›  专栏  ›  技术社区  ›  Akshay Barpute

cpp中的以下链表程序有什么问题?

  •  -2
  • Akshay Barpute  · 技术社区  · 6 年前

    我面临着一个奇怪的问题,列表中唯一的第一个元素就是打印。我已经写了很长时间的链表程序。谢谢你的帮助。list类中的printAll函数或add函数是否有问题。我尝试在添加新元素的同时打印以前的元素(&P);它起作用了。所以,我不明白为什么只有第一个元素。即:打印头部(&P);头部->next似乎为空。

     #include<iostream>
    using namespace std;
    
    class Node{
    public: int data;
    public: Node *next;
    
    public: Node(int data){
    this->data = data;
    this->next = NULL;
    }
     };
    
    class List{
     Node *head, *trav;
     public: List(){
    this->head = NULL;
    this->trav = NULL;
     };
    
     void add(int data){
     if(this->head==NULL && this->trav==NULL){
    
      cout<<"inside the if block"<<endl;
      this->head = new Node(data);
      this->trav = this->head->next;
    }
    else{
      cout <<"inside the else block"<<endl;
      this->trav = new Node(data);
      this->trav = this->trav->next;
    }
      }
    
     void printAll(){
      this->trav = this->head;
    
    while(this->trav!=NULL){
      cout<<this->trav->data<<endl;
      this->trav = this->trav->next;
      }
      }
        };
    
    int main(){
    
     List list;
    
     list.add(2);
     list.add(3);
     list.add(4);
     list.add(5);
     list.printAll();
    
     cout<<sizeof(list);
      }
    
    4 回复  |  直到 6 年前
        1
  •  1
  •   Achal    6 年前

    这个 add() 方法 else 部分链接列表不正确,请做一些书面工作。 这是有效的一个,我试图在评论中解释。

    void add(int data){
            if(this->head==NULL && this->trav==NULL){ /* for 1st node */
    
                    cout<<"inside the if block"<<endl;
                    this->head = new Node(data);
                    this->trav = this->head->next;
            }
            else{
    
                    this->new_node = new Node(data); /*new_node */
                    cout <<"inside the else block"<<endl;
    
                    this->trav = head;/*temp var to point to ast node */
                    while(this->trav->next!=NULL)  {
                            this->trav = this->trav->next;
                    }
    
                    this->trav->next = this->new_node; /*adding at end */
                    this->new_node->next = NULL; /*new_node next make it NULL */
            }
    }
    
        2
  •  1
  •   Support Ukraine    6 年前

    您的add函数没有链接任何内容。每当你进入 else trav 为NULL,您将其设置为等于新节点。但您从未将该新节点链接到上一个节点。

    正常地 trav公司 将被命名为 tail 并指向最后一个元素,以便可以将新元素链接到当前的最后一个元素。

    类似于:

    if(this->head==NULL && this->trav==NULL){
      cout<<"inside the if block"<<endl;
      this->head = new Node(data);
      this->trav = this->head;
    }
    else{
      cout <<"inside the else block"<<endl;
      this->trav->next = new Node(data);
      this->trav = this->trav->next;
    }
    

    编辑

    OP评论道 trav公司 被认为是尾部指针,但只是遍历列表的指针。

    因此,答案是不同的,因为代码需要使用循环找到当前尾部。

    类似于:

    if(this->head==NULL){
      cout<<"inside the if block"<<endl;
      this->head = new Node(data);
    }
    else{
      cout <<"inside the else block"<<endl;
      this->trav = this->head;
      while(this->trav->next)
      {
          this->trav = this->trav->next;
      }
      this->trav->next = new Node(data);
    }
    

    但是,请注意:

    如果 trav公司 “只是”遍历列表的指针,使其成为 List . 只需在需要遍历列表的函数中使用局部变量即可。

    由于您的代码将新元素添加到列表的末尾,所以通常最好 指针作为中的成员 列表 . 尤其是当列表可以容纳许多元素并且您经常添加新元素时。

    您的代码使用 this->some_member 在许多不需要的地方。避免这种情况将使代码更易于阅读。

        3
  •  0
  •   James Picone    6 年前

    您从未设置 next 指针输入 Node .

    您的代码也有不太理想的缩进,在可以使用unique\u ptr的地方使用原始指针,不以C++的方式初始化构造函数中的变量,使用NULL而不是NULL ptr,并通过从底部掉落而不在声明为返回值的函数中返回值(特别是main())来执行未定义的行为。

        4
  •  0
  •   roottraveller    6 年前

    问题在于 add() 方法

    将其替换为此

    void add(int data){
     if(this->head == NULL){  /*If head is null, init it and trav node*/
      cout<<"inside the if block"<<endl;
      this->head = new Node(data); /*init head*/
      this->trav = this->head; /*point to head of list*/
    } else{
      cout <<"inside the else block"<<endl;
      this->trav->next = new Node(data); /* add new elem to next of trav*/
      this->trav = this->trav->next; /*move trav to next node i.e. reset */
    }
    }