双链表的实现与基本操作

数据结构与算法分析实验3 实现链表的基本操作(单链表,双链表) 数据结构与算法实验3:实现链表的基本操作,第一弹,主要覆盖单链表的大部分操作和双向链表的常规操作,算法并非最优,留给读者朋友自行完善。通过链表,将完成多项式加法与乘法,让我们期待下一篇! 阅读详情

一 概述

基本操作包括双链表的增,删,查,改以及单链表数据的打印。

  • 1.初始化双链表!
  • 2.使用前插法将数插入双链表中!
  • 3.使用后插法将数插入双链表中!
  • 4.在双链表指定位置增加一个数!
  • 5.从双链表中删除指定位置的数!
  • 6.从双链表中删除指定值的数!
  • 7.从双链表中找出某一个指定的数!
  • 8.将双链表中的结点数据替换!
  • 9.输出目前的双链表中的每个数据及链表长度!
  • 0:退出!

二 代码实例

#include<stdio.h>
 
#define OK 1;
#define ERROR 0;

bool exist = false;
typedef int ElemType;

typedef struct DuLNode{
	
	ElemType data;
	struct DuLNode *prior,*next;
}DuLNode,*DuLinkList;

int InitList(DuLinkList &L){
	
	/*C语言中的.和->符号的区别 
	(*LinkList).next等价于LinkList->next; 
	  .是指"的"意思,结构体LinkList的next,.的前面是一个结构体;
	  ->是指"指向结构体的",LinkList指向结构体的next,->的前面是一个结构体类型的指针变量。 
	*/
	L = new DuLNode;
	L->next = NULL;
	L->prior = NULL;
	
	return OK;
}

void InsertElemHeader(DuLinkList &L,int Length){
	
	DuLNode *p;
	L = new DuLNode;//头结点,数据域为空 
	L->next = NULL;
	L->prior = NULL; 
	printf("请输入%d个数:",Length); 
	for(int i = 0; i < Length; i++){
		p = new DuLNode;
		scanf("%d",&p->data);
		p->next = L->next;
		p->prior = L->prior; 
		L->next = p;
		L->prior = p;
	}
	if(!Length){
		printf("\n");	
	} 
}

void InsertElemTail(DuLinkList &L,int Length){
	
	DuLNode *p,*r;
	L = new DuLNode;//头结点,数据域为空 
	r = L;
	printf("请输入%d个数:",Length);
	for(int i = 0; i < Length; i++){
		p = new DuLNode;
		p->next = NULL;
		r->next = p;
		p->prior = r;
		r = p;
	}
	if(!Length){
		printf("\n");	
	} 
}

int AddElem(DuLinkList &L,int i,ElemType e){
	
	int j = 0;
	DuLNode *p,*s;
	p = L;
	
	while(p&&(j < i-1)){ //当链表不为空
		p = p->next;
		j++;
	}
	
	if(!p||(j > i-1)){
		return -1;
	}
	
	s = new DuLNode;
	s->data = e;
	s->next = p->next; 
	p->next->prior = s;
	s->prior = p;
	p->next = s;
	
	return OK;
}

int DeleteElem(DuLinkList &L,int i){
	
	DuLNode *p,*d;
	int j = 0;
	p = L;
	while(p->next && (j < i-1)){
		p = p->next;
		++j;
	}
	
	if(!p->next && (j > i-1)){
		return ERROR;
	}
	
	int result = p->next->data;
	d = p->next;
	p->next = d->next;
	d->next->prior = p;
	delete d;
	return result;
}

int DeleteElem2(DuLinkList &L,ElemType e){
	
	DuLNode *p,*d;
	p = L;
	
	while(p){
		if(p->next){
			if(p->next->next && p->next->data != e){
			p = p->next;
			}
		
		if(p->next->next && p->next->data == e){
			d = p->next; 
			p->next = d->next;
			d->next->prior = p;
			delete d;
			return e;
			}
		
		if(!p->next->next && p->next->data == e){
			p->next = NULL;
			return e;
			}
		}else if(p->data == e){
			delete p;
			return e;
		}
	}
	return e;
}

DuLNode *FindElem(DuLinkList &L,ElemType e) {
	
	DuLNode *p;
	p = L->next;
	while(p){
		if(p->data == e){
			exist = true;
			break;
		}else{
			p = p->next;
		}		
	}
	
	if(!exist) {
		printf("元素%d不存在!",e);
	}	
	return p;
} 

int ModifyElem(DuLinkList &L,ElemType e,ElemType e1){
	
	DuLNode *p;
	p = L->next;
	
	while(p){
		if(p->data != e) {
			p = p->next;
		}else{
			p->data = e1;
			exist = true;
		}		 
	}
	
	if(!exist) {
		printf("元素%d不存在,修改失败!",e);
	}	
	return OK;
}

int main(){
	
	printf("***********操作选项**************\n");
	printf("1.初始化双链表!\n");
	printf("2.使用前插法将数插入双链表中!\n");
	printf("3.使用后插法将数插入双链表中!\n");
	printf("4.在双链表指定位置增加一个数!\n");
	printf("5.从双链表中删除指定位置的数!\n");
	printf("6.从双链表中删除指定值的数!\n");
	printf("7.从双链表中找出某一个指定的数!\n");
	printf("8.将双链表中的结点数据替换!\n");
	printf("9.输出目前的双链表中的每个数据!\n");
	printf("0:退出!\n\n");
	
	int elect = -1;
	DuLNode *L,*p;
	int location,e,e1,num;
	
	while(elect != 0){
		printf("请选择:");
		scanf("%d",&elect); 
		switch(elect){
			case 1:
				if(InitList(L)){
					printf("双链表初始化成功!\n");
				}else{
					printf("双链表初始化失败!\n");
					return 0;
				}
				break;
			case 2:
				printf("使用前插法将数插入双链表中!\n");
				printf("输入数的个数:");
				scanf("%d",&num);
				InsertElemHeader(L,num);
				break;
			case 3:
			 	printf("使用后插法将数插入双链表中!\n");
			 	printf("输入数的个数:");
				scanf("%d",&num); 
				InsertElemTail(L,num);
				break;
			case 4:
				printf("在双链表指定位置增加一个数!\n");
				printf("插入的位置为:");
				scanf("%d",&location);
				printf("插入的数据为:");
				scanf("%d",&e);
				AddElem(L,location,e);
				break;
			case 5:
				printf("从双链表中删除指定位置的数!\n");
				printf("删除的指定位置为:");
				scanf("%d",&location);
				printf("被删除指定位置的数为:%d\n",DeleteElem(L,location));
				break;
			case 6:
			 	printf("从双链表中删除指定值的数!\n");
				printf("删除的指定值为:");
				scanf("%d",&e);
				printf("被删除指定值的数为:%d\n",DeleteElem2(L,e));
				break;
			case 7:
				printf("从双链表中找出某一个指定的数!\n");
				printf("查找到数为:");
				scanf("%d",&e);
				if(FindElem(L,e)){
					printf("找到指定数据%d\n",e); 
				}else{
					FindElem(L,e);
				}
				break;
			case 8:
				printf("将双链表中的结点数据替换!\n");
				printf("被替换的数为:");
				scanf("%d",&e);
				printf("替换的数为:");
				scanf("%d",&e1);
				ModifyElem(L,e,e1);
				break;
		    case 9:
		    	printf("目前的双链表中的数据分别是:\n");
		    	p = L->next; //L为头结点 
		    	int length = 0;
		    	while(p){
		    		printf("%d ",p->data);
		    		length++;
		    		p = p->next;
				}
				printf("\n目前双链表长度为:%d\n",length);
				if(! L->next){
					printf("目前的双链表为空!\n");
				}
				break; 
		}
	}
	return OK;
}

三 总结

双链表其余各种复杂操作都可基于上述双链表简单方法组合实现。

C语言实现双链表及其基本操作 在双链表中,每个节点由数据域和指针域构成,节点与指针的结合是实现双链表结构的关键。在C语言中,节点一般通过结构体(struct)来定义,指针则是用来连接这些结构体的纽带。每一个节点都包含两个指针域,分别指向前一个节点和后一个节点,从而形成双向的链接。在C语言中,结构体是创建复杂数据类型的基础,双链表的节点结构体定义语法如下:int data;// 数据域,存储整型数据// 指向前一个节点的指针// 指向后一个节点的指针上述代码段定义了一个名为Node的结构体,包含一个整型数据域。 阅读详情

相关推荐

HDMI2.1/eDP TX接口设计:

HDMI2.1向下兼容,HDMI2.1工作在FRL模式,HDMI2.0工作在TMDS模式。因此采用AC耦合电压模式驱动器。一般采用220nF,封装建议0201。,但是协议要求,往 CEC 管脚通过 27K 电阻加 3.3V 电压,漏电不允许超过。NOTE:如果只需要支持 HDMI2.0 及以下模式时, MOS管也不能省掉。DDC_SCL/DDC_SDA 协议规定是。HDMI2.0模式:配置为高,MOS导通。HDMI2.1模式:配置为低,MOS不导通。,必须增加电平转换电路。形成直流偏置,大约3V。

qq_40010777的博客 7866

数据结构——双链表

介绍了双链表

a2606437441的博客 761

Vue项目实战:用DataV的dv-scroll-board打造高颜值滚动表格(附完整代码)

本文详细介绍了如何在Vue项目中使用DataV的dv-scroll-board组件打造高颜值滚动表格。从基础集成到高级配置,包括动态数据处理、深度样式定制、性能优化策略以及交互增强方案,帮助开发者快速实现企业级数据展示需求。特别针对样式优化和滚动表格的常见问题提供了实用解决方案。

weixin_30892037的博客 499

双链表各种基本运算的算法

初始化双链表 //初始化线性表 void InitList(DLinkNode *&L) { //创建头结点 L=(DLinkNode *)malloc(sizeof(DLinkNode)); L->next=L->prior=NULL; } 头插法建立双链表 //采用头插法建立双链表 void CreateListF(DLinkNode *&L,ElemType a[],int n) { DLink...

Hey3399的博客 5372

基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型对话聊天机器人

前面两篇博文,我们在笔记本部署了Llama 3 8B大模型,使用Ollama搭建了基于Web 可视化对话机器人。在使用过程中,大模型经常出现中文问题英文回答的问题。本博文就用Llama3-Chinese-Chat微调模型来解决这个问题……

老牛啊 9240

海康SDK回调PS流解析实战:从字节流到前端H264播放的完整流程

本文详细介绍了海康SDK回调PS流解析的完整流程,从字节流获取到前端H264播放的实现。涵盖SDK初始化、PS流数据结构解析、H264裸流提取、WebSocket传输及前端播放器集成等关键步骤,为视频监控系统开发提供实用指导。

weixin_29061531的博客 204

双链表基本操作的实现

#include typedef int ElemType; typedef struct DNode{ ElemType data; struct DNode *prior,*next; }DNode, *DLinkList; //初始化链表,尾插法创建一个双链表 void CreatList(DLinkList *L){ int x; (*L) = (DL

Askris的博客 1494

保姆级教程:用Python+OpenCV搞定Orbbec Gemini深度与彩色流对齐(附完整代码)

本文提供了一份详细的Orbbec Gemini深度与彩色流对齐教程,涵盖从环境配置到完整代码实现的每一步。通过解析深度流对齐原理,对比不同对齐模式,并提供工业级应用中的问题排查方法,帮助开发者快速掌握Orbbec Gemini相机的使用技巧。文章还包含进阶应用如点云生成与三维重建的实战代码。

weixin_29090917的博客 470

双链表的基本操作

带头结点的双向循环链表 链表结构如下: 每个节点都有一个数据域和两个指针域,这两个指针分别指向链表的前驱节点和后继节点,头节点的前驱节点是链表的最后一个节点,链表最后一个节点的后继节点是头节点。 正因为如此,带头结点的双向循环链表没有空节点,在进行遍历时,循环条件也与单链表不同: 单链表用cur->next为空判断当前节点是否为最后一个节点,带头的双向循环链表则需判断cur->next是否等于头节点。 定义: typedef int DataType; typedef struct ListN

qq_44631587的博客 2928

Sigrity OptimizePI IC Device Power Pin Inductance Analysis模式如何计算IC电源管脚电感操作指导

Sigrity OptimizePI IC Device Power Pin Inductance Analysis模式可以计算电容到IC电源管脚的电感,用于评估电容位置对于IC电源管脚的效果,如何分析,以下图为例进行说明。Capacitors:选择层面,这里选择top layer(IC在top层),下方可以选择电容的size,这里选择All Size。IC devices,输入U*, A*, B*, Q*, P*,将所有这些字母开头的器件都识别为IC。模式如何计算IC电源管脚电感操作指导。

weixin_54787054的博客 410

【python股票价格预测】基于LSTM(长短期记忆网络)的股票价格预测(附python代码)

【python股票价格预测】基于LSTM(长短期记忆网络)的股票价格预测(附python代码)

k8291121的博客 1013

实现双链表的基本操作(c语言)

介绍双链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 一、实现双链表的具体操作 定义双链表元素 创建链表 ①头插法 ②尾插法 插入结点 删除结点 查找结点 销毁双链表 打印双链表

qq_63152286的博客 4656

Sigrity SPEED2000 General SI Simulation模式如何进行信号仿真分析操作指导-DDR

本例是几个简单的板载DDR颗粒的结构,本例中使用General SI Simulation模式仿真DDR信号,结构拓扑如下,Addcmd,clk,cke都是T拓扑。Sigrity SPEED2000 General SI Simulation模式可以对信号进行仿真分析,仿真将电源视为理想电源,以下图为例进行说明。DQS的接收端模型设置为DQS_34_ODT60_1333。模式如何进行信号仿真分析操作指导-DDR。附带驱动和接收端的IBIS模型。

weixin_54787054的博客 513

C语言 双链表的基本操作与实现

C语言 双链表的基本操作与实现 背景 单链表结点中只有一个指向其后继的指针,使得单链表只能从头结点依次顺序地向后遍历。要访问某个结点的前驱结点(插入、删除操作时),只能从头开始遍历,访问后继结点的时间复杂度为0(1),访问前驱结点的时间复杂度为O(n)。 为了克服单链表的上述缺点,引入了双链表,双链表结点中有两个指针front和tail,分别指向其前驱结点和后继结点 结构体 typedef s...

qq_41740162的博客 535

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

链表(单双链表)用法与基本操作(构建、查找、插入、删除)实现

要用好链表的首要前提就是要理解什么是链表。链表是用任意存储单元来存放数据的,这个存储单元可以使连续的,也可以是不连续的。为了正确的表示元素间的逻辑关系,在存储每个元素值得同时还必须存储指示其后继或是前驱元素的地址信息。这两部分信息组成数据元素的存储映像即结点。包含两个域,数据域和指针域。故而可以用结构体来表示链表中的结点,并且每个新结点使用前都要动态分配存储空间。如果想要了解清楚p->next,p

harrykate的专栏 1175

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C语言:带头结点的循环双链表的表示与实现(包含常见的13种基本操作)

【代码】C语言:带头结点的循环双链表的表示与实现(包含常见的13种基本操作)

m0_71709382的博客 168

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据结构-双链表基本操作-C语言代码

双链表基本操作 1.头插法建立双链表 2.尾插法建立双链表 3.修改结点 4.插入结点 5.删除结点 1.头插法建立双链表 #include<stdio.h> #include<stdlib.h> //双链表的结构定义 typedef struct DNode { int data; struct DNode *prior, *next; }DNode, *DLin...

suxiaorui的博客 1599

【数据结构】 双链表的基本操作 (C语言版)

【数据结构】 双链表的基本操作 (C语言版)

weixin_56814370的博客 1928

数据结构与算法之双链表

本篇文章带大家认识数据结构与算法之双链表,链表是一种在逻辑结构连续,物理结构不连续的数据结构,可以分为单链表与双链表两类,正文将介绍双链表的增删查改,对于链表的概念已经在《数据结构与算法之单链表》一文中已经介绍过了,所以本文对于链表理论概念方面不再赘述,上次实现了不带头结点的单链表,这次就介绍一个带头的双链表吧!描述代码:Java。

未见花闻的博客 1682

数据结构——循环双链表

基于单链表实现循环双链表;相比于单链表,循环双链表的数据结点有两个指针,分别指向该节点的上一个数据节点(前驱)和下一个数据结点(后继),且头结点或首元结点的前驱指向链表的最后一个数据结点,而最后一个数据结点的后继指向头结点或首元结点。因为该结构是循环结构,当指针p再次指向头结点时表示链表循环一周。指针next指向后继结点,prior指向前驱结点。初始化时头结点的前驱和后继都指向自身。若头结点的前驱与后继相等,则说明表空。2、3必须在4的前面。

2302_80756830的博客 589

双链表实现

双链表也是链表的一种,与单链表相似,同样有next指针,但比单链表多了一个pre指针,该指针指向当前结点的直接前驱,有了该指针后,双链表就可以向前或向后查找,在删除结点时,也不必像单链表那样要靠辅助结点来找要删除的结点。双链表一般是在需要大批量的另外储存数据在链表中的位置的时候用。 以下是用java代码来实现双链表 首先创建HeroNode2类,该类的对象都可看做一个结点 class HeroNo...

weixin_43158852的博客 210

双链表的创建以及其他操作

1、双链表的创建 typedef struct DNode{ ElemType data; struct DNode *next; struct DNode *prior; }DLinkList; 2、在p节点之后插入节点s s->next = p->next; p->next->prior = s; s->prior = p; p->next = s;...

qq_40853205的博客 243

python编写代码实现一个循环双链表类_Python描述数据结构之循环双链表篇

文章目录前言1. 循环双链表2. 基本操作3. 代码实现前言本篇章主要介绍线性表中的循环双链表,并用Python实现其基本操作。1. 循环双链表循环双链表就是循环单链表和双链表的集合体了。2. 基本操作操作名称操作说明InsertInHead(val_list)头插法创建循环双链表InsertInTail(val_list)尾插法创建循环双链表IsEmpty()判断循环双链表是否为空LengthL...

weixin_39667509的博客 324

双链表的java实现

直接上代码,错误地方请指正。 class Node { Node prior; // 结点头指针 Node next; // 结点尾指针 Object data; // 数据域 public Node(Object data) { super(); this.data = data; } } class MyLinkedList { private Node ...

Deyong_W的博客 100

双链表基本操作

对双链表做个总结,下面是一系列基本操作 #include #define null 0 #define MAXSIZE 50 struct strlnode { int data; struct strlnode *plast; struct strlnode *pnext; }; 一、创建双链表 void create(struct strlnode **p, int x)

u010010048的专栏 738
上一篇: 线性表链式存储之双链表
下一篇: 线性表的链式存储之循环链表
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值