双链表基本操作(一)

学习目标:双链表基本操作


学习内容:

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、双链表基础操作代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值