2.3.1 双链表的基本操作
1. 双链表的初始化
/**
* 双链表的初始化
* @param L
* @return
*/
bool InitDLinkList(DLinkList &L){
L = (DNode *) malloc(sizeof (DNode));
if (L=NULL){
return false;
}
L->prior = NULL;
L->next = NULL;
return true;
}
判断双链表是否为空
/**
* 判断双链表是否为空
* @param L
* @return
*/
bool isEmpty(DLinkList L){
if (L->next == NULL){
return true;
} else{
return false;
}
}
双链表的插入操作
双链表的后插操作
/**
* 关于双链表的后插操作
* @param p
* @param s
* @return
*/
bool InsertNextDNode(DNode *p, DNode *s) {
if (p == NULL || s == NULL) {
return false;
}
s->next = p->next;
if (p->next != NULL) {
p->next = s->next;
}
s->prior = p;
p->next = s;
return true;
}
双链表的删除
/**
* 删除双链表的p节点的后继节点
* @param p
* @return
*/
bool DeleteNextDNode(DNode *p){
if (p == NULL){
return false;
}
DNode *q = p->next;
if (q == NULL){
return false;
}
p->next = q->next;
if (q->next != NULL){
q->next ->prior = p;
}
free(q);
return true;
}
销毁双链表,并释放各个数据节点
/**
* 销毁数据
* @param L
*/
void DestoryList(DLinkList &L){
while (L->next != NULL){
DeleteNextDNode(L);
}
free(L);
L=NULL;
}
双链表的遍历
略
总结一下
- 双链表
- 初始化
- 头节点的 prior, next 都指向 NULL
- 插入(后插)
- 注意新插入节点、前驱节点、后继节点的指针修改
- 边界情况:新插入节点在最后一个位置需要特殊处理
- 删除(后删)
- 注意删除节点、前驱节点、后继节点的指针修改
- 边界情况:如果删除的节点在最后一个位置需要特殊处理
- 遍历
- 从给定的一个节点开始,后向遍历、前向遍历–循环的终止条件
- 链表不具备随机存储条件,查找操作只能通过顺序遍历实现
- 初始化