所以我在链接列表代码上使用了引用传递,但问题是它不是打印soo我该如何解决这个问题呢?
我的代码:
#include<stdio.h>
#include<stdlib.h>
struct node
{
int x;
struct node *next;
};
void add(struct node **root, int x)
{
struct node *conductor;
if(root==NULL)
{
(*root)=malloc(sizeof(struct node));
(*root)->x=x;
(*root)->next=NULL ;
}
else
{
conductor = *root;
while(conductor->next!=NULL)
{
conductor = conductor -> next;
}
conductor->next=malloc(sizeof(struct node));
conductor->next->x=x;
conductor->next->next=NULL;
}
}
void display(struct node *root)
{
struct node *conductor;
conductor=root;
while(conductor!=NULL)
{
printf("%d",conductor->x);
conductor = conductor ->next;
}
}
int main()
{
struct node *root;
root=NULL;
add(&root,5);
add(&root,4);
display(root);
free(root);
system("pause");
}
更好的形式 http://codepad.org/CPdUvK0x
我的程序中的所有节点都没有链接吗?
答案 0 :(得分:3)
void add(struct node **root, int x)
{
struct node *conductor;
if(root==NULL)
那应该是(*root == NULL)
由于您正在调用add(&root...
root
,因此永远不会为NULL。
答案 1 :(得分:1)
支票:
if(root==NULL)
应该是
if(*root==NULL)
正在通过地址传递root
。
此外,您执行free(root)
以释放不正确的整个列表,因为它仅释放第一个节点并使其他节点无法访问,从而导致内存泄漏。要解决此问题,您需要逐个释放节点:
struct node *tmp = root;
while(root) {
tmp = root->next;
free(root);
root = tmp;
}
答案 2 :(得分:0)
问题出在add()
:
if(root==NULL)
此测试是错误的:通过引用传递的root 永远不会为NULL(请参阅main,它包含根节点的地址)。你应该正确测试rrot节点是否为NULL:
if (*root == NULL)
我还想补充一点,你释放为ist分配的内存的方式是错误的:
free(root)
只会释放根节点,但会泄漏子节点......