繁体   English   中英

C中的双链表(打印)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM