链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不必相邻。
如何表示逻辑上的相邻关系?可以给每个元素附加一个指针域,指向下一个元素的存储位置。
单链表
单链表的功能实现中:按照指定位置插入元素和删除指定位置的元素时,都要先定位到前一个元素。
针对这两个功能可以看出,若只是定位到前一个元素,采用 while(p && index <i-1) 与 while(p->next && index <i-1)是没有区别的。(在合理范围内,p都是指向前一个元素的。一共5个,找第6的前一个也可以)。
区别在于,是插入还是删除。比如若只有5个元素,在第6个位置插入是可以的,在第6个位置删除是不合法的。而且删除中还要用到p->next->next。
故插入采用p——if(!p) 统一进步,不提前看下一个。比较合理;
删除采用 p->next if(! p->next) 比较合理。
循环链表
解决此问题时候,要避开头节点计数:
p为L;i是要出列的报数值;j计数,初始为0。
双向链表
其结构体定义
typedef struct _LinkNode {
int data; //结点的数据域
struct _LinkNode* next; //下一个结点的指针域
struct _LinkNode* prev; //上一个结点的指针域
}LinkNode, LinkList;
Linux内核“共享”双向链表
是否存在一种方式,让多个链表共享同一套链表操作。
定义其他不同结构体时,将之当作元素放入其中。
例如:
那么如何通过“挂件”访问其他元素:
offsetof是一个宏,可以求出数据结构中的某个成员离起始地址的偏移量