C删除链表中的节点

时间:2015-10-06 01:26:50

标签: c++ c linked-list

我有这个程序,它具有创建列表的功能,如果节点的值等于函数x的参数delete_node(),则删除节点,然后打印链表节点。创建和打印工作正常,但我无法删除值为x的节点。我得到原始列表或空白列表。

#include <stdio.h>

struct list {
    int value;
    struct list *next;
};

struct list *create_list(struct list *l, int x) {

    //allocate memory for new tmp node
    struct list *tmp = malloc(sizeof(struct list));

    tmp->value = x;

    //tmp shtohet ne koke te listes
    tmp->next = l;

    //l behet koka e listes
    l = tmp;

    return l;
}

struct list *delete_node(struct list *l, int x) {

    while (l) {
        if (l->value == x) {
            //printf("%d", x);
            struct list *tmp = malloc(sizeof(struct list));

            tmp->value = l->next->value;
            tmp->next = l->next->next;
            l = tmp;

            printf("%d ", tmp->value);

        }

        l = l->next;
    }

    return l;
}

int main() {

    struct list *l = NULL;

    for (int i = 5; i > -6; --i)
        l = create_list(l, i);

    l = delete_node(l, 3);

    while (l) {
        printf("%d ", l->value);
        l = l->next;
    }

    printf("\n");

    return 0;
}

2 个答案:

答案 0 :(得分:2)

这是对您有问题的代码的修复。

struct list *delete_node(struct list *l, int x) {
    struct list *prev, *retval=l;
    while (l) {
        if(l->value == x) {
            if(l==retval) {
                retval=l->next;
                free(l);
                l=retval;
            } else {
                prev->next=l->next;
                free(l);
                l=prev;
            }
        }
        prev = l;
        l = l->next;
    }

    return retval;
}

您无需分配更多内存来丢弃不需要的节点。这样做会严重泄漏记忆。

您需要跟踪列表的头部。这是retval的用途。如果在非头节点中找不到或找不到x,您将返回相同的头部。如果在头节点中找到x,您将返回下一个节点。

您还需要跟踪上一个节点,以便能够告诉上一个节点当前节点将被释放。这对于单链接列表是必要的。

答案 1 :(得分:1)

删除的关键是跟踪以前的模式。

盯着&#34;假的&#34;头节点,{{1}}循环被简化。

{{1}}