双链表初始化插入删除遍历等操作的分析(C语言)

Posted bfhonor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双链表初始化插入删除遍历等操作的分析(C语言)相关的知识,希望对你有一定的参考价值。

一、双链表初始化、插入、删除、遍历等操作的分析

1. 单链表 VS 双链表

在这里插入图片描述
在这里插入图片描述

2. 双链表的初始化(带头结点)

  • DLinklist:强调是一个链表。
  • DNode *:强调是一个结点。
    在这里插入图片描述
typedef struct DNode{
	ElemType data;
	struct DNode *prior,*next;
}DNode, *DLinklist;

//初始化双链表
bool InitDLinkList(DLinklist &L){
	L = (DNode *)malloc(sizeof(DNode));//分配一个头结点
	if(L == NULL)		//内存不足,分配失败
		return false;
	L -> prior = NULL;	//头结点的prior永远指向NULL
	L -> next = NULL;	//头结点之后暂时还没有结点
	return true;
}

//判断双链表是否为空(带头结点)
bool Empty(DLinklist L){
	if(L -> next == NULL)
		return true;
	else
		return false;
}

void testDLinkList(){
	//初始化双链表
	DLinklist L;
	InitDLinkList(L);
	//后续代码....
}

3. 双链表的插入

在这里插入图片描述

//在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;
}![在这里插入图片描述](https://img-blog.csdnimg.cn/20210426210730958.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0MDk2Njcw,size_16,color_FFFFFF,t_70)

在这里插入图片描述
在这里插入图片描述

4. 双链表的删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//删除p结点的后继节点
bool DeleteNextDNode(DNode *p){
	if(p == NULL)	return false;
	DNode *q = p -> next;	//找到p的后继节点q
	if(q == NULL) 	return false;	//p没有后继
	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)
		DeleteNextDNode(L);
	free(L);	//释放头结点
	L = NULL;	//头指针指向NULL
}

5. 双链表的遍历

  • 后向遍历
while (p!=NULL){
	//对结点p做相应处理,如打印
	p = p->next;
}
  • 前向遍历
while (p!=NULL){
	//对结点p做相应处理
	p = p->prior;
}
  • 前向遍历(跳过头结点)
while (p-> prior != NULL){
	//对结点p做相应处理
	p = p->prior;
}
  • 双链表不可随机存取,按位查找、按值查找操作都只能用遍历的方式实现。
  • 时间复杂度 O(n)

以上是关于双链表初始化插入删除遍历等操作的分析(C语言)的主要内容,如果未能解决你的问题,请参考以下文章

双链表 | | 初始化插入删除遍历

基础数据结构---双链表go语言的代码实现

基础数据结构---双链表go语言的代码实现

一篇解双链表(0基础看)(C语言)《数据结构与算法》

循环链表(循环单链表循环双链表)的相关操作的代码实现(C语言)

有序的双链表的实现