0

我正在自学 C,我现在正在尝试学习双向链表。按照本书的教程,我发现了一些问题:

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

基于这样的代码,我知道要从头开始遍历链表,我可以执行以下操作:

seg *p;
p = head;
for ( i = 0; i < k; i++)              
p = p->next;

但是,我怎样才能从最后一个节点(定义为最后一个)反向遍历链表?

4

1 回答 1

2

您可以对称推理,并编写代码,例如

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

我添加了测试p != NULL以避免未定义的行为(当列表中的元素少于k元素时;在许多系统上,如果在这种情况下省略测试,则会出现分段违规崩溃)。

不要忘记在编译时启用所有警告和调试信息(例如 compile with gcc -Wall -g)并学习如何使用调试器(例如gdb)。

顺便说一句,C++11是与 C99 或C11不同的语言(但具有一些兼容性),并为使用std::list的链表提供语言支持(通过其标准库)。

于 2013-09-22T14:55:20.770 回答