一、什么是双链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
二、双链表的创建和初始化
typedef struct DNode
{
int data;
struct DNode *prior,*next;
}DNode,*DLinklist;
bool InitDLinkList(DLinklist &L)
{
L = (DNode*)malloc(szieof(DNode)); //分配一个头结点
if(L == NULL){
return false;
}
L->prior = NULL;//头结点的prior 指向NULL
L->next = NULL; //头结点之后暂时还没有结点
return true;
}
void testDLinkList()
{
DLinklist L;
InitDLinkList(L);
//。。。。
}
三、双链表的插入
//在p结点之后插入S结点
bool InsertNextDNode(DNode *p,DNode *s)
{
if(p==NULL || s==NULL){
return false;
}
s->next = p->next;
if(p->next !=NULL){ //如果p结点后有后继结点
p->next->prior = s;
}
s->prior = p;
p->next = s;
return true;
}
四、双链表的删除
//删除p结点的后继结点
bool DeletNextDNode(DNode *p)
{
if(p ==NULL){
return false;
}
//找到p的后继结点q
DNode *q = p->next;
if(q == NULL){ //p没有后继
return false;
}
p->next = q->next;
if(q->next !=NULL){ //q不是最后一个结点
q->next->prior = p;
}
free(q); //释放结点空间
return true;
}
void DestoryList(DLinklist &L)
{
while(L->next != NULL){
DeletNextDNode(L);
free(L); //释放头结点
L = NULL;
}
}
双链表不可随机存取,按位查找、按值查找都只能用遍历的方式实现
五、循环单链表
bool InitList(LinkList &L)
{
L = (LNode*)malloc(sizeof(LNode));
if(L==NULL){
return false;
}
L->next = L; //头结点next指向头结点
return true;
}
单链表:从一个结点出发只能找到后续的各个结点
双链表:从一个结点出发可以找到其他任何结点
六、循环双链表
bool InitList(LinkList &L)
{
L = (LNode*)malloc(sizeof(LNode));
if(L==NULL){
return false;
}
L->next = L; //头结点next指向头结点
L->prior = L; //头结点的prior指向头结点
return true;
}
七、静态链表
1.介绍:
用数组描述的链表,即称为静态链表。
在C语言中,静态链表的表现形式即为结构体数组,结构体变量包括数据域data和游标CUR。
分配一整片连续的内存空间,各个结点集中安置
2.创建:
#define MaxSize 10
struct Node{
int data;//数据元素
int next;//下标
}
void testSLinkList()
{
struct Node a[MaxSize];
//......
}
另一种表示方法:
3.说明:
优点:增删操作不需要大量移动元素
缺点:不能随机存取,只能从头结点开始依次往后查找,容量固定不变
适用场景:
1.不支持指针的低级语言
2.数据元素数量固定不变的场景(如操作系统的文件分配表FAT)