仅在删除链接列表的第一个节点时才收到“双重释放或损坏”

时间:2019-04-21 03:00:01

标签: c linked-list

该程序的目的是在链表的末尾添加一个可通过ID删除的节点。

除了第一个节点外,我能够删除所有节点而没有任何问题。删除第一个节点后尝试执行任何操作会导致意外行为,例如,如果我添加更多节点,则将链接列表完全清除,在尝试显示链接列表中的数据时出现无限循环,或者出现错误“双重释放或损坏” “。

删除节点

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;

}

如果删除第一个节点后退出程序,我将得到“双重释放或损坏”,如果删除第一个节点后添加新节点并尝试显示数据,则会导致无限循环。如果我删除第一个节点,并添加两个其他节点,则链接列表将被清除,并且我可以退出而不会出现错误。

1 个答案:

答案 0 :(得分:2)

当您删除列表中的第一个节点时,您的删除代码无法正常工作。解决该问题的方法可能是:

v-img

并且不再需要 if(p->id == id) { if(p == list) list = list->next; else prev->next = p->next; free(p); printf("\nNode Deleted"); return list; } 变量。