2015-12-18 2 views
1

Итак, недавно мне пришлось создать связанную структуру списка, и я думаю, что получил функцию создания ее для работы (надеюсь), но теперь у меня есть такая простая проблема, как ее печатать на консоли. Я не знаю, что-то не так с моей структурой, которую я создал, или что-то не так с печатью. Я был бы признателен, если кто-то может найти то, что случилось с моим кодом:Структура связанного списка печати C

struct z { int a; struct z *next; }; 
struct z *head, *node, *next; 
int data, x = 1; 

int CreateList() { 
    printf("Enter 0 to end\n"); 
    printf("Enter data no. %d: ", x); 
    x++; 
    scanf("%d", &data); 
    if (data == 0) return 0; 
    head = (struct z *)malloc(sizeof(struct z)); 
    if (head == NULL) { printf("Error creating head"); return 0; } 
    node = head; 
    node->a = data; 
    node->next = NULL; 
    while (data) { 
     next = (struct z *)malloc(sizeof(struct z)); 
     if (next == NULL) { printf("Error creating next node no. %d", x); return 0;} 
     node = next; 
     printf("Enter data no. %d: ", x); 
     x++; 
     scanf("%d", &data); 
     node->a = data; 
     node->next = NULL; 
    } 
    return 0; 
} 


int main() { 
    CreateList(); 
    node = head; 
    while (node != NULL) { 
     printf("%d ", node->a); 
     node = node->next; //<=== crash on this line 
    } 
    return 0; 
} 

Мой выход всегда только первый вошел INT, а затем все это падает на отмеченной линии.

+0

Каким был вход, выход и ожидаемый выход? – chux

+1

'node = next;' -> 'node-> next = next; node = next; 'Может быть, другие вещи слишком много зависят от ввода - который не отправлен. – chux

+0

Функция собирает фрагменты данных, помещает их в переменную «a» и сохраняет ее, затем создает новую и повторяется. Результат, который я хочу, это все части данных, напечатанные в том порядке, в котором они были помещены в связанный список. – Thirstix

ответ

1

Ваш main цикл использует неправильную переменную:

int main(){ 
    CreateList(); 
    node = head; 
    while (next != NULL) { 
     printf("%d ", node->a); 
     node = node->next; //<=== crash on this line 
    } 
    return 0; 
} 

Вы должны использовать вместо node:

int main(){ 
    CreateList(); 
    node = head; 
    while (node != NULL) { 
     printf("%d ", node->a); 
     node = node->next; //<=== crash on this line 
    } 
    return 0; 
} 

Кстати, head, node и next должны быть локальными переменными, и head должны быть возвращенное CreateList().

CreateList() фактически не создает список правильно: узлы не связаны со списком по мере их создания, только первый узел хранится в head.

Вот исправленная версия, которая возвращает список и соответствующий main функции:

struct z { int a; struct z *next; }; 

struct z *CreateList(void) { 
    struct z *head, *node, *next; 
    int data, x = 1; 

    printf("Enter 0 to end\n"); 
    printf("Enter data no. %d: ", x); 
    x++; 
    if (scanf("%d", &data) != 1 || data == 0) 
     return NULL; 
    head = malloc(sizeof(struct z)); 
    if (head == NULL) { 
     printf("Error creating head"); 
     return NULL; 
    } 
    node = head; 
    node->a = data; 
    node->next = NULL; 
    for (;;) { 
     printf("Enter data no. %d: ", x); 
     x++; 
     if (scanf("%d", &data) != 1 || data == 0) 
      break; 
     next = malloc(sizeof(struct z)); 
     if (next == NULL) { 
      printf("Error creating next node no. %d", x - 1); 
      return NULL; 
     } 
     node->next = next; 
     node = next; 
     node->a = data; 
     node->next = NULL; 
    } 
    return head; 
} 

int main(void) { 
    struct z *head = CreateList(); 
    struct z *node; 
    for (node = head; node != NULL; node = node->next) { 
     printf("%d ", node->a); 
    } 
    printf("\n"); 
    return 0; 
} 
+0

Это хорошие советы, но возвращающие эти переменные или просто не использующие функцию, и просто код для создания списка не работал, и я все равно получаю сбой в той же строке, что и раньше. – Thirstix

+0

@Thirstix В дополнение к исправлению комментариев chux. – BLUEPIXY

0

Я думаю, ваша проблема глобальных переменных. Сделайте их в функции, по крайней мере, в узле и в следующем. Создавайте их по требованию, когда вы фактически добавляете значения. В качестве окончательного совета для этого случая цикл do-while сделает ваш код более чистым, чем тот, который сейчас есть, определенно у вас будет меньше повторений кода.

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