广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言类的双向链表详解
  • 936
分享到

C语言类的双向链表详解

2024-04-02 19:04:59 936人浏览 安东尼
摘要

目录前言双向链表的定义双向链表的创建节点的创建双向链表节点查找双向链表的插入双向链表的节点删除双向链表的删除总结前言 链表(linked list)是一种这样的数据结构,其中的各对象

前言

链表(linked list)是一种这样的数据结构,其中的各对象按线性排列。数组的线性顺序是由数组下标决定的,然而于数组不同的是,链表的各顺序是由链表中的指针决定的。

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

双向链表的定义

双链表(doubly linked list)的每一个元素都是一个对象,每一个对象都有一个数据域和两个指针front和tail。对象中还可以包含其他辅助数据。设L为链表的一个元素,L.front指向他在链表中的后继元素,L.tail指向他的前继元素。

我们可以定义一个结构体封装这些数据

typedef struct node
{
	int data;
	struct Node* front;
	struct Node* tail;
}NODE, * LPNODE;

双向链表的创建

c++中,我们以类的形式封装了双向链表。在类中,我们定义了两个指针,一个是指向链表的头部 frontNode,一个是指向了链表的尾部 tailNode,另外我们还加入了 curSize属性,记录节点的个数。在对象创建的过程就是链表创建的过程,我们只需要在类的构造函数中初始化参数即可。

class duplexHead {
public:
	duplexHead() {
		frontNode = NULL;
		tailNode = NULL;
		curSize = 0;
	}
 
	LPNODE createNode(int data);
	LPNODE seachNode(int data);
	void push_front(int data);
	void push_back(int data);
	void push_appoin(int posData, int data);
	void pop_front();
	void pop_back();
	void pop_appoin(int posData);
	void printByFront();
	void printByTail();
 
protected:
 
	LPNODE frontNode;
	LPNODE tailNode;
	int curSize;
 
};

节点的创建

在上面,我们已经知道双向链表的单体长啥样了,我们只需要给他的单体分配空间然后初始化他的参数即可。

LPNODE duplexHead::createNode(int data)
{
	LPNODE newNode = new NODE;
	assert(newNode);
	newNode->front = nullptr;
	newNode->tail = nullptr;
	newNode->data = data;
	return newNode;
}

双向链表节点查找

     链表的查找我们可以定义一个函数LPNODE seachNode(int data),当满足查找条件时,我们就返回当前节点的链表。在实际操作过程中,链表的数据域可能会有多个数据,可能要比较int 类型,可能要比较string类型等多种变化,这是我们可以在参数列表预留一个函数指针 (int)  (*comparData)(LPNODE  data),以应对多种需求。当然,在这里为了演示方便,我们就用一个int 类型的数据代替了。

 
LPNODE duplexHead::seachNode(int data)
{
	if (!curSize)
	{
		printf("链表为空,无法查找");
		return;
	}
	LPNODE preNode = frontNode;
	LPNODE curNode = frontNode;
	while (curNode != NULL && curNode->data != data)
	{
		preNode = curNode;
		curNode = preNode->tail;
	}
	if (curNode == nullptr)
	{
		printf("链表中没有该数据");
		return nullptr;
	}
 
	return curNode;
 
}

双向链表的插入

插入节点,我们分为头部插入和尾部插入以及指定位置插入。而这三种插入,都可分为3步。

(1)创建新节点

(2)找到插入位置

(3)插入

我们就以制定位置插入为例,如图所示,我们只需把原来相连的两个节点断开,然后再分别用指针拼接起来,当然我们也可以调用我们的seachNode来查找位置,这样就更方便一些了。

void duplexHead::push_appoin(int posData, int data)
{
 
	if (curSize == 0)
		return;
	if (frontNode->data == posData)
	{
		push_front(data);
	}
	else
	{
		LPNODE preNode = frontNode;
		LPNODE curNode = frontNode;
		while (curNode != NULL && curNode->data != posData)
		{
			preNode = curNode;
			curNode = preNode->tail;
		}
		if (curNode == NULL)
		{
			printf("未找到指定位置,无法插入!\n");
		}
		else
		{
			LPNODE newNode = createNode(data);
			preNode->tail = newNode;
			newNode->tail = curNode;
			curNode->front = newNode;
			newNode->front = preNode;
			curSize++;
		}
	}
}

双向链表的节点删除

删除节点我们也可以分为头部删除,尾部删除,指定数据删除。他与插入节点几乎是一样的

(1)找到删除位置

(2)删除

我们就以指定数据删除为例,我们通过while或者seachNode来查找到要删除的节点,然后把他的front 指向的位置和tail指向的位置记住,就可以直接删除节点了。删除完了节点要记得把前后段的链表连接上即可。

 
void duplexHead::pop_appoin(int posData)
{
	if (frontNode == NULL || curSize == 0)
	{
		printf("链表为空无法删除!");
		return;
	}
	if (frontNode->data == posData)
	{
		pop_front();
		return;
	}
	LPNODE preNode = frontNode;
	LPNODE curNode = frontNode;
	while (curNode != NULL && curNode->data != posData)
	{
		preNode = curNode;
		curNode = preNode->tail;
	}
	if (curNode == NULL)
	{
		printf("未找到指定位置无法删除!\n");
	}
	else
	{
		if (tailNode == curNode)
		{
			pop_back();
		}
		else
		{
			preNode->tail = curNode->tail;
			//curNode->tail是不是不空
			//当删除的表尾时候,curNode->tail等于空
			curNode->tail->front = preNode;
			free(curNode);
			curNode = NULL;
			curSize--;
		}
	}
}

双向链表的删除

于双向链表的创建一样,我们可以把双向链表的删除放在析构函数中,实现创建和删除自动化,当对象被创建,双向链表就被创建,当对象消亡,双向链表就删除了。

duplexHead::~duplexHead()
{
	if (!frontNode)return;
	LPNODE pmove ;
	
 
	while (!pmove)
	{
		pmove = frontNode->tail;
		delete frontNode->tail;
		frontNode = pmove;
	}
 
}

总结

到此这篇关于C语言类的双向链表详解的文章就介绍到这了,更多相关C语言双向链表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言类的双向链表详解

本文链接: https://www.lsjlt.com/news/162813.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言类的双向链表详解
    目录前言双向链表的定义双向链表的创建节点的创建双向链表节点查找双向链表的插入双向链表的节点删除双向链表的删除总结前言 链表(linked list)是一种这样的数据结构,其中的各对象...
    99+
    2022-11-12
  • C语言超详细i讲解双向链表
    目录一、双向链表的概念二、双向链表的实现三、链表与顺序表的差别四、链表oj总结一、双向链表的概念 1、概念:概念:双向链表是每个结点除后继指针外还有⼀个前驱指针。双向链表也有带头结点...
    99+
    2022-11-13
  • C语言算法学习之双向链表详解
    目录一、练习题目二、算法思路1、设计浏览器历史记录2、扁平化多级双向链表3、展平多级双向链表4、二叉搜索树与双向链表一、练习题目 题目链接难度1472. 设计浏览器历史记录★★★☆☆...
    99+
    2022-11-13
  • 详解C语言中双向循环链表的实现
    目录实现细节辅助理解图具体实现代码1、对链表进行初始化2、任意位置前的插入3、任意位置的删除4、头插和尾删完整代码头文件具体函数测试实现细节 1、带一个哨兵位(哨兵节点,初始节点,不...
    99+
    2022-11-13
  • C语言线性表之双链表详解
    目录定义1.删除2.插入3.建立4.查找总结定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,每一个结点包含两个域:存放数据元素信息的域称为数据域,存放其后继元素地址的域称...
    99+
    2022-11-13
  • C语言如何实现双向链表和双向循环链表
    本文小编为大家详细介绍“C语言如何实现双向链表和双向循环链表”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言如何实现双向链表和双向循环链表”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。双向链表和双向循环链表...
    99+
    2023-06-16
  • C语言超详细讲解双向带头循环链表
    目录一、双向带头循环链表的结构二、双向带头循环链表的函数接口1. 申请结点2. 初识化3. 打印4. 尾插尾删5. 头插头删6. 查找7. 中间插入和删除8. 判空及求链表长度9. ...
    99+
    2023-02-14
    C语言双向带头循环链表 C语言带头循环链表 C语言循环链表
  • C语言如何实现双向链表
    本篇内容介绍了“C语言如何实现双向链表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!双向链表的基本操作    ...
    99+
    2023-06-16
  • C语言详解如何实现带头双向循环链表
    目录创建链表存储结构创建结点链表的初始化双向链表的打印双向链表尾插双向链表尾删双向链表头插双向链表头删双向链表查找双向链表pos前插入结点双向链表删除pos位置的结点双向链表的销毁顺...
    99+
    2022-11-13
  • C++ 双向循环链表类模版实例详解
    目录1.插入某个节点流程2.构造函数修改3.重新实现append和prepend函数4.修改迭代器类5.LinkedList.h代码如下6.测试运行总结在上章C++图解单向链表类模板...
    99+
    2022-11-13
  • C语言实现带头双向循环链表
    目录前言1. 创建结构体2.malloc新节点3.创建哨兵位节点4.尾插5.打印6.尾删7.头插8.在指定位置pos的前面进行插入9. 删除指定位置pos节点10.销毁链表前言 在...
    99+
    2022-11-13
  • C语言实现带头双向环形链表
    双向循环链表 上一次我们讲了单向无头非循环链表的实现,单向无头非循环链表的特点是:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构。而带头双向循环链表则恰恰与无...
    99+
    2022-11-12
  • c语言如何创建双向循环链表
    要创建一个双向循环链表,你可以按照以下步骤进行:1. 首先,定义一个节点结构体,包含一个数据域和两个指针域,分别指向前一个节点和后一...
    99+
    2023-08-25
    c语言
  • C语言数据结构之双链表&循环链表&静态链表详解
    目录单链表 VS 双链表双链表双链表的初始化(带头结点)双链表的插入双链表的删除双链表的遍历循环单链表循环双链表循环双链表的初始化循环双链表的插入循环双链表的删除静态链表什么是静态链...
    99+
    2022-11-13
  • C语言链表与单链表详解
    链表是什么及链表的优势 链表是一种介于数组的另外一种数据结构: 我们知道数组可以存放很多的元素,这些元素都是呈线性排列,也就是一个挨着一个连续存放 但是当元素足够多时,还能继续正常的...
    99+
    2022-11-13
  • C语言双向链表的原理与使用操作
    目录一.引入二.双向链表的定义三.双向链表与单链表对比3.1图示对比3.2代码对比四.双向链表的操作4.1双向链表的创建4.2双向链表的插入4.3双向链表的删除4.4双向链表的销毁五...
    99+
    2022-11-13
  • C语言超详细讲解数据结构中双向带头循环链表
    目录一、概念二、必备工作2.1、创建双向链表结构2.2、初始化链表2.3、动态申请节点2.4、打印链表2.5、销毁链表三、主要功能3.1、在pos节点前插入数据尾插头插3.2、删除p...
    99+
    2022-11-13
  • C语言编程数据结构带头双向循环链表全面详解
    目录前言一、什么是带头循环双向链表二、链表初始化三、链表接口函数1.尾插2.头插3.头删4.尾删5.任意位置插入数据6.任意位置删除数据四、打印链表总结前言 上一篇数据结构专栏:C语...
    99+
    2022-11-12
  • 详解C语言之单链表
    目录一、思路步骤1. 定义结构体2.初始化3.求当前数据元素的个数4.插入5.删除6.释放内存空间二、代码总结 一、思路步骤 1. 定义结构体 a.数据域:用来存放数据 b.指针域...
    99+
    2022-11-12
  • C语言实现带头双向循环链表的接口
    本文实例为大家分享了C语言实现带头双向循环链表的接口,供大家参考,具体内容如下 各函数功能如下 申请空间 ListNode* BuyListNode(LTDataType x) ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作