我希望下面的链表程序打印1
但事实并非如此。有人能找出原因吗?
#include<stdio.h>
#include <stdlib.h>
#include<conio.h>
struct node
{
int data;
struct node * link;
};
typedef struct node NODE;
void display(NODE *);
void add(NODE *,int );
int main()
{
NODE *head=NULL;
add(head,1);
display(head);
printf("n");
getch();
return 0;
}
void display(NODE *pt)
{
while(pt!=NULL)
{
printf("element is");
printf("%d",pt->data);
pt=pt->link;
}
}
void add(NODE *q,int num)
{
NODE *temp;
temp = q;
if(q==NULL)
{
q=(NODE *)malloc(sizeof(struct node));
temp = q;
}
else
{
while((temp=temp->link)!=NULL);
temp->link = (NODE *)malloc(sizeof(struct node));
temp=temp->link;
}
temp->data = num;
temp->link = NULL;
}
main()
中的局部变量head
不会被add()
函数修改。这意味着您调用display()
时使用的参数为NULL。
您需要将NODE **q
传递到add中,然后在add((中更新它。
第一次调用add
方法时(当head == NULL
时(,应将第一个节点添加到列表中,从而将head
更改为指向新分配的节点。
但是这不会发生,因为add
不将改变后的head
通信回呼叫者。
要解决此问题,您可以从以下函数返回修改后的head
:
// call as before but assign the return value to head.
head = add(head,1);
.....
// return type changed from void to NODE *
NODE* add(NODE *q,int num)
{
// make the changes as before
// return the head pointer.
return q;
}
或者您可以通过地址将指针head
传递给函数add
,如下所示:
// pass the address of head.
add(&head,1);
.....
// change type of q from NODE * to NODE **
void add(NODE **q,int num)
{
// same as before but change q to *q.
// any changes made to the list here via q will be visible in caller.
}
问题在于add方法的签名,为了使程序正常运行,你应该将指针传递给NODE的指针,比如这个
void add(NODE **,int );
和他一起工作。然后在的情况下
if(*q==NULL)
可以分配内存并将NULL指针替换为新的HEAD通过
*q=(NODE*)malloc(sizeof(struct node));
所以它会起作用的。
问题是,当您分配内存时,您只需将空指针的本地副本替换为NODE,但这不会影响主函数中的头。
int main()
{
NODE *head=NULL;
add(head,1);
display(head);
节点*头是主节点的本地头。它的值为NULL。您传递值NULL进行添加,然后创建一个NODE并将其数据设置为1。然后你回到主。。。其中head仍然为空。您需要传递head的地址,以便在add((中更改它的实际值。您还需要更改add((以使用指针。
Main应返回EXIT_SUCCESS或EXIT_FAILURE。不要对结构节点进行typedef;它对可读性有害,在这里使用它不会得到抽象。
当您调用Add时,新的头指针永远不会返回。所以它仍然指向NULL。
啊。。。你被指针绊倒了。。。本质上,如果你想修改"头",你需要发送一个引用。。。否则,您只是在修改指针。。。将您的代码更改为:
#include<stdio.h>
#include <stdlib.h>
#include<conio.h>
struct node
{
int data;
struct node * link;
};
typedef struct node NODE;
void display(NODE *);
void add(NODE **,int );
int main()
{
NODE *head=NULL;
add(&head,1);
display(head);
printf("n");
getch();
return 0;
}
void display(NODE *pt)
{
while(pt!=NULL)
{
printf("element is ");
printf("%d",pt->data);
pt=pt->link;
}
}
void add(NODE **q,int num)
{
NODE *temp;
temp = *q;
if(*q==NULL)
{
*q=(NODE *)malloc(sizeof(struct node));
temp = *q;
}
else
{
while((temp=temp->link)!=NULL);
temp->link = (NODE *)malloc(sizeof(struct node));
temp=temp->link;
}
temp->data = num;
temp->link = NULL;
}