Получение «двойного освобождения или повреждения» только при удалении первого узла связанного списка - PullRequest
1 голос
/ 21 апреля 2019

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

Я могу удалить любой узел без проблем, кроме первого узла.Попытка сделать что-либо после удаления первого узла приводит к непредвиденному поведению, например, к полному очищению связанного списка, если я добавляю больше узлов, бесконечному циклу при попытке отобразить данные внутри связанного списка и / или к получению ошибки «двойное освобождение или повреждение».".

Удаление узла

struct node* delete_node(struct node *list)

{

    struct node* p = list;
    struct node* prev, *temp;
    int id;

    printf("\nEnter ID: ");
    scanf("%d", &id);

    while(p != NULL)
    {
        if(p->id == id)
        {
            temp = p;
            p = p->next;
            prev->next = p;

            free(temp);
            printf("\nNode Deleted");
            return list;
        }
        prev = p;
        p = p->next;
    }

    printf("\nID not found");
    return list;
}

Добавление узла

struct node *add_node(struct node *list)

{

    struct node *p;
    int id;

    printf("\nEnter ID: ");
    scanf("%d", &id);

    for(p = list; p != NULL; p = p->next)
    {
        if(p->id == id)
        {
            printf("\nUser with this ID already exists.");
            return list;
        }
    }

    struct node *new_req;
    struct node *q = list;

    char username[UNAME_LEN], password[UNAME_LEN];

    printf("\nEnter username: ");
    read_line(username, UNAME_LEN);
    printf("\nEnter password: ");
    read_line(password, UNAME_LEN);

    new_node = malloc(sizeof(struct node));
    if(new_node == NULL)
    {
        printf("\nError allocating memory!");
        return list;
    }

    strcpy(new_node->username, username);
    strcpy(new_node->password, password);
    new_node->id = id;

    if(list == NULL)
    {
        new_node->next = NULL;
        list = new_node;
        return list;

    }


    while(q->next != NULL)
        q = q->next;

    new_node->next = q->next;
    q->next = new_node;

    return list;

}

Если я выйду из программы после удаления первого узла, я получу" двойное освобождение или повреждение ", если я добавлю новый узел после удаления первого узла и попытаюсь отобразить данные, это вызовет бесконечный цикл.Если я удалю первый узел и добавлю 2 дополнительных узла, связанный список будет очищен, и я смогу выйти без ошибок.

1 Ответ

2 голосов
/ 21 апреля 2019

Ваш код удаления не работает должным образом при удалении первого узла в списке.Это можно исправить следующим образом:

    if(p->id == id)
    {
        if(p == list)
            list = list->next;
        else
            prev->next = p->next;

        free(p);
        printf("\nNode Deleted");
        return list;
    }

И переменная temp больше не нужна.

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