【问题标题】:Circular linked list only has one element after inserting two循环链表插入两个元素后只有一个元素
【发布时间】:2016-05-14 07:36:41
【问题描述】:

我正在尝试实现一个循环链表,但它没有像我预期的那样工作。即使我用insertAfter 插入两个元素,printList 也只打印一个节点。这是一个最小的例子:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

struct dnode_elm {
    int item;
    struct dnode_elm *next, *prev;
};

struct dnode_elm *
insertAfter(struct dnode_elm *a, int value) {
    struct dnode_elm *v= malloc(sizeof(struct dnode_elm));
    v->item=value;
    a->next=v;
    v->prev=a;
    v->next=a->next;
    a->next->prev=v;
    return v;
}

void
printList(struct dnode_elm *h) {
    while (h != h->next) {
        h = h->next;
        printf("%d --> ",h->item);
    }
}

int
main(void) {
    struct dnode_elm h = { INT_MAX, &h, &h };
    insertAfter(&h, 1);
    insertAfter(&h, 2);
    printList(&h);
}

【问题讨论】:

  • 另外,编译时启用警告并将它们设置为错误。 例如gcc -Wall -Werror
  • 另外,请做一个小例子,添加演示问题的实际函数调用,现在我们只需要理解韩语并猜测您输入的内容即可重现问题。跨度>
  • @AnttiHaapalaI 添加了 但仍然无法正常工作...仅打印出虚拟节点
  • 此外,如果您没有 #include &lt;stdlib.h&gt;malloc 可能会在许多平台上中断,因为它假定隐式返回 int 而不是指针。它似乎可以工作,但是当指针不适合 int 时会中断。

标签: c linked-list circular-list


【解决方案1】:

你的插入逻辑错了。

a->next=v;
v->prev=a;
v->next=a->next;
a->next->prev=v;

在这段代码之后,v-&gt;next 等于v,这可能不是你想要的。

一种可能的解决方法是先分配v 的指针,然后再修复v 周围的节点。

v->prev = a;
v->next = a->next;
v->next->prev = v;
v->prev->next = v;

举例说明:


a 之后插入v


设置v-&gt;nextv-&gt;prev


设置v-&gt;next-&gt;prevv-&gt;prev-&gt;next


不过,您也可以重新排列代码中的分配,方法是将第一个分配移动到最后一个分配。

v->prev=a;
v->next=a->next;
a->next->prev=v;
a->next=v;

这允许分配给a-&gt;next-&gt;prev 的工作如您所愿。


此外,您的打印逻辑有缺陷。您需要记住初始列表指针是什么,以便正确检测何时到达末尾。

void *start = h;
while (start != h->next) {
    h = h->next;
    printf("%d --> ",h->item);
}

【讨论】:

  • @jxhwhy v->next->prev = v; v->prev->next = v;
  • @JoJay 将下一个和上一个节点设置为指向v。 (人们可以在那里使用a 代替v-&gt;prev,但这样写更明显)。
  • @jxhI 将变量设置为 void 双指针,它似乎有效。但是while循环无限地运行
  • 喜欢 2147483647 --> 90 --> 2147483647 --> 90 --> 2147483647 --> 90 --> 2147483647.......
  • @JoJay:修复printList
猜你喜欢
  • 2020-04-04
  • 2017-01-04
  • 2022-06-12
  • 2021-08-18
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多