Связанный список - узлы Free () вызывают сбой программы - PullRequest
0 голосов
/ 23 декабря 2018

Я новичок в связанных списках в c и написал небольшую программу на c, создавая узлы, и когда я пытаюсь освободить выделенную память, моя программа вылетает.Я не знаю, что является причиной этой ошибки, поэтому я надеюсь, что вы можете мне помочь.Мой код:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct list
{
    int data;
    struct list *link;
} node;
node *createnode();
int main()
{
    node *a = createnode(); //create first node
    node *start = a;
    printf("Value of first node: ");
    scanf("%d", &a->data);
    for(int j = 0; j<3; j++) //create three nodes
    {
        a->link = createnode();
        a = a -> link;
        printf("Value of node %d: ", j+1);
        scanf("%d", &a->data);
        if(j==2)
        {
            a -> link = NULL;
        }
    }
    a = start;
    while(a != NULL)
    {
        printf("%d -> ", a->data);
        a = a -> link;
        if(a==NULL)
        {
            printf("null");
        }
    }
    a = start;
    while(a != NULL)
    {
        a = start;
        start = a -> link;
        free(a);
    }



    return 0;
}
node *createnode()
{
    return malloc(sizeof(node));
}

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Замените это:

    a = start;
    while(a != NULL)
    {
        a = start;
        start = a -> link;
        free(a);
    }

на:

    while(start != NULL)
    {
        a = start;
        start = a -> link;
        free(a);
    }

В исходном цикле a устанавливалось на новое значение без проверки.

0 голосов
/ 23 декабря 2018
while(a != NULL)
{
    a = start;
    start = a -> link;
    free(a);
}

должно быть

while(start != NULL)
{
    a = start;
    start = a -> link;
    free(a);
}

и, конечно, a = start; перед тем, как бесполезно

{edit}

дополнительное замечание, чтобы сделать if(j==2) { a -> link = NULL; }Это плохой выбор, потому что сразу после того, как вы снова протестируете значение j , и если вам нужно изменить количество циклов, вам нужно будет сделать 2 изменения.Лучше удалить его и добавить a -> link = NULL; непосредственно после цикла (тест не требуется)

...