为什么我不能将 head 之后的节点插入C++链表?

Why can't I insert nodes after head into a C++ linked list?

本文关键字:插入 节点 C++ 链表 之后 不能 head 为什么      更新时间:2023-10-16

谁能帮我找出下面代码的问题?

#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。链接headcurr,可以执行以下命令创建另一个指针来保存新元素,比如new_ptr。保持currcurr->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;
}