программа со связанным списком - PullRequest
2 голосов
/ 11 апреля 2011

Я ожидаю, что приведенная ниже программа связанного списка напечатает 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;
}

Ответы [ 7 ]

2 голосов
/ 11 апреля 2011

Ваша локальная переменная head в main() не модифицируется вашей функцией add().Это означает, что вы звоните display() с параметром NULL.

Вам нужно передать NODE **q в add, а затем обновить его в add ().

1 голос
/ 11 апреля 2011

Проблема в сигнатуре метода add, чтобы ваша программа работала, вы должны передать указатель на указатель NODE, как это

void add(NODE **,int );

и работать с ним. Тогда в случае

if(*q==NULL)

Вы можете выделить память и заменить NULL-указатель на новую HEAD этим

*q=(NODE*)malloc(sizeof(struct node));

Так оно и будет работать.

Проблема в том, что когда вы выделяете память, вы просто заменяете локальную копию нулевого указателя на NODE, но это не влияет на заголовок в основной функции.

1 голос
/ 11 апреля 2011

Ваш метод add при первом вызове (когда head == NULL) должен добавить первый узел в список, таким образом изменив head, чтобы указать на вновь выделенный узел.

Но этого не происходит* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '*' '' '' '' '' '' ') "

"может передать указатель 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.
}
1 голос
/ 11 апреля 2011

Функция add () изменяет аргумент q, но передает его по значению.Тогда head остается NULL после вызова add ().

0 голосов
/ 11 апреля 2011

Ах ... вы попадаете в тупик указателями ... По сути, если вы хотите изменить "голову", вам нужно отправить ссылку на THAT ... в противном случае вы просто изменяете указательИзмените свой код на это:

#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 голосов
/ 11 апреля 2011

При вызове Add указатель нового заголовка никогда не возвращается.Таким образом, он по-прежнему указывает на NULL.

0 голосов
/ 11 апреля 2011
int main()
{
  NODE *head=NULL;
  add(head,1);
  display(head);

УЗЕЛ * голова местная к главной. Это значение равно NULL. Вы передаете значение NULL для добавления, которое затем создает NODE и устанавливает его данные равными 1. Затем вы возвращаетесь к main ... ... где head равно STILL NULL. Вам нужно передать адрес head, чтобы его действительное значение изменилось в add (). Вам также нужно изменить add () для работы с указателем.

Main должен вернуть EXIT_SUCCESS или EXIT_FAILURE. Не вводите typedef struct node; это вредно для читабельности, и вы не получаете здесь никакой абстракции.

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