双向链表的相关操作C++实现

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

对于循环双向链表

判断一个链表是否为空的条件为:head->next==head (头指针)

判断*p为最后一个节点的条件为:p->next=head

#include<iostream>
using namespace std;

/*双链表结构*/
typedef struct node
{
	int data;
	struct node *prior;
	struct node *next;

}DNode; 
/*创建一个带头节点的双链表*/
void CreateDLink(DNode *&head)
{
	int x;
	DNode *p,*s;
    s=(DNode *)malloc(sizeof(DNode));
	if(s==NULL)
	{
		cout<<"Fail to malloc the head node!"<<endl;
		
	}
	   s->data=0;
	    s->prior=NULL;
		s->next=NULL; //建立一个头结点为head的双链表
	head=s;   //若是循环双向链表则为:s->next=s->prior=s;
    cout<<"please input the data of the node"<<endl;
  cin>>x;
	while(x!=0)
	{
      p=(DNode *)malloc(sizeof(DNode));
     if(p==NULL)
	 {
        cout<<"Fail to malloc a new  node!"<<endl;
		
	 }
     
	 p->data=x;
	 s->next=p;
	 p->prior=s;
	 p->next=NULL;
	 s=p;

	 
	cin>>x;
	}

}

void PrintLink(DNode *head)
{
	if(head->next==NULL)
	{
		cout<<"The list is NULL"<<endl;
		return ;
	}
	DNode *p;
	p=head->next;
	while(p!=NULL)
	{
		cout<<p->data<<" ";
		p=p->next;
		
	}
   cout<<endl;
}
int Length(DNode *head) //求双链表长度
{
	int len=0;
	DNode * p=head->next;
	while(p!=NULL)
	{
		len++;
		p=p->next;
	}
	return len;

}
DNode * Get(DNode *head,int i) //获取链表第i个节点地址
{
	int j=0;
	DNode *p=head->next;
	while(j<i&&p!=NULL)
	{
		p=p->next;
		j++;
	}
	if(p!=NULL)
		return p;
	else 
		return NULL;
}
int InsertNode(DNode *head,int x,int i)//在第i个位置插入一个节点
{
	DNode *s,*p;
	s=(DNode *)malloc(sizeof(DNode));
	s->data=x;
	if(i==0)
	{
		s->next=head->next;
		if(head->next!=NULL)
			head->next->prior=s;
		s->prior=head;
		head->next=s;
		
	}
	else
	{
		p=Get(head,i-1); //查找待插入节点前一个位置
		if(p==NULL)
			return 0;
		else
		{
			s->next=p->next;
			if(p->next!=NULL)
				p->next->prior=s;
			s->prior=p;
			p->next=s;
		}
	}

	return 1;
}

void DeleteNode(DNode *head,int index) //删除第index个节点
{
	if(head->next==NULL)
	{
		cout<<"The list is NULL"<<endl;
		return;
	}
	DNode *p,*s/*保存待删除的节点*/;
	if(index==0)
	{
		s=head->next;
		head->next=s->next;
		if(s->next!=NULL)
			s->next->prior=head;
		 free(s);
	}
	else
	{
		p=Get(head,index-1);
        if(p==NULL)
			cout<<"The Node "<<index<<"is not exist"<<endl;
		else
		{
			s=p->next;
			p->next=s->next;
			if(s->next!=NULL)
				s->next->prior=p;
			free(s);
		}
	}

}
int main(int argc,char *argv[])
{
  DNode *head;
  CreateDLink(head); 
  cout<<"链表长度为:"<<Length(head)<<endl;
   PrintLink(head);
   cout<<"第3个节点的值为:"<<Get(head,3)->data<<endl;
 
   cout<<"输入插入节点的位置及值:"<<endl;
    int value, index;
	cin>>index>>value;
   InsertNode(head,value,index);
   cout<<"插入后的链表为:"<<endl;
	   PrintLink(head);

	   cout<<"请输入要删除的节点位置:"<<endl;
	   cin>>index;
	   DeleteNode(head,index);
   PrintLink(head);
	return 0;
}


(C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作 链表(四)实现 阅读详情

相关推荐

C++中的链表模板及其应用:链式队列与链式栈

双向链表是一种重要的数据结构,通过前驱和后继指针允许双向遍历。本章将介绍双向链表模板的定义及其在C++中的实现。首先,我们定义双向链表节点模板:T data;接着,实现双向链表的模板类,其中包含基本操作如插入、删除和遍历:public:} else {// 其他操作方法...private:// 删除节点的逻辑// 其他辅助方法...队列是一种先进先出(FIFO, First-In-First-Out)的数据结构,用于存储数据元素的集合。

weixin_35370061的博客 1042

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

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

Abieai的博客 2万+

同花顺Supermind量化交易 技术面分析专题(一)-- 相似k线的形态验证与选股

W底”,“多头上涨”,“趋势回踩”,”上涨中继“这些都是常见的K线形态,以”上涨中继“为例,当股价快速上涨后,出现盘整形态而非顶部形态,预示股价还会进一步上涨,那么本节主要讲述”上涨中继”形态是否能够预测未来股价上涨,以及如何应用“上涨中继”形态,来快速选股。"相似K线"技术相比于传统的K线组合而言更具技术性,其还有较多的运用空间,比如:运用顶部形态来监控个股潜在的下跌风险,运用相似度来监控个股是否脱离大盘走势,研究各类形态的上涨预测能力,并应用于选股等等。第一步:选取一段标准的“上涨中继”形态K线图。

qq_22808537的博客 4544

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

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

weixin_55755506的博客 3212

小智AI MCP协议实战:从语音指令到设备响应的完整链路拆解

本文深入拆解了小智AI MCP协议在智能语音交互中的完整工作流程。通过一个“调节音量”的真实场景,详细阐述了从语音采集、云端AI意图理解与决策,到MCP协议下的工具调用、设备端执行,最终完成语音反馈的每一个技术环节。文章重点分析了MCP协议如何通过标准化的交互模型,解决AI意图与设备控制间的“最后一公里”通信难题,实现高效可靠的设备响应。

defi6farmer的博客 248

5分钟搞定!用ZLMediaKit搭建GB28181视频监控系统(含避坑指南)

本文提供了一份基于ZLMediaKit搭建GB28181视频监控系统的实战指南。文章详细介绍了从环境准备、核心组件(ZLMediaKit与SIP服务器)部署、摄像头配置到内外网穿透的完整流程,并重点分享了设备ID配置、防火墙设置等关键避坑经验,帮助开发者快速构建稳定可控的监控平台。

apple5的专栏 1082

使用C++实现双链表

c++实现的双链表

qq_58240448的博客 3884

Deepseek+Word插件:一键搞定论文翻译与润色的学术写作新革命

本文介绍了Deepseek Word插件如何革新学术写作流程,实现论文翻译与润色的一键操作。该插件深度集成于Word环境,能智能完成中英互译、语法修正、术语统一及逻辑优化,显著提升写作效率与文本质量,是研究者的高效AI助手。

weixin_29252171的博客 511

C++数据结构之双链表详解

这里头节点是不存储数据的,且单向链表的操作,双向链表都可以做到,这里讲一下双向链表的特点。如果想看一些基础的增删改查工作,直接查看单链表即可。

suren_jun的博客 1487

SQL Server 内存占用高分析及解决办法(超详细)

如果想让 Sql Server 主动释放 占用并空闲的内存空间,可以设置Sql Server占用内存的上限,就会让Sql server在。如执行存储过程,自定函数时,SQL Server 需要先二进制编译再运行,编译后的结果也会缓存起来,再次调用时就无需再次编译。才会释放一点占用的内存,所以很多时候,我们会发现运行SQL Server的系统内存往往居高不下这些内存一般都。缓存,以便于再次请求此页的数据的时候,直接从内存返回,就无需读取磁盘了,大大提高了速度。最后文章有啥不对,欢迎大佬在评论区指点!

2301_79080944的博客 3952

15、人工智能社会学:关系视角下的机器相遇

本文探讨了将人工智能视为社会主体的可能性,提出了一种关系视角下的人工智能社会学。通过结合卢西亚娜·帕里西、艾伦·图灵和乔治·赫伯特·米德的理论,强调不确定性在人工智能运行中的核心地位,并分析了人工智能如何通过与社会环境的互动催生新奇性,从而拓展社会学的研究范畴。文章还讨论了人工智能对社会结构和社会互动的影响,以及其作为社会主体所带来的理论和实践意义,为未来人工智能社会学的发展提供了方向。

pea55的博客 72

C++实现双向链表(含迭代器)

C++实现双向链表(含迭代器)1.什么是双向链表2.双向链表的C++代码实现(1)数据节点的代码编写(2)迭代器(3)链表初始化(4)获取节点(5)插入和删除节点(6)链表的交换与合并3.完整代码4.简单的测试代码 1.什么是双向链表 这里既然要实现双向链表,就首先要知道双向链表是什么。 双向链表,实际上就是一种储存数据的容器,是属于链表的其中一种。他的特点是:数据储存在不连续的内存空间中,每个数据节点包含 数据、上一个数据节点的指针和下一个数据节点的指针。 缘于他的这种特点,他可以在 O(1)O(1)O(

m0_51797936的博客 1965

magic-api的鉴权机制配置 (附实战代码)

引入magic-api及相关数据库驱动依赖 配置yml文件和编辑器JS文件 实现登录鉴权逻辑,包括用户验证和Token处理 接口鉴权拦截器设计,确保接口访问安全性 文章提供了完整的代码示例,帮助开发者快速集成magic-api框架并实现权限控制功能。

码农研究僧的博客 227

C++实现双向带头结点的循环链表(list相关操作的简单实现)

直接贴代码: //带头带环的双向链表 //-》无死角 #include &lt;iostream&gt; using name...

Lycorisradiata__的博客 439

uniapp [安卓苹果App端] - 实现判断并开启消息通知/提示权限,监测通知权限未开启时弹框提示用户并引导用户跳转至设置界面,uniApp检查通知权限+提示是否打开+点击跳转设置(详细示例代码)

uni-app判断有无通知权限,并进行设置,设置手机通知权限,开启通知权限,uni-app解决权限问题,uniapp 拉起授权(拒绝后重新开启权限)uniApp打包的手机app如果用户没开启通知权限、引导用户开启,uni-app动态打开应用通知权限,拒绝后跳转设置页面,uniapp获取通知栏权限,苹果ios系统打开通知权限,被拒绝怎么办,uniapp安卓判断通知权限,uniapp打包的APP引导用户打开手机通知权限,uniapp权限被拒绝,跳转手机设置页面 权限设置,IOS应用内跳转系统设置,uni-app

🏆 前端领域优质创作者 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++ 链表

C++链表笔记

m0_62175410的博客 4万+

温度PID控制PLC程序

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

C++模拟实现双向列表

#ifndef _LIST_H #define _LIST_H template <class T> class Node { public: Node<T> *prev; // 上一个节点 Node<T> *next; // 下一个节点 T data; // 当前这个节点的数据 }; template <class T> class List { private: Node<T> *head; // 头节点 ...

navy专栏 697

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

C++双向链表(插入/删除/打印)

双向链表基于单向链表,由只能指向next或者previous节点变为可以同时知道前后两个节点的存在。因此可以同时创建两个指针,指向头部的head和指向尾部的tail去帮助后边的遍历。

lwasoo的博客 859

c语言双向循环链表合并,双向循环链表的合并

循环链表和双向链表的区别是是什么?最后一个结点指针指向不同 在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是像双向链表那样置为NULL。此种情况还用于在最后一个结点后插入一个新的结点。判断链域值不同 在判断是否到表尾时。双向循环链表中如何交换两个结点,为什么我p , q交换 先用笨的办法,把p ,q分别摘下来,然后插回去就可以了 t=p->next;t->pre=p...

weixin_39595310的博客 1099

数据结构——双向链表

数据结构——带头双向循环链表

Dirty_artist的博客 1240

【C++】模拟实现 list:双向链表的构建与解析

本文详细介绍了 C++ 中 list 类的模拟实现过程。首先分析了 list 类的功能需求,包括存储元素、元素访问与修改、元素数量操作、迭代器支持和内存管理等方面,强调其通过节点指针链接实现灵活操作。接着阐述了模拟实现的关键步骤,定义了包含节点结构体的MyList类,节点有数据及前后指针。文中展示了默认、指定大小和拷贝构造函数,析构函数用于正确释放内存。获取元素数量、判断为空、添加删除元素(如头部尾部插入删除、指定位置插入删除)等函数的实现逻辑清晰,迭代器相关函数也有详细说明,文末还提供了投票以获取读者反馈

A Charmer 的博客 2505

数据结构(双向链表)

本文介绍了带头双向循环链表的实现

2301_80475151的博客 1416

链表常用操作

转自:https://www.cnblogs.com/byonecry/p/4458821.html 数据结构之链表-链表实现及常用操作(C++篇) 0.摘要 定义 插入节点(单向链表) 删除节点(单向链表) 反向遍历链表 找出中间节点 找出倒数第k个节点 翻转链表 判断两个链表是否相交,并返回相交点 判断链表是否有环路,获取连接点,计算环的长度 二叉树和双向链表转化 1.定义 1.1单向链表...

weixin_34102807的博客 113

【初阶数据结构篇】双向链表的实现(赋源码)

须知💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力!你们的支持是我不断进步的动力!🚀 分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步!前言双向链表与单链表实现的思想(思路)基本一致,甚至更简单。

braveact的博客 909
上一篇: Effective C++ 总结
下一篇: 队列的线性存储和链式存储实现
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值