在链表末尾插入节点后出现意外值

时间:2015-07-15 06:59:47

标签: c++ linked-list

我尝试在链表的末尾插入一个节点。节点被插入但不管我给最后一个节点的值是什么,它总是最终给我0(零)作为它的值。我的c ++代码是 -

#include<iostream>
using namespace std;

struct list{
    int data;
    list *next;
};

list * create(){
    char a;
    int i=1;
    list *move,*start,*temp;
    start=new list();
    temp=start;
    cout<<"Do u want to enter a new node. Press y but anything.\n";
    cin>>a;
    while(a=='y'){
        cout<<"Enter data for node "<<i<<endl;
        cin>>start->data;
       move=new list();
       start->next=move;
       start=start->next;
       i++;
       cout<<"Do u want to enter a new node. Press y but anything.\n";
       cin>>a;
    }
    start->next=NULL;
    return temp;
}

void display(list *ob){
    int i=1;
    while(ob->next!=NULL){
    cout<<"\nData for node "<<i<<" is :"<<ob->data;
    ob=ob->next;
    i++;
} }

void add(list *temp){
while(temp->next!=NULL){
    temp=temp->next;
}
int data;
list *node1=new list();
temp->next=node1;
cout<<"Enter data for new node at the end";
cin>>data;
node1->data=data;
node1->next=NULL;

}

int main(){

list *point=create();
add(point);
display(point);
}

我的控制台提供以下输出。

Do u want to enter a new node. Press y but anything.
y
Enter data for node 1
1
Do u want to enter a new node. Press y but anything.
y
Enter data for node 2
2
Do u want to enter a new node. Press y but anything.
n
Enter data for new node at the end 5

Data for node 1 is :1
Data for node 2 is :2
Data for node 3 is :0

任何人都可以向我解释节点3的输出。尽管它给它的值为5但它的输出为0!

2 个答案:

答案 0 :(得分:1)

这不是最后一个节点的值正在变为零,但是在创建函数中,您创建了一个您未考虑的额外节点,并且此节点采用默认值,即零。

所以你的列表实际上有这些值: 1 2 0 5

但由于显示功能出错,5还没有打印出来。

所以你的代码中有两个错误。

1- create function中的while循环应该是这样的:

while(a == 'y'){
    cout<<"Enter data for node "<<i<<endl;
    cin>>start->data;
    cout<<"Do u want to enter a new node. Press y but anything.\n";
    cin>>a;

    if (a != 'y')
    {
        break;
    }

    move=new list();
    start->next=move;
    start=start->next;
    i++;
}

我知道它看起来并不那么整洁,所以如果你想要你可以翻转代码中的某些东西,使它看起来更整洁,但是这个代码正在做什么(自己尝试一下;))

2-显示功能应该变为:

while(ob!=NULL){
    cout<<"\nData for node "<<i<<" is :"<<ob->data;
    ob=ob->next;
    i++;
}

因为在你的代码中,最后一个元素没有被打印出来。

此致

答案 1 :(得分:0)

正如AbdulRahman AlHamali指出的那样,我错误地说原始名单将被销毁。所以,我的建议现在变得无关紧要了。

//不相关

建议:在移动到下一个节点之前,设置一个变量来保存列表的引用:

void add(list *temp){
    list *temp1 = temp;
    while(temp1->next!=NULL){
        temp1=temp->next; 
    }
    int data;
    list *node1=new list();
    temp1->next=node1;
    cout<<"Enter data for new node at the end";
    cin>>data;
    node1->data=data;
    node1->next=NULL;

    }