【C语言数据结构】

news2024/9/21 14:08:48

一. 线性表

通俗的讲,线性表是具有相同特性的数据结构的集合

逻辑结构(人为想象出来的数据的组织形式):都是线性的

物理结构(数据在内存中的存储形式):不一定是线性的

二. 顺序表

顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构

⼀般情况下采⽤数组存储。由此可知,其底层结构就是数组。

1. 顺序表的模拟

a. 准备工作,创立三个文件

b. 注意,如下模拟的所有功能函数传入都必须传递地址,而非传参!

否则函数里的形参无法改变实际的结构体实参数据!

区别:

  • 传参(struct s):形参是实参的值的拷贝,但形参与实参是保存数据一样,指向的是两块完全不同的地址。(传入参数 func(s) )

        举个例子,就像两个人考了一样的分数,但是是截然不同的俩个人。

  • 传地址 (struct* s):形参指向实参的地址 (传入参数 func(&s) )

(1)用结构体定义顺序表 

typedef int SLDataType;//这里自定义,方便数组以后变更成其他类型
struct SeqList
{
	SLDataType* arr;
	int capacity;//容量空间大小
	int size;//有效数据个数
}SL;

(2)顺序表的初始化

void SLInit(SL* ps)
{
	//判断ps是否为空指针
	assert(ps);
	ps->arr=NULL;//初始指针设置为空,arr不分配空间,等用的时候再去申请
	ps->capacity = ps->size = 0;//初始容量默认为0
}

(3)顺序表的销毁

void SLDestory(SL* ps)
{
	//用完了,释放空间
	if (ps->arr != NULL) {
		free(ps->arr);
	}
	//初始化,防止野指针与浪费空间
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

(4)顺序表的打印

void SLPrint(SL* ps) {
	assert(ps);
	for (int i = 0; i < ps->size; i++) {
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}

(5)顺序表的扩容检查

(用于插入数据的检查)

 在进行增加元素的时候,需要用到,因为不确定空间是否足够

void SLCheckCapacity(SL* ps) {
	assert(ps);
	//判断空间是否满了
	if (ps->capacity == ps->size) {
		//由于增容是以倍数相乘,需要单独处理capacity为0 的情况
		int NewCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//是0,第一次添加元素,容量设为4;不是0,增容2倍
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, NewCapacity * sizeof(SLDataType));
		//ps->capacity,,,,,NewCapacity这个才是要扩容的大小,
		// ps->capacity!这个是扩容之前的


		//判断tmp是否空指针,扩容是否成功
		//扩容失败,终止程序
		if (tmp == NULL) {
			perror("realloc fail!");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = NewCapacity;
	}
}

(6)插入数据

a. 尾插法
void SLPushBack(SL* ps, int x) {
	assert(ps);
	SLCheckCapacity(ps);
	ps->arr[ps->size++] = x;
}
b. 头插法
void SLPushFront(SL* ps, int x) {
	assert(ps); 
	SLCheckCapacity(ps);
	
	for (int i = ps->size; i > 0; i--) {
		ps->arr[i] = ps->arr[i - 1];
		
	}

	ps->arr[0] = x;
	ps->size++;
}
c. 在指定位置插入
void SLInsert(SL* ps, int pos,int x) {
	assert(ps);
	SLCheckCapacity(ps);
	if (pos<0 && pos>ps->size ) {
		perror("pos不合法!");
		return;
	}
	for (int i = ps->size; i > pos; i--) {
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[pos] = x;
	ps->size++;
}

(7)删除数据

无论是尾删还是头删,都要对顺序表进行检查表中是否还有元素,即判断size是否为0!

a. 尾删法
void SLPopBack(SL* ps) {
	assert(ps);
	//注意!size不可为0!
	assert(ps->size);
	ps->size--;
}
b. 头删法
void SLPopFront(SL* ps) {
	assert(ps);
	//注意!size不可为0!
	assert(ps->size);
	for (int i = 0; i < ps->size-1; i++) {
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}
c. 在指定位置删除
void SLErase(SL* ps, int pos) {
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	for (int i = pos ; i < ps->size-1; i++) {
		ps->arr[i] = ps->arr[i+1];
	}
	ps->size--;
}

(8)查找

int SLFind(SL* ps, SLDataType key) {
	for (int i = 0; i < ps->size; i++) {
		if (key == ps->arr[i]) {
			return i;
		}
		
	}
	return -1;
}

希望对你有帮助

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

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

相关文章

构建高效AI中台:解析人工智能中台架构的五大核心层

在人工智能技术蓬勃发展的今天&#xff0c;企业迫切需要一种高效、灵活的方式来整合、管理和应用AI技术。人工智能中台&#xff08;AI Middle Platform&#xff09;应运而生&#xff0c;它为企业提供了一个统一的技术平台&#xff0c;能够有效支撑多样化的业务需求&#xff0c;…

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础&#xff1a;WAV专题&#xff08;6&#xff09;——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道&#xff0c;通过FFprobe命令可以打印WAV音频文件每个packet&#xff08;也称为数据包或多媒体包&#xff09;的信息&#xff0…

无人机动力系统设计之桨叶推力计算

无人机动力系统设计之桨叶推力计算 1. 源由2. 关键参数2.1 特性参数2.1.1 材质&#xff08;Material&#xff09;2.1.2 叶片数量&#xff08;Number of Blades&#xff09;2.1.3 重量&#xff08;Weight&#xff09; 2.1.4 噪音水平&#xff08;Noise Level&#xff09;2.2 安装…

开敞式屋脊通风天窗,“0”差评厂房通风换气设备!

开敞式屋脊通风天窗作为常见的通风设备&#xff0c;在现代建筑设计中尤其是在工业厂房中扮演着重要角色。 开敞式屋脊通风天窗是安装在建筑屋顶屋脊位置且处于常开状态&#xff0c;没有安装启闭阀板的通风天窗。这种设计允许空气自由流通&#xff0c;无需依赖机械动力&#xff…

乱弹篇(46)白露闲谈

昨&#xff08;7日&#xff09;天11时11分&#xff0c;已经进入2024年的白露节气&#xff0c;今天本“人民体验官”推广人民日报官方微博文化产品《诗句里的秋天》&#xff0c;旨在提醒亲友已是“秋风何冽冽&#xff0c;白露为朝霜”时令&#xff0c;天气开始转凉&#xff0c;早…

AI模型应根据应用场景选择全能型或者专精型

文章目录 一、前言二、选择全能型2.1 优势2.2 劣势 三、选择专精型3.1 优势3.2 劣势 四、权衡选择五、总结 一、前言 AI模型的发展方向&#xff0c;在追求全能与专精之间并非简单的二选一&#xff0c;都取决于其应用场景、设计目标以及技术可行性等多个因素。这两种策略各有优…

CodeFormer——卓越的AI照片修复工具,能够轻松消除图片以及视频中的马赛克,还原清晰画质。

CodeFormer是什么 CodeFormer是一款由南洋理工大学和商汤科技联合开发的AI照片和视频修复工具。融合了变分自动编码器&#xff08;VQGAN&#xff09;和Transformer技术&#xff0c;对模糊和马赛克的照片或视频进行高质量的修复。CodeFormer通过先进的算法优化图像细节&#xf…

【软考中级攻略站】-软件设计师(5)- 软件工程

软件生存周期 什么是软件生存周期&#xff1f; 软件生存周期指的是一个软件从开始构思到最终停止使用&#xff08;或被替换&#xff09;的整个过程。就像人的生命一样&#xff0c;软件也有一个从出生到死亡的过程。 软件生存周期的几个阶段 软件生存周期通常可以分为以下几…

LabVIEW步进电机控制方式

在LabVIEW中控制步进电机可以通过多种方式实现。每种方法都有其独特的优缺点&#xff0c;适用于不同的应用场合。下面详细介绍几种常见的步进电机控制方式&#xff0c;并进行比较。 1. 开环控制&#xff08;Open-Loop Control&#xff09; 特点 通过定期发出脉冲信号来控制步进…

基于SSM的流浪动物管理系统的设计与实现82901

摘要 随着移动互联网的快速发展&#xff0c;小程序作为一种新型的应用形态&#xff0c;已经深入到人们的生活中。在高校中&#xff0c;实验室领养管理是一个重要的环节&#xff0c;但传统的领养方式存在着诸多问题&#xff0c;如领养流程繁琐、信息不透明等。因此&#xff0c;本…

陕西农信银行合规知识竞赛活动方案

初赛 1.利用赛易线上答题平台。参与人通过手机、平板或电脑等方式&#xff0c;注册个人基本信息登录进行答题。 2.答题平台在题库中随机抽取试题。 3.参与人在出现第一次答错后&#xff0c;答题平台即终止答题。 4.平台统计参与人答题时间、答题数&#xff0c;同时以正确答题数…

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label…

第12章 谁最便宜就选谁——MySQL基于成本的优化

12.1 什么是成本 I/O 成本 当我们想查询表中的记录时&#xff0c;需要先把数据或者索引从磁盘加载到内存中再操作。 CPU 成本 读取以及检测记录是否满足对应的搜索条件、对结构集进行排序等这些操作损耗。 对于InnoDB来说&#xff0c;页是磁盘和内存之间交互的基本单位。MyS…

《AI 大模型进阶指南:零基础迈向精通,看这一篇足矣!》

一、初聊大模型 &#xff08;一&#xff09;为什么要学习大模型&#xff1f; 在当今这个快速变化的时代&#xff0c;新技术和概念不断涌现&#xff0c;大模型因其强大的功能和广泛的应用而备受推崇。在学习大模型之前&#xff0c;不必担忧自身缺乏相关知识或觉得其难度过高。…

Finalshell上传文件失败或者进度总为百分之零解决

1.点击复制标签 2.关闭原标签后即可顺利上传 3.如果还是不行,则用chmod 777 文件路径,改变文件的权限

物联网控制箱

随着科技的飞速发展&#xff0c;物联网&#xff08;Internet of Things, IoT&#xff09;技术已经深入我们生活的方方面面&#xff0c;从智能家居到智慧城市&#xff0c;从工业制造到农业管理&#xff0c;物联网正以前所未有的方式改变着世界。唯众的物联网控制箱正是这一趋势下…

技术分享-商城篇-优惠券管理-功能介绍及种类(二十四)

前言 在前面文章中&#xff0c;我们聊到了商城的基础架构和基础功能&#xff0c;它们是构建商城体系的底座&#xff0c;是基础&#xff0c;没有构建出基础&#xff0c;是无法打造高楼大厦的&#xff0c;但是我们在做完基础之后&#xff0c;还得继续深挖其他的功能&#xff0c;…

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第二期]

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第二期] 第二期介绍&#xff1a;频道模块之频道管理 目录 QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第二期]第二期介绍&#xff1a;频道模块之频道管理获取用户详情获取用户频道列表获取频道详情获取子频道列表获…

❤ Node05-增删改查接口优化

❤ Node05-增删改查接口优化 1、优化用户查询接口&#xff0c;根据用户条件查询我们的列表 ​ 先拿sql数据命令试试 SELECT * FROM user WHERE name san娟; 我们的查询命令没问题&#xff0c;接下来把我们的传入的活数据给传入进去即可 &#xff08;1&#xff09;传入查询…

游泳馆押金管理+手牌管理+刷手牌 开通方法

一、游泳馆手牌押金管理 1. 减少手牌丢失&#xff1a;收取押金可以让顾客更加谨慎地保管手牌&#xff0c;降低手牌丢失的概率。 2. 保障设施安全&#xff1a;有助于防止顾客对手牌的不当使用或故意破坏&#xff0c;保护游泳馆的设施和资源。 3. 规范顾客行为&#xff1a;促使…