[英]Doubly linked list in C (printing)
我创建了双向链表,并设法从头到尾打印该链表,但是我在向后进行处理时遇到了麻烦。 我在“ 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
。
大多数双链表通常同时具有head
和 tail
,您可以使用后者进行反向扫描。
如果没有 tail
,那第二代码片段可能看起来像找到结尾处可接受的方式,虽然效率较低,那将是比用 tail
。
但是,它有一个致命的缺陷,那就是如果列表为空,它可能会行为不当:
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
否则将current
设置为最后一项的地址。 这意味着您的反向循环将正确运行:
while (current != NULL) {
doSomethingWith (current);
current = current->prev;
}
第一次向前遍历列表以打印其元素时,循环在current == NULL
时结束,然后尝试在此之后立即取消引用current
current = current->prev;
/* ^ NULL */
试试这个
current = head;
while (current->next) {
printf("%p\t%s\t%d\n", current, current->name, current->age);
current = current->next;
}
printf("%p\t%s\t%d\n", current, current->name, current->age);
while (current) {
printf("%p\t%s\t%d\n", current, current->name, current->age);
current = current->prev;
}
请注意,在您的修复程序中,您基本上可以这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.