在C中创建链接列表

时间:2013-12-11 09:26:20

标签: c linked-list

您好我对此感到困惑,希望您能帮助我。这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

struct node{
    int x;
    struct node *next;
    struct node *prev;
};

typedef struct node NODE;

NODE * create(int data)
{
    NODE *newn;
    newn=(NODE*)malloc(sizeof(NODE));
    newn->x=data;
    newn->next=NULL;
    newn->prev=NULL;
    return newn;
}

int insert(NODE *list, int data)
{
    NODE *temp,*news;
    temp=list;
    if(list==NULL)
    {
        list=create(data);
        return 0;
    }
}

int main()
{
    int put;
    NODE *mList=NULL;
    clrscr();
    printf("data: ");
    scanf("%i",&put);         
    insert(mList,put);                
}

这是一个非常简单的双向链表,但我甚至无法开始插入,因为我甚至无法将值放入第一个节点。当我在create中创建新节点时,newn->x将具有正确的值,list->x(在insert中)也将具有正确的值,但是当它返回时至于mList->x仍为0

2 个答案:

答案 0 :(得分:4)

您正在按值传递mList指针,因此它会在函数返回时重置。

切换到

insert(NODE** list, int data) 

并通过

传递
insert(&mList, put); 

然后我认为它会起作用。每次你想要一个函数来改变你需要通过指针传递参数,或者如果你移动到C ++就可以通过引用。

答案 1 :(得分:0)

我很惊讶在插入调用后mList为非零。

当您将mList传递给insert时,指针的副本(mList,为NULL)将传递给insert。这意味着无论你在插入函数中使用指针“list”做什么都不会反映在变量mList中(在函数之外)。

您需要传递mList的地址,以便您可以更改其指向的内容。

因此,将insert方法更改为:

insert(NODE** list, int data)

将分配更改为列表:

*list = create(data);

并将调用更改为:

insert(&mList, put);