我在自学C语言,现在我正努力学习双链接列表。根据这本书的教程,我发现了一些问题:

typedef struct _seg {
   int  bits[256];
   struct _seg *next, *prev;
} seg;
EXTERN seg *head;
EXTERN seg *last;

基于这样的代码,我知道要从head查看linkedlist,我可以做如下操作:
seg *p;
p = head;
for ( i = 0; i < k; i++)
p = p->next;

但是,如何从最后一个节点(定义为最后一个节点)反向遍历linkedlist?

最佳答案

你可以对称地推理,然后编码。

seg *p = last;
for (int j=0; j < k && p != NULL; j++)
  p = p->prev;

我添加了testp != NULL以避免undefined behavior(当列表中的元素少于k时;在许多系统上,如果在这种情况下忽略测试,则会导致segmentation violation崩溃)。
编译时不要忘记启用所有警告和调试信息(例如使用gcc -Wall -g编译),并学习如何使用调试器(例如gdb)。
顺便说一句,C++11是一种不同于C99或C11的语言(但具有一些兼容性),并通过其标准库为使用std::list的链表提供语言支持。

10-08 12:02