2015-02-19 3 views
0

Я пытаюсь создать базовое создание связанного списка, используя C. Я написал следующий код, который работает до первого узла, но в конечном итоге не работает во втором. Я думаю, что проблема заключается в том, где я пытаюсь отобразить значения узлов в списке, разделенные стрелкой (->). Я думаю, что моя логика правильная, но, пожалуйста, поправьте меня. Заранее спасибоВставка связанного списка в начало

#include <stdio.h> 
#include <stdlib.h> 
#include <malloc.h> 

struct node 
{ 
    int number; 
    struct node *next; 
}; 

typedef struct node NODE; 
NODE *node1, *node2, *start, *save; 

int main() 
{ 
    node1 = (NODE *)malloc(sizeof(NODE)); 

    int i = 0; 
    start = NULL; 

    for(i = 0; i < 3; i++) 
    { 
     int inf; 

     printf("Enter node value:"); 
     scanf("%d", &inf); 

     node1->number = inf; 
     node1->next = NULL; 

     if(start == NULL) 
     { 
      start = node1; 
      save = node1; 
     } 
     else 
     { 
      // save=start; 
      // start=node1; 
      // node1->next=save; 
      node1->next = start; 
      start = node1; 
     } 

     while(node1 != NULL) 
     { 
      printf("%d ->",node1->number); 
      node1 = node1->next; 
     } 
    } 

    return 0; 
} 
+2

Пожалуйста, отформатируйте свой код! У меня болят глаза! –

+0

Похоже, что 'node1' указывает на себя ... –

+0

ok отредактировал его. Пожалуйста, взгляните еще раз. –

ответ

0

Вы должны использовать malloc() внутри for цикла. Поскольку он снаружи, используется та же память.

+0

Спасибо, приятель! Не могу поверить, что это вызвало ошибку. : D –

+0

Рад, что я тебе помог.Пожалуйста, голосуйте и принимайте ответ, если он сработает для вас. ;-) – Vamsi

0

Как указано Vamsi, вы должны использовать malloc, чтобы поместить узлы в кучу. Вы также обычно не должны выводить вывод malloc, он не нужен. И тогда вы можете поиграть с составлением дважды связанного списка, где у вас также есть указатель prev внутри вашего struct.

1

Вопросы являются

  • Как вы распределения ваших узлов для вставки (т.е. за исключением одного, вы не).
  • Как они помещаются в список, как только вы исправляете это.
  • Не использовать malloc в программах на C (см. here для чего).
  • Невозможно проверить успех вашего scanf invoke.
  • Отказ проверить успешность вашей malloc вызова

Перед отчаивайтесь, все вы сделали правильно:

  • ли не маскировать указатель узла в typedef
  • Правильно включил MCVE для обзора
  • Пронесено то, что вы можете делать wro нг.

очень простой пример переборе три значения в связанный список будет выглядеть примерно так:

#include <stdio.h> 
#include <stdlib.h> 

struct node 
{ 
    int number; 
    struct node *next; 
}; 

typedef struct node NODE; 

int main() 
{ 
    NODE *head = NULL, *p; 
    int i = 0; 

    for(i = 0; i < 3; i++) 
    { 
     int inf; 

     printf("Enter node value:"); 
     if (scanf("%d", &inf) == 1) 
     { 
      p = malloc(sizeof *p); 
      if (p != NULL) 
      { 
       p->number = inf; 
       p->next = head; 
       head = p; 
      } 
      else 
      { 
       perror("Failed to allocate new node"); 
       return EXIT_FAILURE; 
      } 
     } 
     else 
     { 
      // failed to read data. break 
      break; 
     } 

     // report current linked list 
     printf("%d", p->number); 
     for (p=p->next; p; p = p->next) 
      printf(" -> %d", p->number); 
     fputc('\n', stdout); 
    } 

    // cleanup the linked list 
    while (head) 
    { 
     p = head; 
     head = head->next; 
     free(p); 
    } 
    head = NULL; 

    return 0; 
} 

Входной

Значения 1 2 3 которые вводятся на время запроса:

Выход

Enter node value:1 
1 
Enter node value:2 
2 -> 1 
Enter node value:3 
3 -> 2 -> 1 

Удачи.

Смежные вопросы