链接列表

C 语言没有定义链表数据结构。如果你使用 C 并需要链接列表,则需要使用现有库(例如 GLib)中的链接列表或编写自己的链接列表界面。本主题显示链接列表和双链表的示例,这些列表可用作编写自己的链接列表的起点。

单链表

该列表包含由一个名为 next 的链接组成的节点。

数据结构

struct singly_node
{
  struct singly_node * next;
};

双重链表

该列表包含由两个名为 previous 和 next 的链接组成的节点。链接通常引用具有相同结构的节点。

数据结构

struct doubly_node
{
  struct doubly_node * prev;
  struct doubly_node * next;
};

Topoliges

线性或开放

StackOverflow 文档

圆形或环形

StackOverflow 文档

程序

绑定

将两个节点绑定在一起。 StackOverflow 文档

void doubly_node_bind (struct doubly_node * prev, struct doubly_node * next)
{
  prev->next = next;
  next->prev = prev;
}

制作循环链表

StackOverflow 文档

void doubly_node_make_empty_circularly_list (struct doubly_node * head)
{
  doubly_node_bind (head, head);
}

制作线性链表

StackOverflow 文档

void doubly_node_make_empty_linear_list (struct doubly_node * head, struct doubly_node * tail)
{
  head->prev = NULL;
  tail->next = NULL;
  doubly_node_bind (head, tail);
}

插入

让我们假设一个空列表总是包含一个节点而不是 NULL。然后插入过程不必考虑 NULL。

void doubly_node_insert_between
(struct doubly_node * prev, struct doubly_node * next, struct doubly_node * insertion)
{
  doubly_node_bind (prev, insertion);
  doubly_node_bind (insertion, next);
}

void doubly_node_insert_before
(struct doubly_node * tail, struct doubly_node * insertion)
{
  doubly_node_insert_between (tail->prev, tail, insertion);
}

void doubly_node_insert_after
(struct doubly_node * head, struct doubly_node * insertion)
{
  doubly_node_insert_between (head, head->next, insertion);
}