在cpp下面的链表程序有什么问题?

时间:2018-05-01 06:52:22

标签: c++ data-structures

我面临奇怪的问题,列表中唯一的第一个元素是打印出来的。我很长一段时间都在写链表程序。谢谢您的帮助。 printAll函数或list类中添加函数是否有问题。我尝试打印以前的元素,同时添加新的元素和&有用。所以,我没有得到为什么只有第一个元素.ie。头被打印出来了head-> next似乎是null。

 #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 个答案:

答案 0 :(得分:1)

您的添加功能无法链接任何内容。无论何时进入elsetrav都是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是&#34;只是&#34;一个遍历列表的指针,没有任何真正的目的使它成为List的成员。只需在需要遍历列表的函数中使用局部变量。

由于您的代码会将新元素添加到列表末尾,因此在tail中将List指针作为成员通常是一个非常好的主意。特别是如果列表可以包含许多元素,并且您经常添加新元素。

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

答案 1 :(得分:1)

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 :(得分:0)

您从未在next中设置Node指针。

你的代码也有不太理想的缩进,在你可以使用unique_ptr的地方使用原始指针,不用C ++方式初始化构造函数中的变量,使用NULL而不是nullptr,并通过下降执行未定义的行为离开底部而不返回声明为返回值的函数中的值(具体而言是main())。

答案 3 :(得分:0)

问题出在您的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 */
}
}