为什么我不能将 head 之后的节点插入C++链表?
Why can't I insert nodes after head into a C++ linked list?
谁能帮我找出下面代码的问题?
#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
似乎我只能显示头部节点,插入后没有显示。如果我试图访问头部之后的下一个节点,我得到一个分割错误。为什么呢?
你的搜索代码是:
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);
将完成整个初始化工作。
- 插入时,将
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; }
我发现了错误。插入时,不是坐在节点中检查它是否为空,而是查看前面的一个节点并检查它是否为空。因为如果你不这样做,那么列表将被破坏,cpp将内存分配给其他地方,而不是最后一个列表节点的下一个分支的指针。
修改insert函数:
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;
}
在创建任何节点时,该节点的下一个指针根据您的节点定义变为null
。
struct node
{
int a,b;
struct node* next=NULL;
};
现在,在创建开始节点后,开始节点的下一个指针是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;
}
相关文章:
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 使用代码块在链表的开头插入节点
- 使用 C++ 在 BTree 中递归插入节点
- 在单链表中的后端插入节点
- 在索引中插入节点:链接列表未正确返回列表
- 以分类方式插入节点时遇到麻烦
- 链表,在尾部后面插入节点
- 在 BST 中插入节点时出现逻辑错误
- 简单树插入节点函数显示为空
- 在链表的末尾插入节点
- Quadtree不会插入节点或拆分
- 这是在双链表的第一个节点之后插入节点的正确方法吗?
- 在链表中的第 n 个位置插入节点
- 在链表运行时插入节点错误
- 在链表前面插入节点
- C++ 链表 - 插入节点函数不会更新函数范围之外的值
- 使用 C++ 在单向链表的指定位置插入节点时出现分段错误
- C :指针与指针指针在二进制树中插入节点
- 在链接列表C 中的某个位置插入节点
- 在双向链表中插入节点