gpt4 book ai didi

c - C 中的双向链表(打印)

转载 作者:行者123 更新时间:2023-12-01 19:37:37 24 4
gpt4 key购买 nike

我创建了双向链表,并设法从头到尾打印它,但是我在向后打印时遇到了麻烦。我在“current = current->prev”行中遇到段错误,我不明白为什么。

current = head;

while (current) {
printf("%p\t%s\t%d\n", current, current->name, current->age);
current = current->next;
}

current = current->prev;

while (current) {
printf("%p\t%s\t%d\n", current, current->name, current->age);
current = current->prev;
}

我找到了解决这个问题的方法:

current = head;

while (current) {
printf("%p\t%s\t%d\n", current, current->name, current->age);
current = current->next;
}

current = head;
while (current->next) current = current->next;

while (current) {
printf("%p\t%s\t%d\n", current, current->name, current->age);
current = current->prev;
}

但是,我还是不明白为什么我的方法不起作用。如果有人能解释这一点,我将不胜感激。

最佳答案

当您完成向前方向的循环遍历时,current 将被设置为 NULL,因此使用以下行:

current = current->prev;

不会会有好的结局。不允许取消引用 NULL

您的第二个代码片段起作用的原因是:

current = head;
while (current->next) current = current->next;

它使current指向列表中的最后项,而不是NULL

大多数双向链表往往都有一个一个,您可以使用后者进行反向扫描。

如果您没有,那么第二个代码片段看起来可能是一种可以接受的查找结尾的方法,尽管较少比使用尾部效率更高。

但是,它有一个致命的缺陷,那就是如果列表为空,它可能会出现错误:

current = head;                 // current <- NULL
while (current->next) // cannot dereference NULL
current = current->next;

如果你这样做会更好:

current = head;
if (current != NULL)
while (current->next != NULL)
current = current->next;

如果列表为空,则将 current 设置为 NULL;如果列表不为空,则将设置为最后一项的地址。这意味着您的反向循环将正常工作:

while (current != NULL) {
doSomethingWith (current);
current = current->prev;
}

关于c - C 中的双向链表(打印),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28203646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com