知识点
一、单链表和双链表的区别:
- 单链表:无法逆向检索,有时候不方便
- 双链表:可进可退,存储密度更低
二、双链表的初始化
双向链表创建的过程中,每一个结点需要初始化数据域和两个指针域,一个指向直接前趋结点,另一个指向直接后继结点。
bool InitDLinkList(DLinklise &L){
L = (DNode *) malloc (sizeof(DNode)); //分配一个头结点
if(L == NULL) //如果内存不足,分配失败
return false;
L -> prior = NULL; //头结点的prior永远指向NULL
l -> next = NULL; //头结点之后暂时没有节点
return turn;
}
typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
}DNode,*DLinklist;
void testDLinkList (){ //判断双链表是否为空
//初始化双链表
DLinkList L;
InitDLinkList(L);
}
bool Empty(DLinklist L){
if(L -> next == NULL)
return true;
else
return false;
}
三、双链表的插入
一般双链表的插入都有两个指针,一个指向中的一个结点(就是要插入的位置设为p指针),可以在这个结点的前面也可以在这个结点的后面插入。有一个结点指向要插入的结点
//双链表的插入
//在p节点之后插入s节点
bool InserNextDNode(DNode *p,DNode *s){
if(p == NULL || s == NULL) //非法参数
return false;
s -> next = p -> next;
if(p -> next != NULL) //if(p节点有后继节点)
p -> next -> prior = s;
s -> prior = p;
p -> next = s;
}
四、双链表的删除
双链表(双向链表)知道要删除某一节点p时,获取其前驱节点q的方式为 q = p->prior,不必再进行遍历。
//双链表的删除
void DestoryList(DLinklist &L){
//循环释放各个数据节点
while(L -> != NULL)
DeleteNextDNode(L);
free(L); //释放头结点
L = NULL; //头指针指向NULL
}
bool DeleteNextDNode(DNode *p){
if(p == NULL)
return false;
DNode *p = p -> next; //找到p的后继节点q
if(q == NULL) //p没有后继
return false;
p -> next = q -> next;
if(q -> next != NULL) //q结点不是最后一个结点
q -> next -> prior = p;
free(q); //释放结点空间
return true;
}