数据结构 第三章 线性表(三)

本文详细介绍了双链表的数据结构,包括其特点和为什么引入双链表。讲解了如何初始化双链表,进行节点的插入、打印以及删除操作,并提供了相应的C++代码示例。
摘要由CSDN通过智能技术生成

 

🚀 写在最前:在前面学习了单链表的基本操作,这篇文章学习双链表,以及双链表的一些基本操作

🚀:求个关注😀,让我们一起探索计算机的奥秘!

一、双链表

双链表一个节点含有两个指针域,前指针域指向前一个节点,后一个指针域指向后一个节点;那为什么有了单链表还需要双链表呢?因为单链表它很难找到当前节点的前一个节点,是为了方便找到当前节点的前一个节点,所以引入了双链表。双链表的示意图如下图所示。

二、双链表的基本操作

文件结构:

文件结构如下,建有DLinkList.h,用于定义数据结构以及函;DLinkList.cpp用于实现函数的功能;test.cpp用于测试实现的函数是否好用。

①双链表的初始化

DLinkList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>

typedef int EelentType;

typedef struct DLNode {
	EelentType data;
	DLNode* prior;       //前指针,头节点的前指针始终为空
	DLNode* next;        //后指针
}DLNode,*DLinkList;


//定义数据结构操作

//初始化双链表
bool InitDlinkList(DLinkList& L);

DLinkList.cpp

#include"DLinkList.h"

//初始化双链表
bool InitDlinkList(DLinkList& L) {
	L = (DLNode*)malloc(sizeof(DLNode));
	if (L == NULL) {
		printf("空间申请失败导致双链表初始化失败\n");
		return false;
	}
	else {
		L->next = NULL;
		L->prior = NULL;
		return true;
	}
}

test.cpp

#include"DLinkList.h"

int main() {
	DLinkList L1 = NULL;
	
	//初始化L1链表
	if (InitDlinkList(L1)) {
		printf("初始化成功!\n");
	}

	return 0;
}

out:

初始化成功!

D:\C_WorkSpace\DLinkList\x64\Debug\DLinkList.exe (进程 24384)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

②双链表的插入操作

DLinkList.h

//双链表的插入操作
bool DLinkListInsert(DLinkList L, int i, EelmentType e);

DLinkList.cpp 

//双链表的插入操作
bool DLinkListInsert(DLinkList L, int i, EelmentType e) {
	//申请新的节点
	DLNode* tmp = (DLNode*)malloc(sizeof(DLNode));
	if (tmp == NULL) {
		printf("空间申请失败导致插入失败\n");
		return false;
	}
	else {
		DLNode* p = L;   //指向节点的指针
		int j = 0;       //定位p指向哪个节点
		while (p != NULL && j < i - 1) {
			p = p->next;
			j++;
		}
		if (p == NULL) {
			printf("插入位置不合法\n");
			return false;
		}
		else {
			tmp->data = e;
			tmp->next = p->next;
			if (p->next!= NULL) {   //这步判断是为了防止是尾插p->next->prior是空指针
				p->next->prior = tmp;
			}
			tmp->prior = p;
			p->next = tmp;
			return true;
		}
	}
}

test.cpp

#include"DLinkList.h"

int main() {
	DLinkList L1 = NULL;
	
	//初始化L1链表
	if (InitDlinkList(L1)) {
		printf("初始化成功!\n");
	}
	DLinkListInsert(L1, 1, 1);
	DLinkListInsert(L1, 2, 2);
	DLinkListInsert(L1, 1, 6);
	printf("位置1上的元素为:%d\n", L1->next->data);
	printf("位置2上的元素为:%d\n", L1->next->next->data);
	printf("位置3上的元素为:%d\n", L1->next->next->next->data);
	return 0;
}

out:
初始化成功!
位置1上的元素为:6
位置2上的元素为:1
位置3上的元素为:2

D:\C_WorkSpace\DLinkList\x64\Debug\DLinkList.exe (进程 19616)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

双链表的打印

DLinkList.h

//双链表的打印
void DLinkListPrint(DLinkList L);

DLinkList.cpp

//双链表的打印
void DLinkListPrint(DLinkList L) {
	if (L->next == NULL) {
		printf("该双双链表为空\n");
		exit;
	}
	else {
		DLNode* p = L->next;
		while (p != NULL) {
			printf("%d<----->", p->data);
			p = p->next;
		}
		printf("\n");
	}
}

test.cpp

#include"DLinkList.h"

int main() {
	DLinkList L1 = NULL;
	
	//初始化L1链表
	if (InitDlinkList(L1)) {
		printf("初始化成功!\n");
	}
	DLinkListInsert(L1, 1, 1);
	DLinkListInsert(L1, 2, 2);
	DLinkListInsert(L1, 1, 6);
	DLinkListPrint(L1);

	return 0;
}

out:
初始化成功!
6<----->1<----->2<----->

D:\C_WorkSpace\DLinkList\x64\Debug\DLinkList.exe (进程 5992)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

④双链表的删除

DLinkList.h

//双链表的删除
bool DLinkListDelete(DLinkList L, int i);

DLinkList.cpp

//双链表的删除
bool DLinkListDelete(DLinkList L, int i) {
	DLNode* p = L;   //使用tmp指向节点
	int j = 0;         //使用j表示指向哪个节点
	while (p != NULL && j < i - 1) {
		p = p->next;
		j++;
	}
	if (p->next == NULL || p == NULL) {
		printf("删除位置不合法\n");
		return false;
	}
	DLNode* temp = p->next;
	p->next = temp->next;
	if (temp->next != NULL) {  //这步判断是为了防止是删除的是最后一个元素
		temp->next->prior = temp->prior;
	}
	free(temp);
}

test.cpp

#include"DLinkList.h"

int main() {
	DLinkList L1 = NULL;
	
	//初始化L1链表
	if (InitDlinkList(L1)) {
		printf("初始化成功!\n");
	}
	DLinkListInsert(L1, 1, 1);
	DLinkListInsert(L1, 2, 2);
	DLinkListInsert(L1, 1, 6);
	DLinkListPrint(L1);         //6 < ----->1 < ----->2 < ----->
	
	DLinkListDelete(L1, 3);
	DLinkListPrint(L1);         //6 < ----->1 < ----->
	
	DLinkListInsert(L1, 1, 17);
	DLinkListDelete(L1, 2);
	DLinkListPrint(L1);         //17 < ----->1 < ----->
	return 0;
}

out:

初始化成功!
6<----->1<----->2<----->
6<----->1<----->
17<----->1<----->

D:\C_WorkSpace\DLinkList\x64\Debug\DLinkList.exe (进程 7084)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值