王道考研408 | 数据结构 | 双链表实验代码

该博客详细介绍了C++中双链表的实现,包括初始化、判断链表为空、按位和按值查找、插入节点(后插、前插和按位插入)、删除节点、销毁链表以及建立链表(头插法和尾插法)。此外,还提供了计算链表长度和输出链表内容的辅助函数,并展示了主函数的测试用例。
摘要由CSDN通过智能技术生成

实验环境:

vscode 2022 社区版
vscode 2022 社区版的搭建:
https://blog.csdn.net/lijiamingccc/article/details/123552207

== 所有代码均经过测试,附运行结果截图==

1.初始化双链表

bool InitDLinkList(DLinkList &L){
	L = (DNode *)malloc(sizeof(DNode));
	if (L==NULL){
		return false;
	}
	L->prior = NULL;
	L->next = NULL;
	return true;
}

2. 判空

bool empty(DLinkList L){
	if (L->next == NULL){
		return true;
	}
	return false;
}

3. 查找

3.1 按位查找

DNode* GetElem(DLinkList L,int i){
	if(i<0) return NULL;
	int j = 1;
	DNode *p = L;
	while(p!=NULL && j<=i){
		p = p->next;
		j++;
	}
	return p;
}

3.2 按值查找

DNode* LocateElem(DLinkList L,ElemType e){
	DNode *p = L;
	if (p==NULL) return NULL;
	p = p->next;
	while (p != NULL && p->data !=e){
		p=p->next;
	}
	return p;
}

4.插入

4.1 后插值是e的节点

bool Insert_NextDNode(DNode* p, ElemType e){
	if (p == NULL) return false;
	DNode* q = (DNode*)malloc(sizeof(DNode));
	if (q == NULL) return false;
	q->data =e;
	q->next = NULL;
	q->prior = p;
	if(p->next != NULL){
		p->next->prior = q;
		q->next = p->next;
	}
	p->next = q;
	return true;
}

4.2 后插节点s

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;
}

4.3 前插节点s

// 前插,在p节点前插入节点s
bool InsertPriorDNode(DNode* p, DNode* s){
	// 在p节点的前节点后插一个节点,即在p节点前插入节点s
	if(p->prior != NULL){
		return InsertNextDNode(p->prior, s);
	}
	return false;
}

4.4 按位插入

// 按位插入,在第i个位置插入值为e的节点(位序i)
bool InsertDLinkList(DLinkList &L, int i, ElemType e) {
	if (i <= 0) return false;
	// 这里调用GetElem 
	DNode *p = GetElem(L, i);
	return Insert_NextDNode(p, e);
}

5. 删除节点

5.1 删除p节点的后继节点

bool DeleteNextNode(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;
}

5.2 删除指定节点

//删除指定节点s
bool DeleteNode(DNode *s) {
	DNode *p = s->prior;
	p->next = s->next;
	if (s->next != NULL) {
		s->next->prior = p;
	}
	free(s);
	return true;
}

6. 销毁双链表

bool DestoryList(DLinkList& L) {
	while (L->next != NULL) {
		DeleteNextNode(L);
	}
	free(L);
	L = NULL;
	return true;
}

7.建立双链表

7.1 头插法

DLinkList List_HeadInsert(DLinkList& L) {
	InitDLinkList(L);
	ElemType x;
	printf("正在使用头插法建立双链表:\n");
	while (x!=9999) {
		scanf("%d",&x);
		if(x==9999) break;
		Insert_NextDNode(L, x);
	}
	return L;
}

7.2 尾插法

DLinkList List_TailInsert(DLinkList &L) {
	InitDLinkList(L);
	DNode *p = L;
	ElemType x;
	printf("正在使用尾插法建立双链表:\n");
	while (x!=9999) {
		scanf("%d",&x);
		if(x==9999) break;
		Insert_NextDNode(p, x);
		p = p->next;
	}
	return L;
}

8. 计算长度

int Length(DLinkList L) {
	DNode *p = L;
	int len = 0;
	while (p->next != NULL) {
		len++;
		p = p->next;
	}
	return len;
}

tip:自定义一个输出函数

void print(DLinkList L) {
	printf("当前列表:  ");
	DNode *s = L;
	while (s->next!=NULL) {
		s = s->next;
		printf("%d  ",s->data);
	}
	printf("\n");
}

9. 测试主函数

int main(){
	DLinkList L;
	List_TailInsert(L);
	print(L);
	
	// 按位查找和长度测试
	printf("\n链表的第3个元素是%d\n",GetElem(L, 3)->data);
	printf("链表的长度是%d\n",Length(L));
	
	// 插入测试
	printf("在位序1的位置上插入22");
	InsertDLinkList(L, 1, 22);
	print(L);
	
	// 删除测试     
	int e;
	printf("删除位序3的位置上的元素\n");
	ListDelete(L, 3, e);
	print(L);
	
	// 销毁链表 测试
	DestoryList(L);
	return 0;
}

最后 主函数测试运行截图

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

代码魔法师!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值