链表数据结构实现 - HeavyYuan/A-CD-Record-Management-System GitHub Wiki

一、 带头节点的循环双链表

本项目的带头节点的循环列表的实现来自内核,其包括了基本数据结构和操作方法。 这些实现应该形成一整套方法,在后续的工程实现中,整套应用。

  1. 基本数据结构

struct list_head {

struct list_head *prev,*next;

};

typedef struct Record{

char title[MAX_LEN];

......

struct list_head list;

}

  1. 链表操作方法和链表类型是强相关的,即内核中的链表操作方法都是针对特定的链表类型来设计的

1)针对头节点的实现

list_for_each_safe的实现中,不会去遍历头节点,所以遍历停止的条件是 pos != head,且起始遍历的节点是pos = head->next

2)针对循环特性的实现

对结构体Record中的list的初始化,将list的prev,next赋值成自身,提供宏实现LIST_HEAD_INIT,也因此,

list_add,list_add_tail的实现中,没有检查head->prev和elm->next是否为空,因为初始化时,prev和next都是指向的自己。