链表结构在日常的使用很广泛, 大大小小的软件系统或多或少,或直接或间接的都使用了链表,而关于链表,其又可以分为多种类型,常见的有静态链表,单向链表,双向链表,循环链表等等,除此之外,还有带头结点和不带头结点的链表之分,不过总体来说,这些链表在形态结构上都是类似的。
静态链表
静态链表是用数组实现的链式存储结构,典型的如下:
#define LIST_SIZE 10
typdef unsinged int uInt;
typedef strcut list_node
{
eType e;
uInt next;
}st_link_list[LIST_SIZE];
相比于线性顺序存储结构,静态链表的最大优点在于删除和插入元素不需要移动任何元素,只需要修改“指针”,这里并不是真正意思上的指针,而实质上是静态数组的索引。
静态链表存储结构图1
存储有{a,b}两个元素的静态链表结构图 2
插入元素c后的静态链表结构图3
这里需要说明的是,静态链表将所有的空闲节点组织为备用链表,初始时数组下标为0的单元为该链表的头结点,而st_link_list[LIST_SIZE-1],也就是最后一个元素为链表的头结点,也就是说,静态链表上有两个链表,一个链表上链接的是线性表的结点,另一个链表上链接的是所有未被使用的结点。在图2和图3中我们说明链表加入元素时的过程,开始图2只有a,b两个元素,随后加入元素c后如图3.
单链表
单链表是最基本的具有动态特性的链式存储结构,它的存储结构如下:
typedef struct _list_node
{
eType data;
struct _list_node* next;
}list_node,*plist_node;
链表中当前的元素的next元素通过指针可以访问下个元素,对于删除和插入的操作,只是对链表的next指针进行操作,同时,由于是动态的增长,单链表比动态链表更加灵活。
带有头结点的单向链表示例图
单链表的结构非常相比静态链表简单很多,如上图链表有三个元素4,7,9.
双向链表
双向链表是对单链表进行的拓展,它的存储结构如下:
typedef struct _du_node
{
eType data;
struct _du_node* next;
struct _du_node* prior;
}du_node,*pdu_node;
双向链表的节点元素包含了指向前驱节点和后继节点