使用链接列表的引用传递

时间:2011-03-26 12:54:44

标签: c linked-list pass-by-reference

所以我在链接列表代码上使用了引用传递,但问题是它不是打印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

我的程序中的所有节点都没有链接吗?

3 个答案:

答案 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)

只会释放根节点,但会泄漏子节点......