C删除链表中的节点

雷吉

我有这个程序,它具有创建列表的功能,如果其值等于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;
}
Alvits

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

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在头节点中找到您将返回下一个节点。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章