【问题标题】:C delete node in a linked listC 删除链表中的节点
【发布时间】:2016-01-02 19:13:55
【问题描述】:

我有这个程序,它具有创建列表的功能,如果节点的值等于函数delete_node() 的参数x,则删除节点,然后打印链接列表节点。创建和打印工作正常,但我无法删除值为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;
}

【问题讨论】:

  • 你正在遍历链表直到你到达末尾,因此当x 在链表的任何地方都找不到时,return l 将返回 NULL。当找到x 时,您将丢弃原始记录并返回下一条记录的副本,最终折腾2 条记录,然后继续遍历列表的其余部分,最终返回NULL。

标签: c++ c linked-list


【解决方案1】:

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

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,您将返回下一个节点。

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

【讨论】:

    【解决方案2】:

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

    通过盯着“假”头节点,while 循环被简化了。

      struct list *delete_node(struct list *l, int x) {
        struct list start;  // Code only uses the next field
        start.next = l;
        struct list *p = &start;
        while (p->next) {
          struct list *q = p->next;
          if (q->value == x) {
            p->next = q->next;
            free(q);
            break;
            }
          p->next = q;
        }
        return start.next;
      }
    

    【讨论】:

      猜你喜欢
      • 2016-03-02
      • 1970-01-01
      • 2019-05-10
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 2013-08-30
      • 2019-05-10
      相关资源
      最近更新 更多