【单链表】无头单项不循环(2)

news2024/11/17 1:57:16

目录

Test.c主函数

test5

test6

test7

test8

test9

Test.c总代码

SList.h头文件&函数声明

头文件

函数声明

SList.h总代码

SList.c函数实现

查询SLFind 

pos前面插入  

pos后面插入

pos后面删除

pos删除

空间释放

SList.c总代码


今天链表。 

Test.c主函数

#include"SList.h"
int main()
{
	SLNode* phead = NULL;//结构体指针变量存放结构体的地址 头节点
	test5(&phead);//测试查找
	test6(&phead);//测试在pos前面插入
	test7(&phead);//测试在pos后面插入
	test8(&phead);//测试删除pos后面的元素
	test9(&phead);//测试删除pos的元素
	return 0;
}

test5

void test5(SLNode** pphead)//测试查找
{
	SLNode*ret=SLFind(*pphead, 77);
	if (ret != NULL)
	{
		printf("找到了:%d\n", ret->val);
	}
	else
	{
		printf("没找到\n");
	}
}

test6

void test6(SLNode** pphead)//测试在pos前面位置插入的元素
{
	SLNode* ret = SLFind(*pphead, 77);
	SLInsert(pphead, ret, 34);
	SLNode* pos = SLFind(*pphead, 34);
	SLInsert(pphead, pos,  78);
	SLPrint(*pphead);
}

test7

void test7(SLNode** pphead)//测试在pos后面位置插入的元素
{
	SLNode* ret = SLFind(*pphead, 77);
	SLInsertAfter(pphead, ret, 99);
	SLPrint(*pphead);
}

test8

void test8(SLNode** pphead)//测试删除pos后面的元素
{
	SLNode* ret = SLFind(*pphead, 77);
	SLEraseAfter(pphead, ret);//99
	SLPrint(*pphead);
}

test9

void test9(SLNode** pphead)//测试删除pos的元素
{
	SLNode* ret = SLFind(*pphead, 78);
	SLErase(pphead, ret);
	SLPrint(*pphead);
}

Test.c总代码

#include"SList.h"
void test1(SLNode** pphead)//测试尾插
{
	SLPushBack(pphead, 10);
	SLPushBack(pphead, 20);
	SLPushBack(pphead, 30);
	SLPushBack(pphead, 40);
	SLPrint(*pphead);
}

void test2(SLNode** pphead)//测试头插
{
	SLPushFront(pphead, 77);
	SLPushFront(pphead, 66);
	SLPushFront(pphead, 55);
	SLPushFront(pphead, 33);
	SLPrint(*pphead);
}

//

void test3(SLNode** pphead)//测试头删
{
	SLPopFront(pphead);
	SLPopFront(pphead);
	SLPopFront(pphead);
	SLPrint(*pphead);
}

void test4(SLNode** pphead)//测试尾删
{
	SLPopBack(pphead);
	SLPopBack(pphead);
	SLPrint(*pphead);
}

void test5(SLNode** pphead)//测试查找
{
	SLNode*ret=SLFind(*pphead, 77);
	if (ret != NULL)
	{
		printf("找到了:%d\n", ret->val);
	}
	else
	{
		printf("没找到\n");
	}
}

void test6(SLNode** pphead)//测试在pos前面位置插入的元素
{
	SLNode* ret = SLFind(*pphead, 77);
	SLInsert(pphead, ret, 34);
	SLNode* pos = SLFind(*pphead, 34);
	SLInsert(pphead, pos,  78);
	SLPrint(*pphead);
}


void test7(SLNode** pphead)//测试在pos后面位置插入的元素
{
	SLNode* ret = SLFind(*pphead, 77);
	SLInsertAfter(pphead, ret, 99);
	SLPrint(*pphead);
}


void test8(SLNode** pphead)//测试删除pos后面的元素
{
	SLNode* ret = SLFind(*pphead, 77);
	SLEraseAfter(pphead, ret);//99
	SLPrint(*pphead);
}

void test9(SLNode** pphead)//测试删除pos的元素
{
	SLNode* ret = SLFind(*pphead, 78);
	SLErase(pphead, ret);
	SLPrint(*pphead);
}

int main()
{
	SLNode* phead = NULL;//结构体指针变量存放结构体的地址 头节点
	test1(&phead);//测试尾插
	test2(&phead);//测试头插
	test3(&phead);//测试尾删
    test4(&phead);//测试头删
	test5(&phead);//测试查找
	test6(&phead);//测试在pos前面插入
	test7(&phead);//测试在pos后面插入
	test8(&phead);//测试删除pos后面的元素
	test9(&phead);//测试删除pos的元素
	return 0;
}

SList.h头文件&函数声明

头文件

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

函数声明

  • 单链表元素查询 
//找到某个数值在单链表
SLNode* SLFind(SLNode* phead, SLNDataType x);
  •  在pos前面位置插入元素
//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x);
  • 在pos后面插入元素 
//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x);
  •  删除pos后面的位置的元素
//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos);
  • 删除pos位置的元素 
//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos);
  •  空间释放
//空间释放
void SLDestroy(SLNode** pphead);

SList.h总代码

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

//创建单链表
typedef int SLNDataType;//单链表节点数据类型

typedef struct SListNode//创建节点
{
	SLNDataType val;
	struct SListNode* next;
}SLNode;

//打印数据
void SLPrint(SLNode* phead);

//尾插
void SLPushBack(SLNode** pphead, SLNDataType x);

//头插
void SLPushFront(SLNode** pphead, SLNDataType x);

//头删
void SLPopFront(SLNode** pphead);

//尾删
void SLPopBack(SLNode** pphead);

//找到某个数值在单链表
SLNode* SLFind(SLNode* phead, SLNDataType x);

//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x);

//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x);

//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos);

//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos);

//空间释放
void SLDestroy(SLNode** pphead);

SList.c函数实现

查询SLFind 

//在单链表中查找某个数字
//找到了返回这个链表的地址
//没找到返回NULL
SLNode* SLFind(SLNode* phead, SLNDataType x)
{
	SLNode* cur = phead;
	while(cur)
	{
		if (cur->val == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

pos前面插入  

//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x)
{
	//严格限定单链表里面必须有一个有效节点
	assert(pphead);//应该没有人喝醉酒了吧
	assert(*pphead);
	assert(pos);
	SLNode* newnode = CreateNode(x);
	SLNode* cur = *pphead;
	SLNode* prve = NULL;
	//适合中间和尾
	if (prve)
	{
		while (cur != pos)
		{
			prve = cur;
			cur = cur->next;
		}
		prve->next = newnode;
		newnode->next = cur;
	}
	else
	{
		//头插
		SLPushFront(pphead, x);
	}
}

pos后面插入

//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x)
{
	//严格限定单链表里面必须有一个有效节点
	assert(pphead);//应该没有人喝醉酒了吧
	assert(*pphead);
	assert(pos);
	SLNode* newnode = CreateNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
	//头和尾都不用处理。
}

pos后面删除

//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos)
{
	//pos在最后一个不可
	assert(pos->next);
	assert(pos);
	SLNode* tmp = pos->next;
	pos->next = pos->next->next;
	free(tmp);
	tmp = NULL;
}

pos删除

//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos)
{
	assert(pos);
	SLNode* cur = *pphead;
	SLNode* prve = NULL;
	if (prve)
	{
		while (cur != pos)
		{
			prve = cur;
			cur = cur->next;
		}
		prve->next = cur->next;
		free(pos);
		pos = NULL;
	}
	else
	{
		*pphead = pos->next;
		free(pos);
		pos = NULL;
	}
}

 

空间释放

//空间释放
void SLDestroy(SLNode** pphead)
{
	assert(*pphead);
	SLNode* cur = *pphead;
	while (cur)
	{
		SLNode* tmp = cur->next;
		free(cur);
		cur = tmp;//cur=cur->next
	}
}

SList.c总代码

#include"SList.h"
void SLPrint(SLNode* phead)
{
	assert(phead);
	SLNode* tail = phead;
	printf("phead->");
	while (tail->next != NULL)
	{
		printf("%d->", tail->val);
		tail = tail->next;
	}
	printf("NULL");
	printf("\n");
}


//创建链表的节点---结构体
SLNode* CreateNode(SLNDataType x)
{
	SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
	if (newnode == NULL)
	{
		perror("malloc");
		return;
	}
	newnode->val = x;
	newnode->next = NULL;
	return newnode;
}

//测试尾插
void SLPushBack(SLNode** pphead, SLNDataType x)
{
	//assert(*pphead);
	SLNode* newnode = CreateNode(x);
	//无节点
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	//多个节点
	else
	{
		SLNode* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = newnode;
	}

}


//头插
void SLPushFront(SLNode** pphead, SLNDataType x)
{
	//assert(*pphead);
	SLNode* newnode = CreateNode(x);
    newnode->next = *pphead;
    *pphead = newnode;
}


//---删除就涉及空间的释放---断言(删过头)
//头删
void SLPopFront(SLNode** pphead)
{
	assert(*pphead);
	SLNode* tail = *pphead;
	*pphead = (*pphead)->next;
	free(tail);
	tail = NULL;
}


//尾删
void SLPopBack(SLNode** pphead)
{
	assert(*pphead);
	//一个节点
	if ((*pphead)->next == NULL)
	{
		free(*pphead);
		*pphead = NULL;
	}
	else
	{
		SLNode* tail = *pphead;
		SLNode* prve = NULL;//虽然这里prve置为NULL和tail都是一样,但是在OJ题目当中会出错
		while (tail->next != NULL)
		{
			prve = tail;
			tail = tail->next;
		}
		prve->next = NULL;
		free(tail);
		tail = NULL;
	}
}



//在单链表中查找某个数字
//找到了返回这个链表的地址
//没找到返回NULL
SLNode* SLFind(SLNode* phead, SLNDataType x)
{
	SLNode* cur = phead;
	while(cur)
	{
		if (cur->val == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}




//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x)
{
	//严格限定单链表里面必须有一个有效节点
	assert(pphead);//应该没有人喝醉酒了吧
	assert(*pphead);
	assert(pos);
	SLNode* newnode = CreateNode(x);
	SLNode* cur = *pphead;
	SLNode* prve = NULL;
	//适合中间和尾
	if (prve)
	{
		while (cur != pos)
		{
			prve = cur;
			cur = cur->next;
		}
		prve->next = newnode;
		newnode->next = cur;
	}
	else
	{
		//头插
		SLPushFront(pphead, x);
	}
}



//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x)
{
	//严格限定单链表里面必须有一个有效节点
	assert(pphead);//应该没有人喝醉酒了吧
	assert(*pphead);
	assert(pos);
	SLNode* newnode = CreateNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
	//头和尾都不用处理。
}



//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos)
{
	//pos在最后一个不可
	assert(pos->next);
	assert(pos);
	SLNode* tmp = pos->next;
	pos->next = pos->next->next;
	free(tmp);
	tmp = NULL;
}


//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos)
{
	assert(pos);
	SLNode* cur = *pphead;
	SLNode* prve = NULL;
	if (prve)
	{
		while (cur != pos)
		{
			prve = cur;
			cur = cur->next;
		}
		prve->next = cur->next;
		free(pos);
		pos = NULL;
	}
	else
	{
		*pphead = pos->next;
		free(pos);
		pos = NULL;
	}
}



//空间释放
void SLDestroy(SLNode** pphead)
{
	assert(*pphead);
	SLNode* cur = *pphead;
	while (cur)
	{
		SLNode* tmp = cur->next;
		free(cur);
		cur = tmp;//cur=cur->next
	}
}

 

最近改bug改的想砸电脑,保持冷静。下篇博客我们将继续链表其他类型。好好学习,天天向上。

代码---------→【唐棣棣 (TSQXG) - Gitee.com】

联系---------→【邮箱:2784139418@qq.com】

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣最热一百题——盛水最多的容器

终于又来了。我的算法记录的文章已经很久没有更新了。为什么呢&#xff1f; 这段时间都在更新有关python的文章&#xff0c;有对python感兴趣的朋友可以在主页找到。 但是这也并不是主要的原因 在10月5号我发布了我的第一篇博客&#xff0c;大家也可以看见我的每一篇算法博客…

『MySQL快速上手』-④-表的操作

文章目录 1.创建表2.查看表结构3.修改表4.删除表 1.创建表 语法格式如下&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明&#xff1a; field 表示列名&#xff1…

javascript模块化之ESM

[[toc]] ESM是什么 个人理解是: EcmaScript Modules常说的 es modules常说的 es模块常说的 前端模块化demo1: 浏览器基本使用 <!-- 【1】 浏览器基本使用script 标签设置 type = module,浏览器就会以 ES modules 的标准去执行 JavaScript 代码。默认情况下,代码是以严格…

简化磁盘分区管理的 6 个分区管理器软件!

在计算机上存储和管理数据的方式对机器的性能起着至关重要的作用。对计算机硬盘进行分区是管理文件和确保系统高效运行的绝对必要步骤。 对硬盘进行分区涉及将其分成可用于存储数据的部分&#xff0c;使其更有条理和安全。但是&#xff0c;对硬盘进行分区可能是一个繁琐而复杂…

Redis中的Zset类型

目录 Zset的相关命令 zadd zrange zcard zcount zrevrange zrangebyscore zpopmax bzpopmax zpopmin和bzpopmin zrank zrevrank zscore zrem zremrangebyrank zremrangebyscore 操作集合间的命令 zinterstore和zunionstore 内部编码 Zset的应用场景 Zset表…

华为交换机镜像端口配置

目录 一、进入交换机&#xff08;进入web页面&#xff09; 1.配置vlan 二、配置镜像流量 1.配置观察口 2.配置镜像端口 3.结果展示 4.关闭接口后的效果 三、镜像流量的删除 1.删除镜像流量接口 2.删除镜像监听口 一、进入交换机&#xff08;进入web页面&#xff09; …

全网最牛,Python接口自动化测试实战干货-项目接口案例,看这篇足够...

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

pixhawk接深度计

环境 pixhawk 2.4.8 深度计MS5837 ardusub 4.1.1 mission planner 1.3.80 QGroundCpntrol 4.2.8 物理连接 pixhawk的IIC接口接个IIC扩展板&#xff0c;可扩展出4个接口&#xff0c;然后深度计的接头直接插入任意一个IIC扩展口即可 过程 在mission planner上往pixahwk中安装…

“舞”动金鸡 | 安全狗连续5年零失误守护金鸡奖颁奖典礼安全

11月4日&#xff0c;第36届中国电影金鸡奖颁奖典礼暨2023年中国金鸡百花电影节闭幕式在厦门圆满落幕。 作为国内云原生安全领导厂商&#xff0c;安全狗再一次收到客户委托&#xff0c;为其金鸡期间的相关宣传窗口、网页和系统的网络安全全程护航。 厦门服云信息科技有限公司&am…

threejs (二) 相机

正交相机 const camera new THREE.OrthographicCamera(-aspect,aspect,aspect,-aspect,0.1, //进平面1000 //远平面); // 透视相机创建相机辅助线 const cameraHelper new THREE.CameraHelper(this.camera);创建一个透视相机观察正交相机 // 创建透视相机const watchCamera …

什么是客户体验 (CX)?如何改善客户体验?

客户体验&#xff08;CX&#xff09;就是客户在与某个公司、产品或服务互动时所感受到的整体体验。这包括客户的感觉、情感和意见&#xff0c;无论是购物、与客服互动、使用产品还是与品牌互动。CX就像客户在与一家公司或产品互动时的"情感指南"&#xff0c;可以是积…

使用c++解压rar文件,基于UnRAR64,非命令行

最近项目需要解压缩rar文件&#xff0c;我们都知道rar是闭源收费软件&#xff0c;如果直接采用命令行可能会有限制&#xff0c;或者盗版问题&#xff0c;使用正版的winrar命令行解压rar文件是否有限制&#xff0c;这个我没来得及测试&#xff0c;但是从交互体验上来说&#xff…

深兰科技科研团队6篇论文被国际医学信息科学顶尖学术会议收录

近日&#xff0c;深兰科技科学院智能科学首席科学家黄智生教授及其所带领的科研团队与同济大学团队&#xff0c;北京工业大学团队等合作&#xff0c;在国际医学信息科学顶尖学术会议“HIS 2023”上接连发表了六篇论文(其中有两篇论文的第一作者是黄教授本人)。 10月下旬&#x…

太坑了,降低 代码可读性的 12 个技巧

工作六七年以来&#xff0c;接手过无数个烂摊子&#xff0c;屎山雕花、开关编程已经成为常态。 下面细数一下 降低代码可读性&#xff0c;增加维护难度的 12 个编码“技巧”。 假设一个叫”二狗“ 的程序员&#xff0c;喜欢做以下事情。 1. 二狗积极拆分微服务&#xff0c;一个…

软文推广如何提高点击率,媒介盒子告诉你

随着软文推广的广泛应用&#xff0c;对于广告主来说&#xff0c;提高点击率已经成为一项关键任务&#xff0c;点击率直接影响广告主的投资回报率&#xff0c;今天媒介盒子将从两大方面给出软文推广如何提高点击率的建议&#xff1a; 一、 优化广告文案 广告文案是影响点击率的…

[动态规划] (十二) 简单多状态 LeetCode 213.打家劫舍II

[动态规划] (十二) 简单多状态: LeetCode 213.打家劫舍II 文章目录 [动态规划] (十二) 简单多状态: LeetCode 213.打家劫舍II题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值提醒 代码实现总结 213. 打家劫舍 II 题目解析 本题是对打家劫舍和按摩师的升级题型&am…

ae如何保存为gif格式?三个方法轻松搞定!

GIF是动态图像&#xff0c;在聊天的时候发的动态表情包就是GIF&#xff0c;非常受大家欢迎。那么如何把视频变成GIF格式呢&#xff0c;下面是一些具体的操作步骤。 一、AE 1、依次点击AE菜单栏文件 — 导出 — 添加到渲染队列 — 导出MOV视频格式 2、依次点击导入MOV — 储存W…