双向链表之C++实现

双向链表的C++实现 双向链表的C++实现           双向链表与单向链表相比,各个结点多了一个指向前一个结点的指针。结构如图所示:           双向链表的结点定义如下: #ifndef SIMPLENODE_HPP #define SIMPLENODE_HPP template //再定义一个模板 写双链表 class DoubleNode { public: 阅读详情

          双向链表只是在单向链表的基础上增加了一条前向链,其中的很多处理方法都是相似的。比如

求链表长、寻找某一节点等。所有相似的部分就不一一实现了。有兴趣可以参考前面的博文。

       以下我实现的双向链表(VC6下实现)。错误之处还请指正。

1、代码组织

 

2、dll.h双链表及节点的说明

#ifndef _DLL_H_
#define _DLL_H_

#define dataType int
#define endOfData 0

class node
{
public:
	dataType data;    //节点数据
	node *next;       //后向指针(离尾节点近)
	node *pre;        //前向指针(离head近)
};

class dll
{
public:
	dll();
	~dll();
	void create();                      //构造双向链表
	void print();                       //打印链表
	bool insert(int pos,dataType num);  //在位置pos插入num节点.插入完成返回true,否则返回false
	void del(dataType num);             //删除链表中所有的num节点

private:
	int getLength();                    //获取链表包含的节点数目
	node *head;                         //链表头指针
};

#endif

 

3、dll.cpp双链表类函数

#include <iostream>
#include "dll.h"
using namespace std;

dll::dll()
{
	head = NULL;
}

dll::~dll()
{
	node *ptrNode = head;
	node *ptrNodeTmp = NULL;

	while(ptrNode != NULL)
	{
		ptrNodeTmp =ptrNode->next;
		delete ptrNode;
		ptrNode = ptrNodeTmp;
	}
}

void dll::create()
{
	//第一个节点
	node *ptrNode = new node;
	ptrNode->pre = NULL;
	ptrNode->data = endOfData;
	head = ptrNode;

	bool firstNode = true;      //是否是第一个节点
	dataType num = endOfData;

	while(1)
	{
		cout<<"请输入一个节点数据: ";
		cin>>num;

		if(num == endOfData)
		{
			ptrNode->next = NULL;
			break;
		}

		if(firstNode == false)         //以后的节点都需要new node
		{
			node *ptrNodeTmp = new node;
			ptrNodeTmp->data = num;
			ptrNode->next = ptrNodeTmp;
			ptrNodeTmp->pre = ptrNode;
			ptrNode = ptrNodeTmp;
		}

		if(firstNode == true)         //第一个不需要new node
		{
			ptrNode->data = num;
			firstNode = false;
		}
	}

	if(head->data == endOfData)       //链表中并无数据,需要将第一个节点删除
	{
		delete head;
		head = NULL;
	}
}

void dll::print()
{
	node *ptrNode = head;

	while(ptrNode != NULL)
	{
		cout<<ptrNode->data<<" ";
		ptrNode = ptrNode->next;
	}
	cout<<endl;
}

int dll::getLength()
{
	node *ptrNode = head;
	int num = 0;

	while(ptrNode != NULL)
	{
		num++;
		ptrNode = ptrNode->next;
	}

	return num;
}

bool dll::insert(int pos,dataType num)
{
	if(pos < 0 || pos >= getLength())   //插入的pos不正确(0-getLength()-1)
	{
		return false;
	}

	//找到待插入pos的指针和后一个指针
	node *ptrNodeAhead = head;
	node *ptrNodeFellow = NULL;
	int count = 0;
	while(1)
	{
		if(count++ == pos) break;

		ptrNodeFellow = ptrNodeAhead;
		ptrNodeAhead = ptrNodeAhead->next;
	}

	node *ptr = new node;
	ptr->data = num;
	ptr->pre = ptrNodeFellow;
	ptr->next = ptrNodeAhead;
	if(ptrNodeFellow != NULL)      //不是插入头节点
	{
		ptrNodeFellow->next = ptr;
	}
	else                           //插入头节点,head要改变
	{
		head = ptr;
	}
	ptrNodeAhead->pre = ptr;

	return true;
}

void dll::del(dataType num)
{
	node *ptrNodeAhead = head;    //ptrNodeAhead指向待删除的节点
	node *ptrNodeFellow = NULL;   //ptrNodeFellow指向待删除节点的前一节点(离head近的节点)

	while(ptrNodeAhead != NULL)
	{
		while(ptrNodeAhead->data != num && ptrNodeAhead->next != NULL)  //找到num节点或是搜索结束
		{
			ptrNodeFellow = ptrNodeAhead;
			ptrNodeAhead = ptrNodeAhead->next;
		}

		if(ptrNodeAhead->data == num)          //找到num节点
		{
			node *ptrNode = ptrNodeAhead->next;
			
			if(ptrNodeAhead != head)            //不是删除头节点
			{
				ptrNodeFellow->next = ptrNode;
			}
			else                                //删除头结点要注意head指针的赋值
			{
				head = ptrNodeAhead->next;
			}
			if(ptrNodeAhead->next != NULL)       //不是删除尾节点
			{
				ptrNode->pre = ptrNodeFellow;
			}

			delete ptrNodeAhead;                 //释放num节点

			ptrNodeAhead = ptrNode;
		}
		else                                     //搜索结束
		{
			ptrNodeAhead = NULL;
		}
	}
}


4、mian.cpp测试文件

#include <iostream>
#include "dll.h"
using namespace std;

int main()
{
	dll exp;

	//构建链表并打印
	exp.create();
	exp.print();

	//在位置2插入99999并打印
	exp.insert(2,99999);
	exp.print();
	
	//删除位置2的节点并打印
	exp.del(2);
	exp.print();

	return 0;
}
双向链表+迭代器的C++实现 双向链表的概述 写链表首先要对链表的构成有一个很好的了解,那么完成一个链表我们需要完成什么呢? 节点的定义 对于双向链表,每一个节点都与其前驱、后继的连接,那么这个链接我们通过指向节点的指针来完成。指向节点的指针在解引用之后就是一个节点对象。 方法的定义 双向链表因为具有头与尾,所以需要实现的方法有: 在末尾插入,删除元素 在链表首部插入、删除元素 可以像访问数组元素一样使用[]运算符对... 阅读详情

相关推荐

C++实现双向链表深入解析

双向链表是一种复杂的数据结构,它的每个节点都包含两个指针,分别指向它的前一个节点和后一个节点。这种特性使得双向链表在插入和删除节点时比单向链表更加灵活高效。在双向链表中,节点是构成整个链表的基石。一个标准的双向链表节点通常包含数据域和两个指针域,分别指向其前驱节点和后继节点。以下是一个典型的双向链表节点的C++实现:int data;// 数据域,存储节点的值Node* prev;// 指针域,指向当前节点的前驱节点Node* next;// 指针域,指向当前节点的后继节点数据域data。

weixin_36047538的博客 695

C语言——双向链表

本文介绍双向链表适配双向遍历、频繁删除已知节点的典型应用场景,梳理其指针维护、边界判断相关的高频错误及避坑方案,指出该结构以少量空间换双向遍历和O(1)删已知节点的核心优势,强调其操作本质是合理维护prev和next指针,掌握核心要点后可拓展学习循环双向链表、LRU缓存等进阶应用。

m0_68447088的博客 1144

VC++模板双向链表演示代码

该示例使用VS2013编写,其中DoubleDIRList为数据元素类,DoubleDIRListContainer为自己手写实现的双向链表类,DequeForListContainer为使用Deque实现的双向链表类

[C++] list双向链表使用方法

双向链表有专门的头文件# include <list> // 当然如果你用<bits/stdc++.h>的话就也无所谓了忽然想到一件事情, 不会有人不知道是什么吧?传送!双向链表这样定义// type: 链表每个元素的数据类型// name: 链表名// 下面是一个例子:// 后面讲操作的时候就以ls为例。

t54SB的博客 708

用VC++实现的单向和双向链表

用面向对象的C++语言编写的单向和双向链表,可在VC++ 6。0或更高版本平台下运行,是学习数据结构的很好代码。

VC++双向循环链表

摘要:VC/C++源码,其它分类,双向链表 VC++双向循环链表,实现功能:创建新链表、添加新节点;链表数据排序、输入链表信息;查找和删除链表数据、清屏、清空链表等,如果你对VC++的双向循环链表不太熟悉,这个例子对你的是比较有用的。 运行环境:Windows/Visual C/C++

C语言实现双向链表

本章使用C语言实现了数据结构中的双向链表,对于数据结构的初学者来说有一定难度,但对于提升对链表的理解来说意义非凡,值得我们亲自去实现。

2401_86557724的博客 2720

给粒子物理萌新的Geant4保姆级入门:从看懂B1示例代码到跑通第一个模拟

本文为粒子物理初学者提供Geant4的保姆级入门指南,从解析B1示例代码到跑通第一个模拟。详细介绍了环境准备、代码解析、可视化系统实战及扩展模拟的方法,帮助新手快速掌握Geant4的基本概念和工具包使用。

weixin_29231725的博客 500

双向链表的基本操作

#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; struct node { int num; struct node * next; }; typedef struct node Node; typedef Node * Link; //释放节点 void Release(Link * head) { Li...

weixin_43809546的博客 203

Unable to negotiate with XXXX port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

打开ssh_config此文件,滑动到最下面,新增自己git主机地址(这里我直接默认*)执行命令 git clone git@xxxxxxxxxxxxx.git。代码仓库已经添加了ssh公钥之后,克隆代码到本地时就报了这个问题。首先是找到git安装目录(根据自己安装时选项,找到这个目录)再进入ssh目录,找到 ssh_config 配置文件。配置完成后,保存配置文件后再次去clone代码。直接复制下面这一段到文件中最底部位置即可。然后进入 etc目录,找到ssh目录。终于可以克隆下来了。

萌兔兔MMQ!! 3358

Oracle EBS R12.2 安装 -- Step by Step

Oracle EBS R12.2 安装 -- Step by Step

Albert Tan DBA之路 1514

双向循环链表(C++实现)

双向循环链表内容整理

st66688的博客 3539

3.6KW储能双向逆变器(原理图PCB源码)

通过百度网盘分享的文件:优快云 3.6KW储能双向逆变器 链接:https://pan.baidu.com/s/18NN6KnpywFUIDtAQ4b1LTg?pwd=csdn 提取码:csdn

2401_86562087的博客 2186

C++语言实现双向链表

这篇文章是关于利用C++模板的方式实现的双向链表以及双向链表的基本操作,在之前的博文C语言实现双向链表中,已经给大家分析了双向链表的结构,并以图示的方式给大家解释了双向链表的基本操作。本篇文章利用C++实现了双向链表的基本操作,其中包括: 双向链表的基本操作C++语言实现 头部插入结点建立链表 尾部插入结点建立链表 实现指定位置插入结点 查找给定数值是否存在 删除指定位置的结点 修改指定位置的...

BeiXi's Blog 1215

ArcGIS插值可视化气象数据

前言 地图底图的制作和气象数据的预处理见我上两篇博客 ArcGIS精美中国地图制作(详解) python处理日值气象数据 在前面我们已经将日值的地温数据处理成了年均地温,添加了站点经纬度坐标并导出为excel格式。 得到如下数据: 导入数据 在Arcmap中 文件-添加XY数据 将年均地温和站点位置数据导入。 注意:excel表格的格式要另存为97-2003工作簿形式,否则会有"arcgi...

江北20190411的博客 2万+

V93000 SmarTest 8入门:从零搭建你的第一个半导体测试程序

半导体测试是芯片从设计走向量产的关键环节,而ATE(自动化测试设备)正是支撑这一环节的核心工具。理解ATE测试程序开发的基本原理,不仅需要掌握测试机台的硬件架构,还要熟悉其软件环境中的管脚映射、电平时序、测试流程等底层逻辑。V93000作为爱德万的主力平台,其SmarTest 8环境通过对象化与流程化设计,将复杂的芯片测试任务拆解为可配置、可复用的模块,极大提升了并行测试效率与调试的便利性。无论是数字逻辑芯片的功能验证,还是模拟混合信号器件的参数测量,掌握SmarTest 8的核心操作都能帮助你快速搭建出可

weixin_31476015的博客 246

c++实现双向链表,类模板双向链表

c++实现双向链表的思想和c很类似,不同的是c++是将实现的函数放在类中,这样就可以由类实例化出对象再调用类中的函数进行添加、删除、查找、插入元素等功能。类模板实现双向链表在最后进行说明和实现,方法依然类似。 c++实现双向链表 #include #include using namespace std; typedef int Datatype; typedef

hugang的博客 1万+

yolov7目标追踪:基于自定义数据集完成检测

目标追踪包含两个阶段:(1)基于自定义数据集,训练yolo目标检测模型;(2)基于检测模型,将实时检测结果传递到StrongSORT追踪算法中,该算法在OSNet基础上结合运动和外观信息,可以跟踪yolo模型检测到的任何物体。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2306

利用C++实现双向链表的基本操作

本文采用利用C++实现了对双向链表的基本操作。操作包括:双向链表的构建、链表指定位置的插入、链表指定位置的删除、链表长度的获取、链表指定位置元素的获得及指定元素位置的获得、整体链表的删除。

weixin_43165699的博客 4336

从零开始学 AUTOSAR:深入浅出 SAE J1939 诊断通信管理器(J1939Dcm)深度完整版

SAE J1939 是美国汽车工程师学会制定的重型车辆 CAN 总线通信标准,覆盖卡车、客车、工程机械、农机、船舶等,是商用车领域的 “通用语言”。基于CAN 2.0B 扩展帧(29 位 ID)(车规主流)PGN(参数组号)+ SPN(可疑参数号)核心标准:J1939-21:数据链路层(CAN 帧格式、地址声明)J1939-71:应用层(普通信号、报文)诊断层(核心!J1939Dcm 依据)J1939-81:网络管理(地址管理、节点检测)

getusushu的博客 118

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++实现双向链表

C++实现双向链表,具有基本的功能

m0_56157939的博客 1021

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数据结构双向链表C++实现

#include <iostream> #include <stdio.h> #include <stdlib.h> #define OVERFLOW -3 #define true 1 #define false 0 #define ok 1 #define error -1 using namespace std; typedef struct DuLNo...

Clown_pan的博客 942

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++双向链表实现

链表节点模板 #include <cstdlib> template <typename T> struct ListNode { T data; ListNode<T>* pred; ListNode<T>* succ; ListNode() {} ListNode(T e, ListNode<T>* pred = NU...

yz_rus的博客 273

双向链表(C++数组实现)

概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。(百度) 操作(以下红边为新加入的边,黑边为删除的边) 题外话- -由于窝不会用链表,所以才用数组实现的 用一个pre数组存储每一个节点的前驱(即前一个节点),next数组存储每一个节点的后驱(即后一个节点)。 删点 现在要将x节点删掉(如下图)。我们知道了x = pre [z] = next [y]

losing_Oier的博客 1073
上一篇: 怎么证明一个链表是循环链表
下一篇: 顺序栈之C++实现
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值