从单链列表中删除元素

用户123454321

我想从功能中的值指定的列表中删除一些元素。如果函数的“ val”等于列表中的第一个元素,那么我的函数将不起作用。否则,它会很好地工作。有任何想法吗?

struct elem {
    int val;
    struct elem *next;
};

void del(struct elem *list, int val) {
    struct elem* tmp = list;
    struct elem* prev = NULL;

    while (tmp != NULL) {
        if (tmp->val == val) {
            if (prev == NULL) {
                tmp = tmp->next;
                free(list);
                list = tmp;
            } else {
                prev->next = tmp->next;
                free(tmp);
                tmp = prev->next;
            }
        } else {
            prev = tmp;
            tmp = tmp->next;
        }
    }
}
欧姆

您的调用函数无法知道list已更新。它甚至会继续引用相同的list,后者已被删除。哪个不好

一种解决方案是将列表传递为struct elem **list

void del(struct elem **list, int val) {
    struct elem* tmp = *list;
    struct elem* prev = NULL;

    while (tmp != NULL) {
        if (tmp->val == val) {
            if (prev == NULL) {
                tmp = tmp->next;
                free(*list);
                *list = tmp;
            } else {
                prev->next = tmp->next;
                free(tmp);
                tmp = prev->next;
            }
        } else {
            prev = tmp;
            tmp = tmp->next;
        }
    }
}

编辑:还有其他解决方案。您可以返回新的列表指针:

struct elem *del(struct elem *list, int val) { ... }

您这样称呼它:

list = del(list, 12);

该解决方案的缺点list是在调用中有些多余,并且省略返回值是合法的,因此实际上不更新列表。

我喜欢的解决方案是为列表定义控件结构。目前,它仅包含头指针:

struct list {
    struct elem *head;
};

然后,在列表上操作的函数将指向此结构的指针作为参数:

void del(struct list *list, int val) {
    struct elem* tmp = list->head;
    struct elem* prev = NULL;

    while (tmp != NULL) {
        if (tmp->val == val) {
            if (prev == NULL) {
                tmp = tmp->next;
                free(list->head);
                list->head = tmp;
            } else {
                prev->next = tmp->next;
                free(tmp);
                tmp = prev->next;
            }
        } else {
            prev = tmp;
            tmp = tmp->next;
        }
    }
}

所述struct list可具有附加字段,例如用于快速追加到末尾的尾指针。您还可以跟踪列表的长度。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法从单链列表中删除

来自分类Dev

从单链列表中删除节点

来自分类Dev

从单链列表中删除节点

来自分类Dev

从单链列表中删除节点

来自分类Dev

从单链列表中删除特定值?

来自分类Dev

为什么从双链列表中删除节点比从单链列表中删除节点更快?

来自分类Dev

在Java中的单链列表中删除节点

来自分类Dev

从单链通函列表中删除特定节点

来自分类Dev

从单链列表中删除最后一个节点

来自分类Dev

双链列表中的C ++删除元素功能

来自分类Dev

反转C ++中的单链列表

来自分类Dev

删除单链列表中超出特定数字范围的节点

来自分类Dev

从单链列表中删除最后一个节点(java)

来自分类Dev

删除单链列表中超出特定数字范围的节点

来自分类Dev

在单链列表中删除特定对象的第二次出现

来自分类Dev

查找单链列表的第k个元素

来自分类Dev

查找单链列表的第k个元素

来自分类Dev

在Java中将元素添加到单链列表

来自分类Dev

单链列表删除最后一个节点

来自分类Dev

双链列表-从内存中删除列表

来自分类Dev

C-交换单链列表中的第一个和最后一个元素

来自分类Dev

单链列表Queue中的java.lang.NullPointerException

来自分类Dev

反向单链列表Java

来自分类Dev

单链列表气泡排序

来自分类Dev

单链列表气泡排序

来自分类Dev

双链列表中的节点删除

来自分类Dev

删除列表中的元素

来自分类Dev

查找单链列表的第K个到最后一个元素

来自分类Dev

删除单链表的元素