我期待以下链接列表程序打印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;
}
答案 0 :(得分:2)
head
功能未修改main()
中的本地变量add()
。这意味着您使用参数NULL调用display()
。
您需要将NODE **q
传递给add,然后在add()中更新。
答案 1 :(得分:1)
add()函数正在修改q参数,但它是按值传递的。然后在add()调用之后head保持为NULL。
答案 2 :(得分:1)
第一次调用时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.
}
答案 3 :(得分:1)
问题在于add方法的签名,为了使你的程序工作你应该将指针传递给NODE的指针,就像这样
void add(NODE **,int );
和他一起工作。 然后以防万一
if(*q==NULL)
您可以分配内存并将NULL指针替换为新的HEAD 通过它
*q=(NODE*)malloc(sizeof(struct node));
所以它会起作用。
问题是,当您分配内存时,只需将空指针的本地副本替换为NODE,但它不会影响主函数中的头部。
答案 4 :(得分:0)
int main()
{
NODE *head=NULL;
add(head,1);
display(head);
NODE * head是本地主要的。它的值是NULL。你传递值 NULL来添加,然后创建一个NODE并将其数据设置为1.然后返回main ... ...其中head是 STILL NULL 。您需要传递head的地址,以便在add()中更改它的实际值。您还需要更改add()以使用指针。
Main应返回EXIT_SUCCESS或EXIT_FAILURE。不要typedef struct node;它对可读性有害,你不会在这里使用它。
答案 5 :(得分:0)
当你调用Add时,永远不会返回新的头指针。所以它仍然指向NULL。
答案 6 :(得分:0)
啊......你被指针绊倒了...... 基本上,如果你想修改“head”,你需要发送一个引用...否则你只是修改指针...将你的代码改为:
#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;
}