Использование передачи по ссылке со связанными списками - PullRequest
1 голос
/ 26 марта 2011

Итак, я использую проход по ссылке в своем коде связанного списка, но проблема в том, что он не печатает так, как я могу это исправить?

мой код:

#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 ]

3 голосов
/ 26 марта 2011
void add(struct node **root, int x)
 {
      struct node *conductor;
      if(root==NULL)

Это должно быть, если (*root == NULL)

Поскольку вы звоните add(&root... root, никогда не будет NULL.

1 голос
/ 26 марта 2011

Чек:

if(root==NULL)

должно быть

if(*root==NULL)

как root передается по адресу.

Также вы делаете free(root), чтобы освободить весь список, что неверно, поскольку он освобождает только первый узел и делает другие узлы недоступными, что приводит к утечке памяти. Чтобы это исправить, вам нужно освободить узлы один за другим как:

struct node *tmp = root;
while(root) {
  tmp = root->next;
  free(root);
  root = tmp;
}
0 голосов
/ 26 марта 2011

проблема в add():

if(root==NULL)

этот тест неверен: root проходит по ссылке никогда не NULL (см. В основном, он содержит адрескорневой узел).Вы должны правильно проверить, равен ли узел rrot NULL:

if (*root == NULL)

Я также добавил бы, что ваш способ освобождения памяти, выделенной для ist, неверен:

free(root)

только освободиткорневой узел, но утечка дочерних узлов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...