有人可以帮我用下面的代码确定问题。
#include <iostream>
using namespace std;
struct node
{
int a,b;
struct node* next=NULL;
};
node* head=NULL;
void insert(int a,int b)
{
if(head==NULL)
{
head=new node;
head->a=a;
head->b=b;
return;
}
node* cur=head;
while(cur!=NULL)
{
cur=cur->next;
}
cur=new node;
cur->a=a;
cur->b=b;
return;
}
void display()
{
node* cur=head;
while(cur!=NULL)
{
cout<<cur->a<<"\t"<<cur->b<<"\n";
cur=cur->next;
}
}
int main()
{
int i;
for(i=0;i<3;++i)
{
insert(i,i+1);
}
display();
//cout<<h->next->a;
return 0;
}
这是我得到的输出:
0 1
似乎我只能在插入后显示头节点并且不显示任何头节点。如果我尝试在头部之后访问下一个节点,则会出现分段错误。那是为什么?
答案 0 :(得分:4)
head->next
更新为NULL(当head
为NULL时)
并且curr->next
为NULL(当某些元素已经在列表中时)
分别您没有将head
与curr
相关联。要链接head
和curr
,您可以
创建另一个指针而不是保留新元素,比如new_ptr
。
保持curr
curr->next=NULL
,然后写
curr->next=new_ptr
。
void insert(int a,int b)
{
if(head==NULL)
{
head=new node;
head->a=a;
head->b=b;
head->next=NULL;
return;
}
node* cur=head,*new_ptr;
while(cur->next!=NULL)
{
cur=cur->next;
}
new_ptr=new node;
new_ptr->a=a;
new_ptr->b=b;
new_ptr->next=NULL;
curr->next=new_ptr;
return;
}
答案 1 :(得分:4)
您的搜索代码是:
node* cur=head;
while(cur!=NULL)
{
cur=cur->next;
}
cur=new node;
在循环结束时,您找到了添加新节点的正确位置,但是您使用cur = new node;
覆盖了该节点 - 因此您需要使用更类似的内容:
node *new_node = new node;
new_node->a = a;
new_node->b = b;
new_node->next = nullptr;
cur->next = new_node;
或等同地:
cur->next = new node;
cur->next->a = a;
cur->next->b = b;
cur->next->next = nullptr;
更好的是,你要为struct node
类创建一个构造函数,例如:
node(int a_init = 0, int b_init = 0) : a(a_init), b(b_init), next(nullptr) { }
然后:
cur->next = new node(a, b);
会完成整个初始化工作。
答案 2 :(得分:3)
我发现了这个错误。在插入时,不是坐在节点中并检查它是否为null,而是先查看1个节点并检查它是否为null。因为如果你不这样做,那么列表就会被破坏,cpp会分配内存而不是最后一个列表节点下一个分支的指针。
修改后的插入功能:
void insert(int a,int b)
{
if(head==NULL)
{
head=new node;
head->a=a;
head->b=b;
head->next=NULL;
return;
}
node* cur=head;
while(cur->next!=NULL)
{
//cout<<cur->a<<"\t"<<cur->b<<"\n";;
cur=cur->next;
}
cur->next=new node;
cur->next->a=a;
cur->next->b=b;
return;
}
答案 3 :(得分:1)
在创建任何节点时,根据节点的定义,该节点的下一个指针变为null
。
struct node
{
int a,b;
struct node* next=NULL;
};
现在,在创建start节点之后,start节点的下一个指针是NULL
。当你创建第二个节点时,你没有将第一个节点的下一个节点指向第二个节点。那么如果你没有指向第二个节点的指针,你将如何能够到达第二个节点。
所以解决方案将是 -
void insert(int a,int b)
{
node *temp;
if(head==NULL)
{
head=new node;
head->a=a;
head->b=b;
temp=head;
return;
}
node* cur=head;
while(cur!=NULL)
{
cur=cur->next;
}
cur=new node;
temp->next=cur;
cur->a=a;
cur->b=b;
temp=cur;
return;
}