【数据结构】新篇章 -- 顺序表

🌈 个人主页:白子寰
🔥 分类专栏:python从入门到精通,魔法指针,进阶C++,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分80+),分享更多关于深度学习、C/C++,python领域的优质内  容!(希望得到您的关注~) 

 

目录

数据结构

概念

为什么需要数据结构 

使用数据结构的效果

线性表

概念

顺序表与数组的区别 

顺序表导图

动态顺序表 

typedef定义结构的两种方法

空间不够,扩容

尾部插入数据

头部插入数据

 尾部数据删除

头部数据删除

指定位置之前插入数据 

删除指定位置数据

查找顺序表中元素位置

销毁


数据结构

概念

数据结构是计算机存储组织数据的方式

为什么需要数据结构 

在这之前我们学过数组,数组是最基础的数据结构

那为什么学了数组还用学数据结构呢?

最基础的数据结构能够提供的操作已经不能完全满足复杂算法实现

使用数据结构的效果

1)能够将数据存储

     (顺序表、链表等结构)

2)方便查看存储的数据 

线性表

概念

线性表在逻辑上是线性结构,也就是说是连续的一条直线

                      但在物理结构上并不一定是连续的

线性表物理上存储时,通常以数组和链式结构的形式存储

常见的线性表:

顺序表、链表、栈、队列、字符串

顺序表与数组的区别 

顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口

顺序表导图

动态顺序表 

SX.h:定义顺序表的结构,顺序要实现的接口/方法

SX.c:具体实现顺序表里定义的接口/方法

test.c:测试顺序表

typedef定义结构的两种方法

//第一种方法

//数据类型
typedef int datatype;

//结构体
struct shunxu
{
	datatype* arr; //存储数据的底层结构:数组
	int size;      //顺序表空间大小
	int nowsize;   //顺序表有效数据个数
};

typedef struct shunxu SX;
//第二种方法

//数据类型
typedef int datatype;

//结构体
typedef struct shunxu
{
	datatype* arr; //存储数据的底层结构:数组
	int size;      //顺序表空间大小
	int nowsize;   //顺序表有效数据个数
}SX;

以下是在SX.h中实现顺序表 

空间不够,扩容

//空间不够,扩容
void publicKUOR(SX* ps)
{
    //如果顺序表空间大小 = 顺序表空间有效个数
	if (ps->size == ps->nowsize)
	{
		//三目操作符
		int newnowsize = ps->nowsize == 0 ? 4 : 2 * sizeof(datatype);
		//新建一个临时变量,因为如果realloc扩容失败,会造成技术事故
		datatype* tmp = (datatype*)realloc(ps->arr, newnowsize * sizeof(datatype));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(1);
		}
		//扩容后的数组
		ps->arr = tmp;
		//扩容后的有效空间大小
		ps->nowsize = newnowsize;
	}
}

 

尾部插入数据

 

//顺序表的尾插
void CHARUback(SX* ps, datatype x)
{
	//方式一:断言 -- 暴力方式 --会报错且知道具体错误位置
	assert(ps);
	//方式二:断言 -- 温柔方式--会报错,不知道具体错误位置
	/*if (ps == NULL)
	{
		return;
	}*/

	//空间不够,扩容
	publicKUOR(ps);
	//空间足够,直接插入
	/*第一种写法*/
	//ps->arr[ps->size] = x;
	//ps->size++;
	/*第二种写法*/
	ps->arr[ps->size++] = x;

}

头部插入数据

//头插
void CHARUfront(SX* ps, datatype x)
{
    //判断ps是否为空指针
	assert(ps);
	//空间不够,扩容
	publicKUOR(ps);
	//空间足够,数据往后挪一位
	int i = 0;
	for (i = ps->size; i > 0; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[0] = x;
	ps->size++;
}

 尾部数据删除

//尾部删除
void SXdestroyback(SX* ps)
{
    //判断ps是否为有效指针
	assert(ps);
    //判断顺序表中有无数据
	assert(ps->size);
	
	//顺序表不为空
	ps->size--;
}

头部数据删除

//头部删除
void SXdestroyfront(SX* ps)
{
	//判断ps是否为有效指针
	assert(ps);
	//判断顺序表是否有数据
	assert(ps->size);

	//顺序表不为空,往前挪
	for (int i = 0; i < ps->size-1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

指定位置之前插入数据 

//指定位置之前插入数据
//顺序表下标位置pos
void SXpointfrontestroy(SX* ps,int pos,datatype x)
{
	//判断ps是否为有效指针
	assert(ps);
	//断言,保证下标pos>=0且pos小于等于顺序表空间大小size
	assert(pos >= 0 && pos <= ps->size);

	for (int i = ps->size; i < pos; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[pos] = x;
	ps->size++;
}

删除指定位置数据

//删除指定位置数据
void SXpointdestroy(SX* ps, int pos)
{
	//判断ps是否为有效指针
	assert(ps);
	//断言,保证下标pos>=0且pos小于顺序表空间大小size
	assert(pos >= 0 && pos < ps->size);

	for (int i = pos; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

查找顺序表中元素位置

//查找顺序表元素位置
int SXfind(SX* ps, datatype x)
{
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x)
		{
			return i;
		}
	}
	return -1;
}

销毁

void SXdestroy(SX* ps)
{
	//保证指针有效
	assert(ps);

	if (ps->arr)
	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->size = ps->nowsize = 0;
}

 ***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“走过这场雾,就是柏林的冬”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。

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

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

相关文章

【算法】第一篇 外观数列

导航 1. 简介2. 生成规则3. 代码演示1. 简介 外观数列是指数列中的每一项都是描述前一项的外观或者外貌。它通常由初始项开始,通过描述前一项的外观来生成下一项。外观数列最初由John H. Conway在1969年发现,并在他的著作《外貌数列和自动机理论》(The Construction of Look…

TongWeb7.0-8.0Java代码使用JMX获取应用通道端口

以下通过java代码实现获取TongWeb7.0/8.0应用通道端口使用到的JMX均为TongWeb自带的JMX功能。 一、TongWeb7.0 1、使用本地JMX获取应用通道端口 public String getTw7PortByLocalJmx() { try { MBeanServer beanServer ManagementFactory.getPlatformMBeanServer(); Set&l…

基于Python微博舆情数据爬虫可视化分析系统(NLP情感分析+爬虫+机器学习)

这里写目录标题 基于Python微博舆情数据爬虫可视化分析系统(NLP情感分析爬虫机器学习)一、项目概述二、微博热词统计析三、微博文章分析四、微博评论分析五、微博舆情分析六、项目展示七、结语 基于Python微博舆情数据爬虫可视化分析系统(NLP情感分析爬虫机器学习) 一、项目概…

2023年第十四届蓝桥杯大赛软件类省赛CC++大学C 组真题(代码完整题解)

C题-三国游戏⭐ 标签&#xff1a;贪心 简述&#xff1a;三个国家初始人数都为0&#xff0c;n个事件&#xff0c;第i个事件若发生每个国家分别加Ai&#xff0c;Bi&#xff0c;Ci人&#xff0c;求最多发生几个事件使得两个国家人数之和小于第三国 链接&#xff1a;三国游戏 思…

深入解析消息认证码(MAC)算法:HmacMD5与HmacSHA1

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 引言一、消息认证码&#xff08;MAC&#xff09;简介二、HmacMD5算法HmacMD5算法的工作原理 三、HmacSHA1算法HmacSHA1算法的…

直流马达驱动芯片D6289ADA介绍

应用领域 适用于智能断路器&#xff08;家用或工业智能空开&#xff09;、新能源汽车充电枪锁、电动玩具、电磁门锁、自动阀门等的直流电机驱动。 功能介绍 D6289ADA是一款直流马达驱动芯片&#xff0c;它有两个逻辑输入端子用来控制电机前进、后退及制动。该电路具有良好的抗干…

2024软件设计师备考讲义——(8)

操作系统 〇、操作系统概述 OS作用、OS特征、OS分类 作用&#xff1a;提高计算机效率&#xff0c;人机交互友好特征&#xff1a;并发性、共享性、虚拟性、不确定性分类&#xff1a;批处理、分时、实时、网络、分布式、微机嵌入式操作系统&#xff1a;微型化、可定制、实时性、可…

岭师大数据技术原理与应用-序章-软工版

HeZaoCha-CSDN博客 序章—软工版 一、环境介绍1. VMware Workstation Pro2. CentOS3. Java4. Hadoop5. HBase6. MySQL7. Hive 二、系统安装1. 虚拟网络编辑器2. 操作系统安装 三、结尾 先说说哥们写这系列博客的原因&#xff0c;本来学完咱也没想着再管部署这部分问题的说&…

卷积神经网络(CNN)——基础知识整理

文章目录 1、卷积神经网络 2、图片格式 3、图片卷积运算 4、Kernel 与 Feature Map 5、padding/边缘填充 6、Stride/步长 7、pooling/池化 8、shape 9、epoch、batch、Batch Size、step 10、神经网络 11、激活函数 1、卷积神经网络 既然叫卷积神经网络&#xff0c;这里面首先是…

设计模式——结构型——外观模式Facade

处理器类 public class Cpu {public void start() {System.out.println("处理器启动了...");} } 内存类 public class Memory {public void start() {System.out.println("内存启动了...");} } 硬盘类 public class Disk {public void start() {Syste…

【娱乐】战双帕弥什游戏笔记攻略

文章目录 Part.I IntroductionChap.I Information Part.II 新手攻略Chap.I 角色和武器挑选Chap.II 新手意识推荐 Part.II 阵容搭配Chap.I 一拖二Chap.II 毕业队 Reference Part.I Introduction 2019年12月5日全平台公测。 偶然间入坑战双&#xff0c;玩了几天&#xff0c;觉得…

V R虚拟现实元宇宙的前景|虚拟现实体验店加 盟合作|V R设备在线购买

VR&#xff08;虚拟现实&#xff09;技术作为一种新兴的技术&#xff0c;正在逐渐改变人们的生活和工作方式。随着技术的不断进步&#xff0c;人们对于元宇宙的概念也越来越感兴趣。元宇宙是一个虚拟世界&#xff0c;通过VR技术可以实现人们在其中进行各种活动和交互。 元宇宙的…

戴尔灵越3000来说2.5G的双核显存能干啥?

吃鸡已经成为大家耳熟能详的网络游戏。 很多人认为&#xff0c;想要享受吃鸡的乐趣&#xff0c;就必须组装一台高端电脑。 虽然配置越高越好&#xff0c;但现实是很多配置都是以性能为标准的。 有余了&#xff0c;没必要刻意追求高配置、高特效。 说实话&#xff0c;吃鸡不一定…

【Qt】:多种方式编辑hello world

多种方式编辑hello world 一.QLabel二.对象树三.使用单行编辑框四.使用按钮 (小技巧&#xff1a;1.可以使用F4来进行头文件和对应cpp文件的切换&#xff1b;2.写完一个函数的声名之后,按下altenter,就可以自动的在对应的cpp 文件中添加函数的定义了.) 一.QLabel 注意这里是QSt…

数据可视化基础与应用-04-seaborn库从入门到精通01-02

总结 本系列是数据可视化基础与应用的第04篇seaborn&#xff0c;是seaborn从入门到精通系列第1-2篇。本系列的目的是可以完整的完成seaborn从入门到精通。主要介绍基于seaborn实现数据可视化。 参考 参考:数据可视化-seaborn seaborn从入门到精通01-seaborn介绍与load_datas…

【SpringCloud】Ribbon负载均衡

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 …

java多线程中的阻塞队列

一、普通不阻塞队列 还记得队列我们如何实现吗&#xff1f;我们用的是循环队列的方式&#xff0c;回一下&#xff1a; 描述&#xff1a;开始tail和head指针都指向最开始位置&#xff0c;往里面添加元素tail&#xff0c;出元素head 初始状态&#xff1a; put元素后状态 take…

KOSMOS-2.5: A Multimodal Literate Model

KOSMOS-2.5: A Multimodal Literate Model 相关链接&#xff1a;arXiv 关键字&#xff1a;multimodal、literate model、text-intensive images、Transformer architecture、document-level text recognition 摘要 我们介绍了KOSMOS-2.5&#xff0c;这是一个用于机器阅读文本密…

2024知乎广告推广怎么做,知乎推广教程!

随着社交媒体影响力的日益增强&#xff0c;知乎作为中国高质量知识分享社区的代表&#xff0c;已经成为品牌方精准触达目标受众的重要阵地。云衔科技凭借其专业的一站式广告服务能力&#xff0c;为企业提供知乎广告开户及代运营解决方案&#xff0c;助力企业在知乎平台上实现品…

这6个png免抠素材网,免费下载,值得收藏!

找png免抠素材&#xff0c;就上这6个网站&#xff0c;免费下载&#xff0c;可商用。设计师必备&#xff0c;赶紧收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/searchlist/66008----all-0-1.html?vNTYxMjky 网站主要分享设计素材为主。像平面海报、免抠元素、背景图…