2.23数据结构

 单向循环链表

创建单向循环链表,创建节点  ,头插,按位置插入,输出,尾删,按位置删除功能

//main.c
#include "loop_list.h"
int main()
{
	loop_p H=create_head();
 	insert_head(H,12);
	insert_head(H,6);
	insert_head(H,90);
	insert_head(H,123);
	out_put_loop(H);
	insert_pos(H,100,3);
	out_put_loop(H);
	del_tail(H);
	out_put_loop(H);
	del_pos(H,2);
	out_put_loop(H);
	return 0;
}
//loop_list.c
#include "loop_list.h"

//创建单向循环链表
loop_p create_head()
{
	loop_p L =(loop_p)malloc(sizeof(loop_list));
	if(L==NULL)
	{
		printf("空间申请失败\n");
		return NULL;
	}
	L->len=0;
	L->next=L;    
	return L;
}

//创建结点
loop_p create_node(datatype data)
{
	loop_p new=(loop_p)malloc(sizeof(loop_list));
	if(new==NULL)
	{
		printf("空间申请失败\n");
		return NULL;
	}
	new->data=data;
	return new;

}

//判空
int loop_empty(loop_p H)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return -1;
	}
	return H->next==H?1:0;
}

//头插
void insert_head(loop_p H,datatype data)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	loop_p new = create_node(data);
	new->next = H->next;
	H->next = new;
	H->len++;
}
//按位置插入
void insert_pos(loop_p H,datatype data,int pos)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	if(pos>H->len+1||pos<1)
	{
		printf("位置不合理\n");
		return;
	}
	loop_p p = H;
	for(int i=0;i<pos-1;i++)
	{
		p=p->next;
	}
	loop_p new =create_node(data);
	new->next=p->next;
	p->next=new;
	H->len++;
}
//输出
void out_put_loop(loop_p H)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	//定义一个新的结点循环整条链表
	loop_p p = H->next;  //H不属于链表中的元素
	//最后一个结点进入循环
	while (p != H)
	{
		printf("%d->", p->data);
		p = p->next;
	}
	printf("%s","HEAD");
	putchar(10);
}
//尾删
void del_tail(loop_p H)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	if(loop_empty(H))
	{
		printf("链表为空,无需删除\n");
		return;
	}
	loop_p p = H;
	for(int i=0;i<p->len-1;i++)
	{
		p = p->next;
	}
	loop_p del = p->next;
	p->next=p->next->next;
	free(del);
	H->len--;
}
//按位置删除
void del_pos(loop_p H,int pos)
{
		if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	if(loop_empty(H))
	{
		printf("链表为空,无需删除\n");
		return;
	}
	if(pos>H->len||pos<1)
	{
		printf("位置不合理\n");
		return;
	}
	loop_p p = H;
	for(int i=0;i<pos-1;i++,p=p->next);
	loop_p del = p->next;
	p->next = p->next->next;
	free(del);
	H->len--;
}
//loop_list.h
#ifndef __LOOP_LIST_H__
#define __LOOP_LIST_H__
#include <stdio.h>
#include <stdlib.h>

typedef int datatype;
typedef struct loop_list
{
	union
	{
		int len;
		datatype data;
	};
	struct loop_list *next;
}loop_list,*loop_p;

//创建单向循环链表
loop_p create_head();
//创建结点
loop_p create_node(datatype data);
//判空
int loop_empty(loop_p H);

//头插
void insert_head(loop_p H,datatype data);

//按位置插入
void insert_pos(loop_p H,datatype data,int pos);
//输出
void out_put_loop(loop_p H);

//尾删
void del_tail(loop_p H);
//按位置删除
void del_pos(loop_p H,int pos);




#endif

链表逆置函数

//单链表的逆置
void overturn_link(link_p H)
{
	if(H==NULL)
	{
		printf("入参为空,请检查\n");
		return;
	}
	if(link_empty(H))
	{
		printf("链表为空\n");
		return;
	}
	if(H->next->next==NULL)
	{
		printf("表中只有一个元素,无需翻转\n");
		return;
	}
	link_p p = H->next->next;
	H->next->next = NULL;
	link_p q = p->next;
	while(p!=NULL)
	{
		p->next = H->next;
		H->next = p;
		
		p = q;
		if(q!=NULL)
		{
			q = q->next;
		}
	}
}
//单链表的逆置
void overturn_link(link_p H)
{
	link_p p = H->next;
	link_p q = H;
	H->next = NULL;
	while(p)
	{
		q=p;
		p = p->next;
		q->next = H->next;
		H->next = q;
	}
}

思维导图

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

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

相关文章

ChatGpt的初步认知(认知搬运工)

前言 ChatGpt火了有一段时间了&#xff0c;对各行各业也有了一定的渗透&#xff0c;当然发展过程中也做了一些安全约束&#xff0c;今天主要是来跟大家分享下关于chatGpt的初步认知。 一、chatGpt是什么&#xff1f; ChatGPT&#xff0c;全称聊天生成预训练转换器&#xff08;英…

电子器件系列63:焊带(光伏焊带)

光伏焊带&#xff0c;又称涂锡焊带。光伏焊带是光伏组件的重要组成部分&#xff0c;属于电气连接部件&#xff0c;应用于光伏电池片的串联或并联&#xff0c;发挥导电聚电的重要作用&#xff0c;以提升光伏组件的输出电压和功率。光伏焊带是光伏组件焊接过程中的重要材料&#…

在Ubuntu系统下搭建TDengine集群

目录 一、Ubuntu虚拟机创建 二、系统相关配置 1、设置系统hostname 2、网络配置及IP规划 3、配置FQDN&#xff08;etc/hosts&#xff09; 4、服务端口设置 三、TDengine server安装 1、服务安装 2、修改配置 3、启动taosd 4、服务卸载 四、客户端安装 1、client安…

SparkSQL学习03-数据读取与存储

文章目录 1 数据的加载1.1 方式一&#xff1a;spark.read.format1.1.1读取json数据1.1.2 读取jdbc数据 1.2 方式二&#xff1a;spark.read.xxx1.2.1 读取json数据1.2.2 读取csv数据1.2.3 读取txt数据1.2.4 读取parquet数据1.2.5 读取orc数据1.2.6 读取jdbc数据 2 数据的保存2.1…

较通用web脚手架模板搭建

较通用web脚手架模板搭建 从这里开始就接触到以后写项目的思维了。 做一个web开发&#xff0c;那就要层次分明&#xff0c;要有个实现的规划&#xff0c;这通常也是有一个较为通用的模板的。 总的来说&#xff1a;不同的层次有不同的模块&#xff0c;每个模块有必须实现的功…

【软件测试】定位前后端bug总结+Web/APP测试分析

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Web测试中简单…

《Python 语音转换简易速速上手小册》第10章 未来趋势和发展方向(2024 最新版)

文章目录 10.1 语音技术的未来展望10.1.1 基础知识10.1.2 主要案例:语音驱动的虚拟助理案例介绍案例 Demo案例分析10.1.3 扩展案例 1:情感敏感的客服机器人案例介绍案例 Demo案例分析10.1.4 扩展案例 2:多模态智能会议系统案例介绍案例 Demo

个人博客系统测试

文章目录 一、项目介绍二、测试1. 功能测试2. 自动化测试&#xff08;1&#xff09;添加相关依赖&#xff08;2&#xff09;新建包并在报下创建测试类&#xff08;3&#xff09;亮点及难点 一、项目介绍 个人博客系统采用前后端分离的方法来实现&#xff0c;同时使用了数据库来…

cmake 项目。qt5升级 qt6 报错 error: “Qt requires a C++17 compiler 已解决

日常项目开发中。需要对qt5升级到qt6 做cmake兼容配置&#xff0c;在编译中发现&#xff0c;有c 编译环境 报错 2>C:\Qt\6.5.3\msvc2019_64\include\QtCore/qcompilerdetection.h(1226,1): fatal error C1189: #error: "Qt requires a C17 compiler, and a suitable …

目标检测卷王YOLO卷出新高度:YOLOv9问世

论文摘要:如今的深度学习方法重点关注如何设计最合适的目标函数,使得模型的预测结果能够最接近真实情况。 同时,必须设计一个适当的架构,可以帮助获取足够的信息进行预测。 现有方法忽略了一个事实,即当输入数据经过逐层特征提取和空间变换时,大量信息将会丢失。 本文将深…

【JAVA】Tomcat的安装

目录 官网链接 下载安装程序 解压 启动Tomcat 问题 其他文件介绍 官网链接 Apache Tomcat - Welcome!https://tomcat.apache.org/ 下载安装程序 进入官网后&#xff0c;点击如下tomcat 8: 进入tomcat 8后选择zip文件下载 解压 Tomcat是一个基于java实现的“绿色软件…

golang tun设备创建并监听

golang tun设备创建并监听 linux tun设备文件地址为/dev/net/tun.直接打开即可(关闭文件描述符创建的tun虚拟接口自动注销) fd,err:syscall.Open("/dev/net/tun",syscall.O_RDWR,0640)//关闭 syscall.Close(fd)初始化 配置ip地址启动虚拟网卡 ip addr add xxx.xx…

2024-02-21 作业

作业要求&#xff1a; 复习课上内容 //已完成结构体字节对齐&#xff0c;64位没做完的做完&#xff0c;32位重新都做一遍&#xff0c;课上指定2字节对齐的做一遍&#xff0c;自己验证 //已完成两种验证大小端对齐的代码写一遍复习指针内容 //已完成完善顺序表已写出的…

使用HiveMQ实现Android MQTT

MQTT官网&#xff1a;https://mqtt.org/ 百度Android MQTT&#xff0c;或者B站上搜索&#xff0c;发现大多使用https://github.com/eclipse/paho.mqtt.android&#xff0c;这是Eclipse的一个Android MQTT客户端实现库&#xff0c;但是我发现这个库在运行到高版本的手机上时报错…

Oracle迁移到mysql-表结构的坑

1.mysql中id自增字段必须是整数类型 id BIGINT AUTO_INCREMENT not null, 2.VARCHAR2改为VARCHAR 3.NUMBER(16)改为decimal(16,0) 4.date改为datetime 5.mysql范围分区必须int格式&#xff0c;不能list类型 ERROR 1697 (HY000): VALUES value for partition …

【leetcode热题】填充每个节点的下一个右侧节点指针

给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到…

Linux线程同步(2)死锁与互斥锁

死锁&#xff08;Deadlock&#xff09;是指两个或两个以上的进程&#xff08;或线程&#xff09;在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。此时称系统处于死锁状态或系统产生了…

【Linux进阶之路】Socket —— “UDP“ “TCP“

文章目录 一、再识网络1. 端口号2. 网络字节序列3.TCP 与 UDP 二、套接字1.sockaddr结构2.UDP1.server端1.1 构造函数1.2 Init1.3 Run 2.客户端1.Linux2.Windows 3.TCP1. 基本接口2. 客户端3. 服务端1.版本12.版本23.版本34.版本4 三、守护进程尾序 一、再识网络 1. 端口号 在…

RT-Thread 时钟 timer delay 相关

前言 此处,介绍对delay 时钟 timer 这几部分之间的关联和相关的知识点;本来只是想介绍一下 delay的,但是发现说到delay 不先 提到 先验知识 晶振\时钟\时钟节拍\定时器 好像没法解释透彻,所以就变成了 晶振\时钟\时钟节拍\定时器\delay 的很简单的概括一遍;并附带上能直接运行的…

【数据结构】链式队列

链式队列实现&#xff1a; 1.创建一个空队列 2.尾插法入队 3.头删法出队 4.遍历队列 一、main函数 #include <stdio.h> #include "./3.linkqueue.h" int main(int…