学习目标:双链表基本操作
学习内容:
1、带头结点的双链表指定结点的后插操作
①普通状况:
以下为不完备代码:
bool InsertNextDNode(DNode *p, DNode *s){
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
}
②若p指向链表中的最后一个元素:
可以看到这种情况没有p->next,因此添加一个判断条件。
以下代码为后插完备代码:
bool InsertNextDNode(DNode *p, DNode *s){
if(p==NULL||s==NULL){ //结点是否存在
return false;
}
s->next = p->next;
if(p->next!=NULL){ //在最后一个结点后插入不需要以下操作
p->next->prior = s;
}
s->prior = p;
p->next = s;
return true;
}
注:双链表的插入操作都可以是后插操作!
1. 按位序插入:找到第i-1个结点执行后插操作
2. 指定结点前插操作:根据前指针找到前一个结点执行后插操作
2、 带头指针的双链表删除指定结点的后继结点
①普通情况:
以下为不完备代码:
bool DeletNextDNode(DNode *p){
DNode *q = p->next; //q为要删除的结点,记录下来好free
p->next = q->next;
q->next->prior = p;
free(q);
}
②删除的结点为最后一个:
以下为完备代码
bool DeletNextDNode(DNode *p){
if(p==NULL){ //p为空
return false;
}
DNode *q = p->next;
if(q==NULL){ //p没有后继结点,就没得删
return false;
}
p->next = q->next;
if(q->next != NULL){
q->next->prior = p;
}
free(q);
}
3、 销毁双链表操作:
思路:销毁双链表其实就是一个个的删除结点,可以用到上面的删除结点操作。
bool DestoryList(LinkList &l){
while(l->next!=NULL){ //为什么不是l!=NULL? 因为DeletNextDNode函数删除的是l指向的下一个结点,永远不会删到头结点
DeletNextDNode(l);
}
free(l);
l = NULL;
}
学习时间:
1、2021.5.10 22:00-23:00
学习产出:
1、 数据结构视频2.3.3
2、双链表基础操作代码