为什么我不能在进入C ++链表后插入节点?

时间:2016-08-14 03:56:32

标签: 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

似乎我只能在插入后显示头节点并且不显示任何头节点。如果我尝试在头部之后访问下一个节点,则会出现分段错误。那是为什么?

4 个答案:

答案 0 :(得分:4)

  • 插入时,将head->next更新为NULL(当head为NULL时) 并且curr->next为NULL(当某些元素已经在列表中时) 分别
  • 您没有将headcurr相关联。要链接headcurr,您可以 创建另一个指针而不是保留新元素,比如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;
}