双向链表C++实现

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

DoubleLinkList.h

#pragma once
#ifndef DOUBLELINKLIST_H
#define DOUBLELINKLIST_H
//双向链表,下面英文名字写错了
#include<iostream>
using std::cout;
using std::endl;
using std::cin;
typedef int ElemType;

class Node
{
public:
	Node(Node* left=nullptr,Node* right=nullptr):prior(left),next(right){}
	Node* prior;
	Node* next;
	ElemType data;
};


class doubleLinkList
{
public:
	doubleLinkList();
	~doubleLinkList();
	bool empty();//查看是否为空表
	void getElem(int nPos, ElemType& elem);//获得第nPos位置的元素值,并返回给elem
	bool findElem(ElemType elem);//查找列表中是否有elem值d的元素
	void insert(ElemType elem);//默认在列表尾部插入elem元素
	void insert(int nPos, ElemType elem);//在第nPos位置后插入值为elem的元素
	void remove(int nPos, ElemType& elem);//删除第nPos位置的元素,并将其值返回给elem元素
	void remove();//默认删除尾部的元素
	int length();//返回列表长度
	void print();//打印列表
private:
	Node* head;
};
#endif // !DOUBLELINKLIST_H

DoubleLinkList.cpp

#include"DoubleLinkList.h"

//构造函数,建立一个空表,双向链表的空表定义是前驱和后驱都指向头指针
doubleLinkList::doubleLinkList(){
	head = new Node;//为head分配内存
	if (head == nullptr) {
		cout << "分配内存失败" << endl;
		return;
	}
	head->next = head;
	head->prior = head;
}

//析构函数
doubleLinkList::~doubleLinkList(){
	if (!empty())
	{
		Node* p = head->next;
		Node* q = nullptr;
		while (p!=head)
		{
			q = p;
			p = p->next;
			delete q;
		}
	}
	delete head;
}

//查看是否为空表
bool doubleLinkList::empty(){
	if (head->next==head && head->prior==head)
		return true;
	return false;
}

//返回列表长度
int doubleLinkList::length() {
	int Index = 0;
	if (!empty())
	{		
		Node* p = head->next;
		while (p!=head)
		{
			++Index;
			p = p->next;
		}
		return Index;
	}
	return Index;
}

//获得第nPos位置的元素值,并返回给elem
void doubleLinkList::getElem(int nPos, ElemType& elem){
	if (nPos < 0) {
		cout << "输入位置不得小于0,请重新输入位置" << endl;
		return;
	}
	else if(empty()){
		cout << "列表为空" << endl;
		return;
	}
	Node* p = head->next;
	int Index = 0;
	while (p!=head && Index<nPos)
	{
		p = p->next;
		++Index;
	}
	if (p == head)
	{
		if (Index == nPos) {//如果恰好两个条件都满足,即在末尾的元素恰好是npos
			elem = p->prior->data;
			return;
		}
		cout << "输入位置过大,请重新输入" << endl;
		return;
	}
	elem = p->prior->data;//nPos位置的元素在当前p的上一个节点
}

//查找列表中是否有elem值的元素
bool doubleLinkList::findElem(ElemType elem) {
	if (!empty())
	{
		Node* p = head->next;
		while (p!=head)
		{
			if (p->data == elem)
				return true;
			p = p->next;
		}
	}
	return false;
}

//默认在列表尾部插入elem元素
void doubleLinkList::insert(ElemType elem) {
	Node* q = (Node*)new Node[1];
	q->data = elem;
	if (empty()){
		Node* p = head;
		p->next = q;//先排后继,按箭头顺序赋值
		q->next = head;
		head->prior = q;//再排后继,按箭头顺序赋值
		q->prior = head;
	}
	else {
		Node* p = head->prior;				
		head->prior = q;//先排前继,按箭头顺序赋值
		q->prior = p;
		p->next = q;//先排后继,按箭头顺序赋值
		q->next = head;
	}
}

//在第nPos位置后插入值为elem的元素
void doubleLinkList::insert(int nPos, ElemType elem) {
	if (nPos < 0) {
		cout << "输入位置不得小于0,请重新输入位置" << endl;
		return;
	}
	int L = length();
	int Index = 1;
	Node* q = (Node*)new Node[1];
	if (nPos <= L)
	{
		Node* p = head->next;
		q->data = elem;
		while (p != head && Index < nPos) {//大于等于两个元素时会有移动
			++Index;
			p = p->next;
		}
		if (L = 0) {//空表插入
			head->next = q;//先排后继,按箭头顺序赋值
			q->next = head;
			head->prior = q;//再排后继,按箭头顺序赋值
			q->prior = head;
		}
		else if (Index == nPos && p->next == head) {//说明要在尾部结点插入元素,在不为空表时
			Node* s = head->prior;
			head->prior = q;//先排前继,按箭头顺序赋值
			q->prior = s;
			s->next = q;//先排后继,按箭头顺序赋值
			q->next = head;
		}
		else if (nPos == 0) {//在0位置后插入元素,头部插入
			head->next = q;//先排后继
			q->next = p;
			p->prior = q;
			q->prior = head;
		}
		else //非尾部,非头部插入
		{
			q->next = p->next;//逆序
			p->next = q;
			q->prior = p;
			q->next->prior = q;
		}
	}
	else
		cout << "输入位置过大,请重新输入位置" << endl;
}

//删除第nPos位置的元素,并将其值返回给elem元素
void doubleLinkList::remove(int nPos, ElemType& elem) {
	if (!empty() && nPos > 0) {
		int Index = 1;
		int L = length();
		if (nPos <= L)
		{
			Node* p = head->next;
			while (p != head && Index < nPos) {//两个元素时
				++Index;
				p = p->next;
			}
			elem = p->data;//赋值
			if (L>1)//一般情况,即大于一个元素时
			{
				p->prior->next = p->next;
				p->next->prior = p->prior;
			}
			else //仅有一个元素时
			{
				head->next = head;
				head->prior = head;
			}
			delete p;
			return;
		}
	}
	cout << "列表为空!" << endl;
	return;
}

//默认删除尾部的元素
void doubleLinkList::remove() {
	if (!empty()) {
		if (head->next->next!=head)//大于一个元素时
		{
			Node* p = head->prior;
			Node* q = head->prior->prior;
			head->prior = q;
			q->next = head;
			delete p;			
		}
		else {//一个元素时
			Node* p = head->prior;
			head->next = head;
			head->prior = head;
			delete p;
		}
		return;
	}
	cout << "列表为空! 或者 输入位置不得小于等于0" << endl;
	return;
}

//打印列表
void doubleLinkList::print() {
	cout << "列表元素是: ";
	if (!empty())
	{
		Node* p = head;
		while (p->next != head)
		{
			p = p->next;
			cout << p->data << " ";	
		}
		cout << endl;
	}
	else
	{
		cout << "The list is empty!" << endl;
		return;
	}
}

main.cpp

#include"DoubleLinkList.h"


int main() 
{
	doubleLinkList list;
	ElemType elem = 0;
	cout << "列表是否为空:" << list.empty() << endl;
	for (int i = 0; i < 10; i++)
		list.insert(i);
	list.print();
	for (int i = 0; i < 10; i++) {
		list.remove();
		if(i==9)//查看仅剩一个元素时的删除结果
			list.print();
	}
	cout << "分割线" << endl << endl;
	list.insert(0,1);//空表插入
	list.insert(1,2);//一个元素时插入
	list.print();
	list.insert(2, 3);//两个个元素时插入末尾
	list.print();
	list.insert(1, 4);//大于两个元素时插入中间
	list.print();
	cout << "分割线" << endl << endl;
	list.remove(3, elem);
	cout << "取得的元素是:" << elem << endl;
	list.print();

	return 1;
}

 

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

相关推荐

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

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

weixin_36047538的博客 695

C++实现双向链表

实现双向链表的基本操作:创建列表功能,插入功能,删除功能,顺序输出,逆序输出,判断回文串功能 #include <iostream> #include<cstring> using namespace std; class ListNode { public: char data; ListNode* prev; ListNode* next; ListNode() { data = '0'; prev = nullptr; next = nullptr;

fzy2003的博客 4710

基于PYNQ-Z2复现yolov2

基于PYNQ-Z2复现Yolo_v2 参考资料:源项目工程 开发板配置 0 使用说明 0.1 简介 本文档主要分为三个部分: [1] 搭建HLS工程生成Yolo_v2的IP。 [2] 在Vivado中使用生成好的IP进行block design,导出bit文件和tcl文件。 [3] 将相关文件导入至PYNQ-Z2板中,在Jupyter Notebook上进行编程实现。 0.2 所需硬件  PYNQ-Z2开发板、USB数据线、网线  SD卡、读卡器 0.3 所需软件  Vivado 2018.3  V

谦豫 1万+

C++实现双链表【每一步详细深入讲解,代码清晰、简单、易懂】

双链表节点由存储的数据、指向前一个元素的指针和指向后一个元素的指针构成,因此双联表节点的代码也很容易得到,如下: 双链表和单链表类似,也需要添加、删除和查找。 1、插入操作 插入的情况说明:插入每次都在第一个位置插入,也就是在伪头节点(不含元素)后插入。插入节点的过程:插入的代码逻辑: 2、删除操作 将目标节点的下一个节点的指针指向目标节点的前一个节点(目标节点下一个节点不存在则省略) 将目标节点的前一个节点的指针指向目标节点的下一个节点 代码逻辑: 3、查找操作 不同于单链表,双链表查找直接返回目

weixin_55755506的博客 3212

人大金仓数据库Kingbase FlySync同步程序安装

Kingbase FlySync同步程序(以下简称 KFS)是面向异地容灾、数据集中共享的场景推出的具备在异构数据平台间实现实时、增量数据同步的工具类产品,主要采用了物理日志解析技术,帮助用户解决不同数据平台的数据间可实现任意方向实时移动流转的问题,并保证此过程中数据不丢失,状态可监控,流转数据量可统计。KFS 需要安装的主要组件有 2 个,分别是后端同步程序和管理控制平台,另外KFS的部署方式也有2种,为分离部署何集中部署•集中部署:KFS与数据库部署在同一机器上。

weixin_44312518的博客 1176

ESP32脑机接口开发板:EEG信号采集与应用开发指南

脑机接口(BCI)技术通过采集脑电图(EEG)信号实现人机交互,其核心在于高精度生物电信号采集与实时处理。基于ESP32微控制器的开发平台结合专业级ADS1299 ADC芯片,可构建8通道EEG信号采集系统,支持250SPS采样率与可编程增益。这种嵌入式解决方案在科研教育领域具有显著优势,既能满足信号质量要求,又大幅降低开发门槛。典型应用包括实时脑电波可视化、注意力检测等BCI场景,通过Python生态工具链(如BrainFlow、LSL)可快速实现数据处理。开发时需注意电极阻抗控制(<10kΩ)和50/6

weixin_42518874的博客 343

数据结构-双向链表(c++)超全超详细

文章目录前言一、双向链表是什么?二、双向链表上的基本操作1.定义双向链表2.初始化双链表3.前插法创建双链表4.尾插法创建双链表5.双向链表的遍历输出6.双链表的指定位置插入7.双链表的按位取值8.双链表的任意位置删除9.双链表的销毁三、全部代码(主函数部分比较凌乱)总结 前言 单链表结点中只有一个指向其后继的指针,使得单链表只能从头结点依次顺序地向后遍历。要访问某个结点的前驱结点(插入,删除操作时),只能从头开始遍历,访问后继结点的时间复杂度为O(1),访问前驱结点的时间复杂度为O(n)。 提示:以.

Abieai的博客 2万+

头歌平台-人工智能导论实验(人脸识别)

答案仅供参考,自己动手丰衣足食!!!

qq_52119136的博客 3026

使用C++实现双链表

c++实现的双链表

qq_58240448的博客 3884

【FPGA教程案例100】深度学习1——基于CNN卷积神经网络的手写数字识别纯Verilog实现,使用mnist手写数字数据库

MNIST 数据库有一个 60,000 示例的训练集,还有一个 10,000 示例的测试集。这些数字已在大小方面规范化,在固定大小的图像中居中。如下图所示:我们任意选择0~9是个数字,将其转化为数字:0_0.txt1_0.txt2_0.txt3_0.txt4_0.txt5_0.txt6_0.txt7_0.txt8_0.txt9_0.txt。

FPGA/MATLAB学习教程/源码/项目合作开发 7823

PCL 基于法线微分(DoN)的点云分割【2026最新版】

基于法线微分的分割。博客长期更新,本文最新更新时间为:2026年5月10日。

点云侠的博客 39万+

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

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

hugang的博客 1万+

【问题解决】Python 运行报错 `ModuleNotFoundError` 全网最全解决方案,一文搞定所有导包问题

本文全面解析Python中常见的ModuleNotFoundError和ImportError问题,提供从基础到高级的解决方案。文章首先分析问题原因,包括模块未安装、环境不一致、路径问题等,然后给出7种解决方案:安装缺失模块、检查Python环境、使用虚拟环境、添加搜索路径、相对导入、setup.py安装本地包和使用__init__.py。针对Jupyter Notebook、Docker容器等常见场景提供专门解决方案,并推荐使用requirements.txt、pipenv等预防措施。最后分享调试技巧,帮

博客 913

C++语言实现双向链表

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

BeiXi's Blog 1215

SAP FICO 内部往来对账功能开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

SAP FICO 内部往来对账功能开发说明书(包括开发源代码、测试样例、FS)

我好像病了的博客 1222

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

weixin_43165699的博客 4336

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数据结构双向链表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

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

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

losing_Oier的博客 1072

c++编程实现一个双向链表

c++编程实现一个双向链表

weixin_44378800的博客 821

用C++类实现双向链表的功能

实现的功能 无参构造和有参构造,其中无参构造只创建了一个头结点。有参构造中实现了在定义单链表的对象时,可以指定出单链表的长度,并且输入对应单链表每个结点的值。 遍历函数,通过这个遍历,可以打印出单链表对象中所有结点的值(不包括头结点)。 获取长度函数,通过这个函数,可以求出单链表的长度,这里的长度不包括头结点,假如链表中有一个结点(不包括头结点),那么他的长度就是1。 插入结点函数,这个函数有两个参数,分别为要插入结点的位置(比如这个为位置为2,那么要插入节点的位置就是在链表中第二个结点后面插入一.

好好学习。天天编程 1398

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的博客 272

双向链表的插入与删除(c++实现)

目录前言双向链表插入节点实现代码双向链表删除节点实现代码整个项目的完整代码运行截图总结 前言 本篇文章主要接着上文的双向链表的创建与遍历(c++实现) (https://blog.youkuaiyun.com/qq_36472818/article/details/96306824)进一步实现单向链表的插入、删除。 双向链表插入节点 在双向链表中插入新节点与单向链表相似,而根据新节点插入位置的不同,分为三种不...

qq_36472818的博客 7745

单向链表、双向链表的C++实现

前言 本文主要记录数据结构中的单向链表、双向链表C++实现以及要点等。 代码 原理就不说了,基础中的基础。直接上代码: 首先是CNode.h文件: #ifndef _NODE_H__ #define _NODE_H__ class CNode{ private: int data; CNode *nextNode; public: CNode(); void setData(int iD...

Hikers、Wan的博客 598
上一篇: 单链表C++实现
下一篇: C++顺序栈实现
-Gentle-
博客等级 码龄8年 80粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值