您好我对此感到困惑,希望您能帮助我。这是我的代码:
#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
。
答案 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);