王道数据结构C语言双链表基本操作实现

本文介绍了如何使用C语言实现双链表的数据结构,包括定义数据类型、初始化链表、判断链表是否为空、在节点后插入新节点以及删除节点的基本操作。
摘要由CSDN通过智能技术生成


一、定义

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
typedef struct {//双链表结点类型
	int data;//数据域
	DNode* prior;//前驱
	DNode* 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;
}

三、判空

//双链表判空
//就看它的头结点的next是否为空就行
bool Empty(DLinkList L) {
	if (L->next == NULL) {
		return true;
	}
	else {
		return false;
	}
}

四、插入

给p结点和s结点,要求在p之后插入s

对于双链表插入有个口诀:先右边再左边,先连后断
就是先把s和右边的结点全处理完
再处理s和左边的结点(p)

示意图如下:
先处理右边
第一步:先连
在这里插入图片描述
第二步:后断
在这里插入图片描述
再处理左边
第三步:先连
在这里插入图片描述

第四步:后断
在这里插入图片描述
上面步骤也不唯一,但是也不是任意的,必须保证第12步在第4步之前执行
如果只是简单实现,就用我上面的口诀:先右边再左边,先连后断

//插入
//在p结点后插入s结点
bool InsertNextDNode(DNode* p, DNode* s) {
	if (p == NULL || s == NULL) {//非法参数
		return false;
	}
	//先处理右边
	//先连
	s->next = p->next;
	//后断
	if (p->next != NULL) {
		//这里优化一下,防止p后面没有结点是NULL,那你插了s之后,NULL是不需要指向s的
		p->next->prior = s;
	}
	//再处理左边
	//先连
	s->prior = p;
	//后断
	p->next = s;
	return true;
}

五、删除

给结点p,让你删它的后继结点q
这个和单链表删除大差不差,都挺简单的

在这里插入图片描述
先让p连上q的后继结点
在这里插入图片描述
然后q后继结点的前驱连上p
在这里插入图片描述
最后把q释放掉就完了
在这里插入图片描述

bool DeleteNextDNode(DNode* p) {//给p,删它后面一个结点
	if (p == NULL) {//非法输入
		return false;
	}
	DNode* q = p->next;
	if (q == NULL) {//p后面没有结点
		return false;
	}
	p->next = q->next;
	if (q->next != NULL) {//如果q后面没结点,就不用往前连了
		q->next->priro = p;
	}
	free(q);
	return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

劲夫学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值