顺序表解析

今天我们来看一下数据结构入门---顺序表

①  顺序表的创建

顺序表分为静态顺序表和动态顺序表,想要知道顺序表的怎么创建,就必须明白一个点: 顺序表是什么?

其实,顺序表就是数组, 只不过这个数组的元素类型不确定, 这个数组与其他数组唯一的区别是:有相应的增(增加数据)删(删除数据)改(修改数据)查(查找数据)功能

举个例子: 排挡和西餐厅

在排挡里要吃"西蓝花", 你有可能直接大喊一声: 老板,再加一盘西蓝花 !   这时老板会回一句: 来了来了! 

但是当你在西餐厅里: 服务员,麻烦给我加一份"绿野仙踪"

这时餐厅的服务员不仅会给一盘西蓝花给你,还会在上面放上一副刀叉,走过来时候说一句: 您请慢用

所以"绿野仙踪" 和 "西蓝花" 是一种东西,但是两者的服务方式则是完全不一样的(其实我觉得排挡比西餐厅好吃得多哈哈哈) 

说完这些,不知道你能不能理解顺序表和普通数组的区别与联系

接下来,我们就来看看静态顺序表的创建:

//静态顺序表的创建

#define N 100

struct SeqList
{
	int arr[N];
	int size;//表示数组中有效的元素个数
};

来看一下,我在这地方定义了一个整形数组,并定义它的元素个数为 N  规定 N 为 100 ,有人说,为什么要这样写,我直接写一个 int arr[100] 

它不香吗,原因是,我后面要涉及到各种与这个数组元素个数相关的操作,如果都写个100 那将来想要对数组进行扩容,那么所有写100 的地方是不是都要变大,如果涉及到10000 行代码,我难道要改10000 行吗,反之,我现在把`100 替换成 N ,涉及到数组元素的地方全部改成 N  将来想要改变数组的元素个数(假如说要变成1000),我是不是直接把 #define N 100 改成 #define N 1000  就行了? 

那有人又问了 那你为啥要搞一个 size , 有效的元素个数难道不是 N 吗 ,当然不是, 举个例子

你们公司领导,让你和你的团队开发一个软件,那你用户容量给多少个? 你是不是肯定给大一点呀,因为你怕不够

后来发现,你确实给大了,但是后面肯定会有新用户注册进来,这时候就可以先用剩余的空间填补,就不用频繁增容了对不

所以说你当前的总容量 N 肯定是要大于有效元素个数 size ,后续才好增加数据

如果明白了这一点,那我们再往下看: 你就知道这个数组一定是整形的吗? 它有可能是 float  double char ......     那我这个地方也不能写死:

#define N 100

typedef int SLDataType;

struct SeqList
{
	SLDataType arr[N];
	int size;//数组中有效的数据个数
};

在这里同样的,这样写之后,我把后面所涉及到元素类型的操作全部替换成 SLDataType  然后想操作浮点数类型的时候,我就直接 把 int 改为 float 不就行了吗? 存有其他元素类型的数组以此类推....

这个结构体的名字是不是太长了呀?  那我把它换成 SL 后面用的时候是不是方便一点?

#define N 100

typedef int SLDataType;

typedef struct SeqList
{
	SLDataType arr[N];
	int size;//数组中有效的数据个数
}SL;

//或者: typedef struct SeqList SL;

到这里,静态顺序表的创建就完了.

而在实际开发中,一般用的是动态顺序表,其创建与静态顺序表大差不差:

typedef int SLDataType;

typedef struct SeqList
{
	SLDataType* arr;
	int size;//表示有效元素个数
	int capacity;//表示总容量(以个数为单位)
}SL;

由于动态顺序表的大小是由程序员自己指定开辟的,所以其总容量不确定.

② 顺序表相关功能的实现

(1) 顺序表的初始化: 

void SLInit(SL* ps)
{
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

有人问,这个地方为什么要用指针接收呀,原因是:如果我只是单纯用一个结构体来接收,在此函数内部会对该接收的结构体进行初始化,而不会对我想初始化的那个结构体进行操作,简单来说就是: 形参是实参的一份临时拷贝,对形参的改变不会影响实参,所以结构体在传参的时候通常传的是指针

⑵ 顺序表的尾插:

void SLPushBack(SL* ps, SLDataType x)
{
	if (ps->size == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		SLDataType* tmp =(SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = newcapacity;
	}
	ps->arr[ps->size++] = x;
}

⑶ 头插:

void SLPushFront(SL* ps, SLDataType x)
{
	SLrec(ps);//判断扩容
	for (int i = ps->size - 1; i >= 0; i--)
	{
		ps->arr[i + 1] = ps->arr[i];
	}
	ps->arr[0] = x;
	ps->size++;
}

(4) 判断扩容:

void SLrec(SL* ps)
{
	if (ps->size == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = newcapacity;
	}
}

(5)尾删:

void SLPopBack(SL* ps)
{
	ps->size--;
}

⑹ 头删:

void SLPopFront(SL* ps)
{
	for (int i = 0; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

⑺ 指定位置插入:

void SLInsert(SL* ps, int pos, SLDataType x)
{
	SLrec(ps);
	for (int i = ps->size - 1; i >= pos; i--)
	{
		ps->arr[i + 1] = ps->arr[i];
	}
	ps->arr[pos] = x;
	ps->size++;
}

⑻ 删除指定位置数据:

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

⑼ 查找数据:

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

⑽ 打印:

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

⑾ 销毁:

void SLDestory(SL* ps)
{
	if (ps->arr)
	{
		ps->arr = NULL;
	}
	ps->size = ps->capacity = 0;
}

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

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

相关文章

[VULFOCUS刷题]tomcat-pass-getshell 弱口令

tomcat-pass-getshell 弱口令 启动容器&#xff0c;打开网站 点开manageapp&#xff0c;输入弱口令 tomcat/tomcat 之后在下面上传jsp大马&#xff0c;首先生成一个jsp马 这里我直接使用github别人生成好的 tennc/webshell: This is a webshell open source project (github.…

uniapp 知识点

自定义导航 在page.json navigationstyle":"custom"navigateTo传参 页面传参只能onLoad(option)里面拿 px和upx的关系 在750设计图中&#xff0c;1px1upx 路由 navigateBack返回上一页 重定向 其实就是把当前页面干掉了 公共组件和页面共同点 computed,watc…

java项目实现钉钉异常告警实时监控

最近有个小伙伴问我&#xff0c;我们的项目核心业务的地方总是有异常&#xff0c;虽然有打印日志&#xff0c;但不能立马通知我&#xff1b;所以今天我就教大家如何实现异常报警实时提醒 1.需要有钉钉 自己新建的企业用户 2.建一个群&#xff0c;需要有三人以上&#xff1b;…

AMD发布首个AI小语言模型:6900亿token、推测解码提速3.88倍

AMD发布了自己的首个小语言模型(SLM)&#xff0c;名为“AMD-135M”。相比于越来越庞大的大语言模型(LLM)&#xff0c;它体积小巧&#xff0c;更加灵活&#xff0c;更有针对性&#xff0c;非常适合私密性、专业性很强的企业部署。 AMD-135小模型隶属于Llama家族&#xff0c;有两…

用Arduino单片机读取PCF8591模数转换器的模拟量并转化为数字输出

PCF8591是一款单芯片&#xff0c;单电源和低功耗8位CMOS数据采集设备。博文[1]对该产品已有介绍&#xff0c;此处不再赘述。但该博文是使用NVIDIA Jetson nano运行python读取输入PCF8591的模拟量的&#xff0c;读取的结果显示在屏幕上&#xff0c;或输出模拟量点亮灯。NVIDIA J…

java将word转pdf

总结 建议使用aspose-words转pdf,poi的容易出问题还丑… poi的(多行的下边框就不对了) aspose-words的(基本和word一样) poi工具转换 <!-- 处理PDF --><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres…

Redis: 集群测试和集群原理

集群测试 1 ) SET/GET 命令 测试 set 和 get 因为其他命令也基本相似&#xff0c;我们在 101 节点上尝试连接 103 $ /usr/local/redis/bin/redis-cli -c -a 123456 -h 192.168.10.103 -p 6376我们在插入或读取一个 key的时候&#xff0c;会对这个key做一个hash运算&#xff0c…

【算法】---快速排序

参考 左神和神书算法导论. 学习前置 了解并实现过快速排序。 笔者曾经在数据结构篇写过快速排序&#xff0c;现在面向算法篇快排。 快速排序 输入数据所有排列是等概率的&#xff0c; 这种情况对于实际工程上不会总是成立。朴素快速排序对于特定的输入很糟糕&#xff0c; …

Redis入门第一步:认识Redis与快速安装配置

认识Redis与快速安装配置&#x1f343; Redis是什么&#x1f432; 1.Redis的背景&#x1f38d; Redis&#xff08;Remote Dictionary Server&#xff09;译为"远程字典服务"&#xff0c;它是一款基于内存实现的键值型 NoSQL 数据库&#xff0c; 通常也被称为数据结…

Python 从入门到实战33(使用MySQL)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了数据库编程接口操作的相关知识。今天我们将学习…

音视频入门

一个视频&#xff0c;一秒内普遍大于等于25帧。 入门知识&#xff1a; 1.帧&#xff0c;一张画面就是一帧。一个视频就是由许许多多帧组成的。 帧率&#xff0c;单位时间内帧的数量。单位&#xff1a;帧/秒 或 fps。 分类&#xff1a;I帧&#xff0c;P帧&#xff0c;B帧 I…

IP协议报文

一.IP协议报头结构 二.IP协议报头拆解 1.4位版本 实际上只有两个取值&#xff0c;分别是4和6&#xff0c;4代表的是IPv4&#xff0c;6代表的是IPv6。 2.4位首部长度 IP协议报头的长度也是边长的&#xff0c;单位是*4&#xff0c;这里表示的大小为0~15&#xff0c;当数值为1…

【PyTorch】生成对抗网络

生成对抗网络是什么 概念 Generative Adversarial Nets&#xff0c;简称GAN GAN&#xff1a;生成对抗网络 —— 一种可以生成特定分布数据的模型 《Generative Adversarial Nets》 Ian J Goodfellow-2014 GAN网络结构 Recent Progress on Generative Adversarial Networks …

爬虫——同步与异步加载

一、同步加载 同步模式--阻塞模式&#xff08;就是会阻止你浏览器的一个后续加载&#xff09;停止了后续的解析 因此停止了后续的文件加载&#xff08;图像&#xff09; 比如hifini音乐网站 二、异步加载 异步加载--xhr(重点) 比如腾讯新闻&#xff0c;腾讯招聘等 三、同…

系统规划与管理——1信息系统综合知识(3)

文章目录 1.3 信息系统1.3.1 信息系统定义1.3.2 信息系统的生命周期1.3.3 信息系统常用的开发方法 1.3 信息系统 1.3.1 信息系统定义 信息系统是一种以处理信息为目的的专门的系统类型。信息系统可以是手工的&#xff0c;也可以是计算机化的。计算机化的信息系统的组成部件包…

【D3.js in Action 3 精译_025】3.4 让 D3 数据适应屏幕(中)—— 线性比例尺的用法

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

HTML:相关概念以及标签

目录 什么是网页? 什么是HTML语言? 语法规范 HTML基本结构标签 DOCTYPE,lang以及字符集 HTML常用标签 5>图像标签(重要) 除此之外还有几个调整图片属性的标签 图像标签总结 什么是网页? 我们平时使用电脑和手机都是离不开网站和网页的,那么什么是网页呢?什么又是网…

cocotb报错收集

1、原因是定义测试类的时候&#xff0c;idle_inserter的名字不一样 函数修正后 函数修正前

电脑显示mfc140u.dll丢失怎么办,分享4个有效的解决方法

1. mfc140u.dll 简介 1.1 定义与作用 mfc140u.dll 是 Microsoft Foundation Class (MFC) 库中的一个动态链接库文件&#xff0c;它是 MFC 库在 Unicode 版本中的一个特定实现。MFC 是微软为 Windows 平台开发的一套 C 类库&#xff0c;封装了众多 Windows API 函数&#xff0…

定时器定时中断定时器外部中断

基础背景&#xff1a;TIM定时中断-CSDN博客 TIM的函数 // 恢复缺省设置 void TIM_DeInit(TIM_TypeDef* TIMx); // 时基单元初始化&#xff0c;第一个参数TIMx选择某个定时器&#xff0c;第二个参数是结构体&#xff0c;包含了配置时基单元的一些参数。 void TIM_TimeBaseInit…