双向循环链表的基本操作(创建节点,头插,头删,尾插,尾删)

头定义:

typedef char datatype[20];//datatype==char[20]
typedef struct Node
{
	//数据域 数据元素
	datatype data;
	//指针域 下一个节点地址
	struct Node* next;
	//指针域 上一个节点地址
	struct Node* prev;
}*DoubleLink;

创建链表节点:

DoubleLink create_node()//创建链表
{
	DoubleLink node=(DoubleLink)malloc(sizeof(struct Node));
	if(NULL==node)
		return NULL;
	//对新节点的数据域初始化
	strcpy(node->data,"");
	//对指针域赋值 NULL
	node->next=node->prev=node;
	return node;
}

节点的头插:

 

DoubleLink insert_head(datatype e,DoubleLink L)//头插
{
	DoubleLink s=create_node();
	if(NULL==s)
		return L;
	strcpy(s->data,e);
	DoubleLink rear;
	if(NULL!=L)
	{
		rear=L->prev;
		s->next=L;
		L->prev=s;
		rear->next=s;
		s->prev=rear;
	}
	L=s;
	return L;
}

节点的尾插:

 

 

DoubleLink insert_rear(DoubleLink L,datatype e)//尾插
{
	//创建新节点s
	DoubleLink s=create_node();
	if(NULL==s)
		return L;
	strcpy(s->data,e);
	//链表为空
	if(NULL==L)
	{
		L=s;
		return L;
	}
	DoubleLink rear=L->prev;
	rear->next=s;
	s->next=L;
	L->prev=s;
	s->prev=rear;
	return L;
}

节点的头删:

 

DoubleLink delete_head(DoubleLink L)//头删
{
	if(L==NULL)
		return L;
	if(L->next==L)
	{
		free(L);
		L=NULL;
		return L;
	}
	DoubleLink q=L->next;
	strcpy(L->data,q->data);
	L->next=q->next;
	q->next->prev=L;
	free(q);
	q=NULL;
	return L;
}

节点的尾删:

 

DoubleLink delete_rear(DoubleLink L)//尾删
{
	if(L==NULL)
		return L;
	if(L->next==L)
	{
		free(L);
		L=NULL;
		return L;
	}
	DoubleLink rear=L->prev;
	rear->prev->next=L;
	L->prev=rear->prev;
	free(rear);
	rear=NULL;
	return L;
}

节点的输出(正向遍历和反向遍历):

void output(DoubleLink L)//输出
{
	//判断链表是否为空
	if(NULL==L)
		return;
	//正向遍历
	printf("正向遍历\n");
	DoubleLink p=L;
	while(L->next!=p)
	{
		printf("%s ",L->data);
		L=L->next;
	}
	printf("%s\n",L->data);
	//逆向遍历
	printf("逆向遍历\n");
	while(L!=p)
	{
		printf("%s ",L->data);
		L=L->prev;
	}
	printf("%s",L->data);
	puts("");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/42595.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

轻量级Web报表工具ActiveReportsJS全新发布v4.0,支持集成更多前端框架!

ActiveReportsJS 是一款基于 JavaScript 和 HTML5 的轻量级Web报表工具,采用拖拽式设计模式,不需任何服务器和组件支持,即可在 Mac、Linux 和 Windows 操作系统中,设计多种类型的报表。ActiveReportsJS 同时提供跨平台报表设计、纯…

第五章 编程之免交互

免交互:不需要人为控制就可以完成的自动化操作(自动化运维) shell脚本和面交互是一个概念,但是两种写法 shell:默认解释器是bash 使用i/o(输入/输出)重定向的方式,将命令的列表提供…

Flask 定制日志并输出到文件

Flask 定制日志并输出到文件 定制日志器flask缺省日志器配置自定义日志器 定制日志器 flask缺省日志器配置 flask自带的日志系统,缺省配置dictConfig(),但必须在Flask()应用之前使用 # flask缺省配置 from logging.config import dictConfig dictConfig…

文心千帆大模型测评分享,效果超出预期

一、前言 现如今,随着ChatGPT的爆火越来越多的人开始关注人工智能领域了,大家都在尝试使用它来帮助自己在工作上提高效率亦或是解决一些问题。但ChatGPT是有一定的使用门槛的:首先需要我们“科学上网”才能访问,其次GPT4的价格相…

C语言库函数 — 错误信息报告函数

前言 本文介绍错误信息报告函数 错误信息报告函数的作用: 帮助程序员快速定位代码中的错误,以便更快地进行调试和修复问题。 文章目录 前言一、错误信息报告函数什么是错误信息报告函数错误信息报告函数的作用strerror函数介绍strerror函数使用错误码对应…

Data Structure, Algorithm,and Applications in C++

在学习这本书进阶内容之前,我们可以跟着它的第一章部分再巩固和复习。本书由Sartaj Sahni撰写,由王立柱和刘志红翻译。全书通俗易懂,内容丰富,是巩固C内容的不二选择。希望本文对各位有所帮助。 目录 1.函数与参数 1.1.传值参数…

C++的类型转换

文章目录 一. C语言的类型转换二. C的四种类型转换1. static_cast2. reinterpret_cast3. const_cast4. dynamic_cast 三. RTTI结束语 一. C语言的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类…

25 MFC 数据库

文章目录 导入ADO库 导入ADO库 #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")void CADODlg::OnBnClickedBtnQuery() {//导入ADO库::CoInitialize(NULL);//初始化COM库_ConnectionPtr pCo…

ChatGPT 最佳实践指南

GPT Best Practices GPT 最佳实践指南 This guide shares strategies and tactics for getting better results from GPTs. The methods described here can sometimes be deployed in combination for greater effect. We encourage experimentation to find the methods that…

Python爬虫-贝壳二手房

前言 本文是该专栏的第3篇,后面会持续分享python爬虫案例干货,记得关注。 本文以某二手房网为例,如下图所示,采集对应城市的二手房源数据。具体思路和方法跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM6Ly9zei5rZS5jb20vZXJzaG91ZmFuZy8= 目标:…

QT调用torch的环境配置(2023.7.19 / Win10+Qt+libtorch(1.9.1)+cuda11.1+cuDNN v8.0.4)

QT/C成功调用libtorch的环境配置(2023.7.19) QT/C成功调用libtorch的环境配置Pytorch 模型训练下载训练转化 libtorch模型使用下载C使用Qt使用 最后的话 QT/C成功调用libtorch的环境配置 背景:和同门一起搭的新系统是基于QT的,如…

Monocular 3D Object Detection with Depth from Motion 论文学习

论文链接:Monocular 3D Object Detection with Depth from Motion 1. 解决了什么问题? 从单目输入感知 3D 目标对于自动驾驶非常重要,因为单目 3D 的成本要比多传感器的方案低许多。但单目方法很难取得令人满意的效果,因为单张图…

NAT技术是什么?谈谈它的实现方式、优缺点以及作用

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 前言 随着网络的不断发展,网络的应用也越来越多,有限的IPV4地址就显得不怎么够用,所以出现了NAT技术&…

Rust 数据类型 之 结构体(Struct)

目录 结构体(Struct) 定义与声明 结构体定义 结构体实例 结构体分类 单元结构体(Unit Struct) 元组结构体(Tuple Struct) 具名结构体(Named Struct) 结构体嵌套 结构体方法…

jenkins war包 centos启动安装指导

文章目录 步骤1:进入官网,下载到Jenkins的war包1.1 放置在指定位置1.2 放置安装包和创建文件放置路径1.3 检查环境1.4 配置启动命令和结束命令 步骤2: 启动后进入到Jenkins页面2.1 安装插件,例如流水线2.2 依然出现安装插件失败的…

疑问:为什么我的手机不能同时放两张电信卡呢?联通移动可以

很多后台的小伙伴私信我:“为什么我的双卡双待手机不能用两张电信卡呢?”其实我一直在认真的去查证这个问题,因为现在普遍网上的大流量手机卡套餐,电信是主力,如果第一张卡是电信,第二张卡不能使用电信了&a…

公网访问的Linux CentOS本地Web站点搭建指南

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道,指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…

ES6基础知识一:说说var、let、const之间的区别

一、var 在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量 注意:顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象 var a 10; console.log(window.…

uview2.0使用u-calendar 的formatter属性,在formatter方法里无法访问this的bug,解决办法!!!!

uview 版本2.0.36 文档 使用该文档的案例,在 formatter打印this也会是undefined。 自己写了个demo 父给子传值v-bind传一个函数,然后在这个函数里面打印this,this是子组件的实例,但是不知道为什么formatter里会打印undefined。希…

微服务 云原生:搭建 K8S 集群

为节约时间和成本,仅供学习使用,直接在两台虚拟机上模拟 K8S 集群搭建 踩坑之旅 系统环境:CentOS-7-x86_64-Minimal-2009 镜像,为方便起见,直接在 root 账户下操作,现实情况最好不要这样做。 基础准备 关…