一、循环链表
循环链表是一种特殊的线性链表
它的最后一个结点的指针域不再是NULL,而是指向头结点
整个链表形成了一个环
二、循环链表的查找、插入和删除
在循环链表中,查找、插入和删除一个结点的操作跟线性链表是基本一致的
差别仅在于:算法中循环的中止条件不再是判断p>next==NULL
而是判断p->next==L(头指针)
三、双向链表
双向链表是一种特殊的线性链表
双向链表中,每个结点包含3项
数据域:数据元素的信息
2个指针域:一个指针指向直接后继(next),另一个指向之前驱(prior)
四、双向循环链表
双向循环链表中,存在着2个环
一个是直接后驱环
一个是直接前驱环
五、双向链表的定义
定义一个双向链表的结点
struct DuLNode
{
int data;
DuLNode *prior;
DuLNode *next;
};
DuLNode *DuLinkList
对于任何一个中间结点,都有p->next->prior==p
都有p->prior->next==p
六、双向链表的插入
双向链表的插入需要改变两个方向的指针
s->next=p;
s->prior=p->prior;
p->prior->next=s;
p->prior=s;
七、双向链表的删除
双向链表的删除也需要改变两个方向的指针
p->prior->next=p->next;
p->next->prior=p->prior;
free(p)
八、基于空间的比较
存储的分配方式
顺序表的存储空间是静态分配的
链表的存储空间是动态分配的
存储密度=结点数据本身所占的存储量/结点结构所占的存储量
顺序表的存储密度=1
链表的存储密度<1
九、基于时间的比较
存取(查找)方式
顺序表中的元素可以随机存取(直接存取)
链表中的元素必须顺序存取(即需要沿着恋查找指定的位置)
插入/删除
时间复杂度是一样的O(n)
顺序表平均需要移动近一半的元素
链表不需要移动元素,只需要修改指针
十、基于应用的比较
顺序表的应用
存储大量数据,并主要用于查找时
用数据库进行学籍管理
链表的应用
存储的元素经常要进行插入和删除操作
大家的网上购物车