数据结构——顺序表
文章目录
- 🐨0. 前言
- 🎈1. 顺序表的概念及定义
- 🪁2. 接口的声明
- 🪄3. 接口的实现
- 🍅3.1 为何使用断言?
- 🍒3.2 初始化与销毁
- 🍓3.3 尾插与尾删
- 🍉3.4 头插与头删
- 🍹3.5 指定位置插入与删除
- 🥂3.6 查找元素
- 🥊4. 接口测试
🐨0. 前言
- 线性表是一种最常用且最简单的一种数据结构。简单来说线性表是n个具有相同特性的数据元素的有序序列,即存在唯一的开始元素和一个终止元素,除开始元素和终止元素外,每个元素都有一个前驱元素和一个后继元素。
- 线性表是一种在实际中广发使用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串…
- 线性表是在逻辑上是线性结构,但在物理结构上不一定连续,线性表在物理上存储时,通常以数组和链式结构的形式进行存储。
本篇文章则讲解的是顺序表。
🎈1. 顺序表的概念及定义
顺序表指的是用一组地址连续的存储单元依次存储元素的线性结构,一般情况采用数组存储。
数组存储的是类型相同的元素,那顺序表,则完全符合要求。所以我们的顺序采用数组来进行存储。
顺序表可分为两种:
- 静态顺序表:使用定长数组存储元素。
- 动态顺序表:使用开辟动态的数组存储。
那么用哪种更好一点呢?如果用静态顺序表存储,假设指定数组的长度为1000,那么如果想要存放2000个数据,则无法存放;那假设指定长度为2000,那确实可以存放2000个数据,但是,如果我们只存储100个数据呢?这是不是就造成了空间的浪费。这使得我们十分难受,开多了资源浪费,开少了不够用。动态顺序表则可以很好的解决这个问题,可以按需申请。本篇主要讲解的动态顺序表的实现。
🪁2. 接口的声明
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//动态顺序表
typedef int SLDateType;
#define INIT_CAPACITY 4 //初始化容量
typedef struct SeqList
{SLDateType* a;SLDateType size;//有效数据个数SLDateType capacity;//空间容量
}SL;//增删查改//初始化顺序表
void SLInit(SL* s);
//销毁顺序表
void SLDestroy(SL* s);
//打印顺序表
void SLPrint(SL* s);
//尾插
void SLPushBack(SL* s, SLDateType x);
//尾删
void SLPopBack(SL* s);
//头插
void SLPushFront(SL* s,SLDateType x);
//头删
void SLPopFront(SL* s);
//指定位置插入
void SLInsert(SL* s, int pos, SLDateType x);
//指定位置删除
void SLErase(SL* s, int pos);
//查找元素
int SLFind(SL* s, SLDateType x);
这个顺序表不是结构体,而是结构体里面的a,指向了顺序表向内存申请的空间,size表示当前顺序表里面已经存放了多少个数据,capacity表示当前顺序表的总容量。
🪄3. 接口的实现
🍅3.1 为何使用断言?
这里如果传空指针,程序会继续执行,那么最后会挂掉。然而我们不知道程序是在哪出错,还得一步一步调试找出问题。使用断言则会直接报错,并告诉我们错误所出现的位置。
使用断言的好处:
帮助程序员发现并修复程序中的错误,提高代码质量和可读性,同时也可以帮助程序员更好地设计程序,提高程序的正确性和可靠性。
🍒3.2 初始化与销毁
//初始化
void SLInit(SL* s)
{aassert(s);s->a = (SLDateType*)malloc(sizeof(SLDateType) * INIT_CAPACITY);if (s->a == NULL){perror("malloc fail");return;}s->size = 0;s->capacity = INIT_CAPACITY;
}//销毁顺序表
void SLDestroy(SL* s)
{assert(s);free(s->a);s->a = NULL;s->capacity = 0;s->size = 0;
}
🍓3.3 尾插与尾删
//容量检查
void SLCheackCapacity(SL* ps)
{assert(ps);if (ps->size == ps->capacity){//扩容//用临时变量接收,防止扩容失败,导致之前的数据丢失SLDateType* tmp = (SLDateType*)realloc(ps->a, sizeof(SLDateType) * 2 * ps->capacity);if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;}
}//尾插
void SLPushBack(SL* ps, SLDateType x)
{assert(ps);//检查容量SLCheackCapacity(ps);ps->a[ps->size] = x;ps->size++;
}//尾删
void SLPopBack(SL* ps)
{assert(ps->size);ps->size--;
}
📝小贴士:
1.因为是动态顺序表,所以每次添加数据的时候需要确实容量是否够用。
2.在进行尾删的时候,如果顺序表里面,没有内容,则不必进行删除,所以需要断言判断,顺序表里面是否还有数据。
🍉3.4 头插与头删
//头插
void SLPushFront(SL* ps, SLDateType x)
{assert(ps);SLCheackCapacity(ps);int end = ps->size - 1;while (end >= 0){//将顺序表元素往后偏移ps->a[end + 1] = ps->a[end];end--;}//直接覆盖ps->a[0] = x;ps->size++;
}//头删
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size > 0);int start = 0;while (start < ps->size-1){ps->a[start] = ps->a[start+1];start++;}ps->size--;
}
头插和头删,每次都需要挪动数据,效率比较低,由此看来,顺序表并不是很适合头插与头删。
头插/头删时间复杂度:O(n2)
尾插/尾删时间复杂度:O(n)
🍹3.5 指定位置插入与删除
//指定位置插入
void SLInsert(SL* ps, int pos, SLDateType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheackCapacity(ps);int end = ps->size - 1;while (end >= pos){//从后往前挪动ps->a[end+1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}//指定位置删除
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int start = pos;while (start < ps->size - 1){ps->a[start] = ps->a[start + 1];start++;}ps->size--;
}
其实当我们实现指定位置插入删除之后,那么就可以取代我们前面写的头插(删)、尾插(删)。
//尾插
SLInsert(ps, ps->size, x);
//尾删
SLErase(ps, ps->size - 1);
//头插
SLInsert(ps, 0, x);
//头删
SLInsert(ps, 0, x);
🥂3.6 查找元素
//查找元素
int SLFind(SL* ps, SLDateType x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->a[i] == x){return i;}}return -1;
}
🥊4. 接口测试
我们在实现各个接口功能的时候,如果一次性写完,这很难以保证不出bug,所以我们可以编写边测试,以便于我们更清楚的知道程序每个功能是否完善。
#include"SeqList.h"void TestSeqList1()
{SL s;//初始化测试SLInit(&s);//尾插测试for (int i = 0; i < 10; i++){SLPushBack(&s, i);}SLPrint(&s);//尾删测试for (int i = 0; i < 10; i++){SLPopBack(&s);}SLPrint(&s);//头插测试for (int i = 0; i < 10; i++){SLPushFront(&s, i);}SLPrint(&s);//头删测试/*for (int i = 0; i < 10; i++){SLPopFront(&s);SLPrint(&s);}*///指定插入测试for (int i = 0; i < 5; i++){SLInsert(&s, i+1, i);}SLPrint(&s);//指定删除测试SLErase(&s, 2);SLPrint(&s);SLErase(&s, 3);SLPrint(&s);//查找元素测试printf("%d\n", SLFind(&s, 5));
}int main()
{TestSeqList1();return 0;
}
相关文章:
数据结构——顺序表
文章目录🐨0. 前言🎈1. 顺序表的概念及定义🪁2. 接口的声明🪄3. 接口的实现🍅3.1 为何使用断言?🍒3.2 初始化与销毁🍓3.3 尾插与尾删🍉3.4 头插与头删🍹3.5 指…...
闪存系统性能优化方向集锦?AC timing? Cache? 多路并发?
1. 从Flash系统的性能提升说起从消费级产品到数据中心企业级场景,NAND Flash凭借其高性能、大容量、低功耗以及低成本等特性大受欢迎,是目前应用最为广泛的半导体非易失存储介质。为了满足业务场景越来越严苛的性能要求,人们想了许多方法来提…...
【每日一题】——网购
🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟢 读书笔记 🟡 C语言跬步积累 🌈座右铭:广积粮,缓称…...
百度终于要出手了?文心一言
文心一言 百度全新一代知识增强大语言模型,文心大模型家族的新成员,能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。 前几天炒的风风火火的ChatGPT,虽然 ChatGPT 很强大&a…...
8年Java架构师面试官教你正确的面试姿势,10W字面试题带你成功上岸大厂
从最开始的面试者变成现在的面试官,工作多年以及在面试中,我经常能体会到,有些面试者确实是认真努力工作,但坦白说表现出的能力水平却不足以通过面试,通常是两方面原因: 1、“知其然不知其所以然”。做了多…...
Mybatis-Plus详解
简介MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。特性(官网提供)无侵入:只做增强…...
购物清单(蓝桥杯C/C++省赛)
目录 1 问题描述 2 文件的读取格式 3 代码实现 1 问题描述 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。 这不,XX大促销又来了!老板…...
【蓝桥杯集训·每日一题】AcWing 4496. 吃水果
文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴求组合数一、题目 1、原题链接 4496. 吃水果 2、题目描述 n 个小朋友站成一排,等着吃水果。 一共有 m 种水果,每种水果的数量都足够多。 现在&…...
selenium(6)-----unittest框架
unittest框架 1)测试固件 1)setUp()是用来初始化测试环境所做的工作 2)tearDown()是用来清理环境所做的工作 2)测试套件 把不同的测试脚本,不同类中的测试用例给组织起来放到一个测试套中执行 3)测试用例的要以test_开头 4)如何使用unittest框架 只需要在脚本中定义…...
统计软件与数据分析--Lesson3
dataframe数据常用python操作dataframe数据常用知识点1.创建dataframe1.1使用字典创建DataFrame:1.2使用列表创建DataFrame:1.3使用numpy数组创建DataFrame:1.4从TXT文件中创建DataFrame:1.5从CSV文件中创建DataFrame:…...
竞赛无人机搭积木式编程——以2022年TI电赛送货无人机一等奖复现为例学习(7月B题)
在学习本教程前,请确保已经学习了前4讲中无人机相关坐标系知识、基础飞行控制函数、激光雷达SLAM定位条件下的室内定点控制、自动飞行支持函数、导航控制函数等入门阶段的先导教程。 同时用户在做二次开发自定义的飞行任务时,可以参照第5讲中2021年国赛植…...
oracle基础操作
oracle基础操作语法: 1、查询会话 SQL> select count(*) from v$session;2、增大连接数 SQL> alter system set processes5000 scope spfile;3、增大会话数 SQL> alter system set sessions7552 scopespfile;4、查询 参数: SQL> sho…...
python爬虫数据写入excel
在Jmeter118中描述了如何将接口请求的响应数据写入到csv中,同样的接口如果采用python写法,会简便很多,主要是用到了python中的pandas库#爬取展台数据import requestsimport pandas as pdurlhttps://ficonline.cfaa.cn/Exhibition/searchExhib…...
优思学院|六西格玛DMAIC,傻傻搞不清?
DMAIC还是搞不清? DMAIC是一个用于过程改进和六西格玛的问题解决方法论。它是以下五个步骤的缩写: 定义(Define):明确问题,设定项目的目标和目的。绘制流程图,并收集数据,以建立未来…...
【Linux】网络编程套接字(下)
🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…...
【Linux网络】网络编程套接字(上)
🎇Linux: 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看见坚持…...
十二、51单片机之DS1302
1、DS1302简介 (1)详情查看数据手册。 (2)管角描述 管教名称功能1Vcc2双供电配置中的主电源供电引脚2X1与标准的32.768kHz晶振相连。用于ds1302记时。3X24GND电源地5CE输入信号,CE信号在读写时必须保持高电平6I/O输入/推挽输出I/O,是三线接口的双向数…...
ChatGPT-4震撼发布
3月15日消息,美国当地时间周二,人工智能研究公司OpenAI发布了其下一代大型语言模型GPT-4,这是其支持ChatGPT和新必应等应用程序的最新AI大型语言模型。该公司表示,该模型在许多专业测试中的表现超出了“人类水平”。GPT-4, 相较于…...
HTML樱花飘落
樱花效果 FOR YOU GIRL 以梦为马,不负韶华 LOVE YOU FOREVER 实现代码 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head><meta http-equiv"…...
力扣-排名靠前的旅行者
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:1407. 排名靠前的旅行者二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其…...
马上要面试了,还有八股文没理解?让ChatGPT来给你讲讲吧——如何更好使用ChatGPT?
最近这段时间 ChatGPT 掀起了一阵 AI 热潮,目前来看网上大部分内容都是在调戏 AI,很少有人写如何用 ChatGPT 做正事儿。 作为一个大部分知识都是从搜索引擎和 GitHub 学来的程序员,第一次和 ChatGPT 促膝长谈后,基本认定了一个事…...
怎么避免服务内存溢出?
在高并发、高吞吐的场景下,很多简单的事情,会变得非常复杂,而很多程序并没有在设计时针对高并发高吞吐量的情况做好内存管理。 自动内存管理机制的实现原理 做内存管理,主要考虑申请内存和内存回收两部分。 申请内存的步骤&…...
01_I.MX6U芯片简介
目录 I.MX6芯片简介 Corterx -A7架构简介 Cortex-A处理器运行模型 Cortex-A 寄存器组 IMX6U IO表示形式 I.MX6芯片简介 ARM Cortex-A7内核可达900 MHz,128 KB L2缓存。 并行24bit RGB LCD接口,可以支持1366*768分辨率。 3.8/10/16位 并行摄像头传感器接口(CS…...
嵌入式学习笔记——STM32的中断控制体系
STM32的中断控制体系前言STM32中断的概念中断类型中断控制常用控制函数区分中断源与中断信号配置中断优先级分组问题中断使能中断服务函数总结前言 上一篇中,借着串口接受的问题,简要说了一下串口中断的作用和用法,本文将对STM32的中断控制体…...
如何发布自己的npm包
一、什么是npm npm是随同nodejs一起安装的javascript包管理工具,能解决nodejs代码部署上的很多问题,常见的使用场景有以下几种: ①.允许用户从npm服务器下载别人编写的第三方包到本地使用。 ②.允许用户从npm服务器下载并安装别人编写的命令…...
Qt QProcess管道命令带“|”多命令执行获取stdout输出问题总结
问题描述: 在Qt中,使用system和QProcess执行命令,system执行的命令,我们通常不需要获取stdout的输出结果,所以只需要得到返回结果,知道成功失败即可。 而用到QProcess,多半是要获取输出的返回信息。 这里的返回信息只要是标准输出的即可,当然了,也可以是别的channe…...
【JavaEE进阶篇2】spring基于注解开发1
在上一篇文章当中,我们提到了怎样使用spring来创建一个bean对象。下面,我们继续来研究一下,更加优胜的开发方式:基于注解开发【JavaEE进阶篇1】认识Spring、认识IoC、使用spring创建对象_革凡成圣211的博客-CSDN博客springIoc、使…...
统一登录验证统一返回格式统一异常处理的实现
统一登录验证&统一返回格式&统一异常处理的实现 一、用户登录权限效验1.1 最初的用户登录验证1.2 Spring AOP 用户统一登录验证的问题1.3 Spring 拦截器1.3.1 准备工作1.3.2 自定义拦截器1.3.3 将自定义拦截器加入到系统配置1.4 拦截器实现原理1.4.1 实现原理源码分析1…...
【建议收藏】华为OD面试,什么场景下会使用到kafka,消息消费中需要注意哪些问题,kafka的幂等性,联合索引等问题
文章目录 华为 OD 面试流程一、什么场景下会使用到 kafka二、消息消费中需要注意哪些问题三、怎么处理重复消费四、kafka 的幂等性怎么处理的五、kafka 会怎么处理消费者消费失败的问题六、数据库设计中,你会如何去设计一张表七、联合索引有什么原则华为 OD 面试流程 机试:三…...
【MySQL】MySQL的优化(二)
目录 explain分析执行计划 Explain分析执行计划-Explain 之 id Explain分析执行计划-Explain 之 select_type Explain分析执行计划-Explain 之 type Explain分析执行计划-其他指标字段 explain分析执行计划 通过以上步骤查询到效率低的 SQL 语句后,可以通过 …...
网站 电信已备案 联通/永久免费个人网站申请注册
问题描述 给定一个字符串,你需要从第start位开始每隔step位输出字符串对应位置上的字符。 输入格式 第一行一个只包含小写字母的字符串。 第二行两个非负整数start和step,意义见上。 输出格式 一行,表示对应输出。 样例输入 abcdefg 2 2 样例…...
如何设计个人网站/关键词搜索数据
在华为mate40没有正式发布之前,当下话题最热的机型就是iPhone12了,四款手机也是分开时间段发布,目前6299元的基础版iPhone12人气最高,眼下也没有任何一款国产手机可以抗衡苹果5G手机,实在要找出一款可能就是接下来的华…...
网站怎么做链接/seo优化工作内容
realpg2016-02-01 23:03:08 08:00如果纯在 mysql 的场景下操作,不用内存 key-value 系统,我更倾向于用另外一种模型处理这种竞争抢购的逻辑。“需要先 select ,然后 insert ,最后 update -1 。最后这个-1 操作是不能出现负数的”我…...
如何做传奇私服网站/seo搜索优化排名
题目链接:https://loj.ac/problem/10013 分析: 对于题目中给定的二次函数是符合用三分求极值的,关键是如何在n个这样的函数中找到最大的那一个? 我们会的就是一个这样的函数在给定区间内求极值。 所以,在每次三分的过…...
网站维护 推广/口碑营销经典案例
目录 背景 下载war包 以java可执行文件运行 访问Jenkins 配置插件 测试插件安装 背景 上一篇文章,作者已经分享了再window环境下如何使用Jenkins的msi版本,但是这个版本的不好地方就是插件安装出现瓶颈。虽然上一篇文章在最后也分享了一种基于手动…...
视频网站主持人/卖链接的网站
各位玩家好!大家期待的破天一剑单机一键安装版终于问世了!!整个安装程序457M,无须安装SQL2000、补丁,破天单机一键安装,安装过程3分钟,全自动安装。。。20100207(农历小年),做人要厚道,非诚勿扰!设置如下:上线小退60级…...