我正在自学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;
但是,我怎样才能从最后一个节点(定义为最后一个)反向浏览链接列表?
你可以对称推理,并编写代码,例如
seg *p = last;
for (int j=0; j < k && p != NULL; j++)
p = p->prev;
我添加了测试p != NULL
以避免未定义的行为(当列表的元素少于 k
个时;在许多系统上,如果在这种情况下省略测试,您将获得分段冲突崩溃)。
编译时启用所有警告和调试信息(例如,使用 gcc -Wall -g
进行编译),并学习如何使用调试器(例如 gdb
)。
顺便说一句,C++11 是一种与 C99 或 C11 不同的语言(但有一些兼容性),并为使用 std::list 的链表提供语言支持(通过其标准库)。