【数据结构实战】从0打造你的专属顺序表

专栏:《数据结构实战篇》


        生活中有着无穷无尽的数据需要存储,大到全国人口普查,小到微信、QQ好友列表,都需要有一个合理的存储方式才能使得我们的数据更方便管理,线性表就是其中之一

一、线性表

        线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...

        线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

 二、顺序表

        2.1 顺序表概念及结构

        顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

        2.2 顺序表的分类

        顺序表一般可以分为两大类:

        2.2.1 静态顺序表

#define N 8struct seqlist
{int arr[N]; //定长数组size_t size; //数组的有效长度
};

         现然可以看出静态顺序表和数组差不多,因此他的缺点就很明显了:

        1. 当数据存满的时候无法再开辟空间

        2. 如果整个数组的长度为100,但是我只存了5个数据在里面,那就会形成很大一块的空间浪费(剩下的95个空间全是空间浪费)

        针对上述问题,聪明的人类想到了动态空间管理,就是动态顺序表

        2.2.2 动态顺序表

typedef int seq_list_data;struct seq_list
{seq_list_data* arr;//指向动态开辟的数组int size;//有效数据个数int capacity;//容量空间的大小
};

        合理运用malloc和realloc两个函数可以帮我们实现很多我们想要的操作

        静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。

        2.3 顺序表的增删查改实现

        其实动态顺序表的实现和我之前写过的通讯录项目类似,感兴趣的朋友可以去浅看一下《C语言动态内存管理》

        2.3.1 初始化顺序表

        先把动态内存默认大小开辟出来,方便后续操作

void init_seqlist(seq_list* ps)
{seq_list_data* tmp = (seq_list_data*)malloc(2*sizeof(seq_list_data));if (tmp == NULL){perror("init_seqlist::malloc");return;}ps->arr = tmp;ps->capacity = 2;ps->size = 0;
}

        2.3.2 打印顺序表

        为方便后续操作,我个人建议先把打印的函数写了,之后再写增删查改就可以能观察到我们想要的东西

        想要打印顺序表也很简单,只需要从0到size打印出来就好啦

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

        2.3.3 增加一个数据

        增加一个数据分为两种方式,头插和尾插,尾插相对简单,就不多说了,主要是头插,其实就是先把数据全部诺向后一个位置,留着第一个位置,然后插入数据

        先展示尾插

void push_back(seq_list* ps, int x)
{//检查容量满了没if (ps->size == ps->capacity){seq_list_data* tmp = (seq_list_data*)realloc(ps->arr, 2 * ps->capacity * sizeof(seq_list_data));if (tmp == NULL){perror("push_back::realloc");return;}ps->arr = tmp;}ps->arr[ps->size] = x;ps->size++;
}

        头插图示:(都学数据结构啦,就别摆烂了,好好画图哈~~)

 

void push_frnot(seq_list* ps, int x)
{//检查容量满了没if (ps->size == ps->capacity){seq_list_data* tmp = (seq_list_data*)realloc(ps->arr, 2 * ps->capacity * sizeof(seq_list_data));if (tmp == NULL){perror("push_back::realloc");return;}ps->arr = tmp;ps->capacity *= 2;}//将数据移到后面int i = 0;for (i = ps->size; i >= 0; i--){ps->arr[i + 1] = ps->arr[i];}ps->arr[0] = x;ps->size++;
}

        2.3.4 删除一个数据

        同样删除一个数据也有头删和尾删,尾删就是直接size--就好啦,头删则是把后面的数据覆盖到前面

        头删

//头删
void pop_front(seq_list* ps)
{assert(ps);//检查size要大于0assert(ps->size);//把后面的数据向前覆盖int i = 0;for (i = 0; i < ps->size; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

        尾删

//尾删
void pop_back(seq_list* ps)
{assert(ps);//检查size要大于0assert(ps->size);ps->size--;
}

        2.3.5 查找数据

        就找到这个数据返回数据的地址就好啦

//查找
int seq_find(seq_list* ps, int x)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){if (ps->arr[i] == x)return i;}return -1;
}

        2.3.6 销毁数据表

        当数据表用完的时候,最后记得要把malloc借来的空间释放了哟~有借有还,再借不难嘛~

//销毁
void distory(seq_list* ps)
{assert(ps);free(ps->arr);ps->arr = NULL;ps->capacity = 0;ps->size = 0;
}

三、顺序表缺点

        顺序表的缺点也很明显,虽然可以实现动态内存开辟和释放,但是如果要在中间加入一个数据的话,就比较费事,因此聪明的人类又发明了链表,至于链表是什么,还请各位稍等下一期内容,我们将在手搓一个链表出来,并分享一下顺序表链表有关的oj题,大家可以期待一下啦~

        最后还是希望各位帅哥美女留下一个宝贵的三连吧

        拜托啦 >_<

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

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

相关文章

RFID标签实现托盘智能化管理

一、RFID技术概述 1.1 RFID技术原理 RFID技术&#xff0c;即无线射频识别技术&#xff0c;是一种利用无线电波进行非接触式自动识别和数据交换的技术。其核心优势在于能够实现远距离、快速、批量的识别&#xff0c;相较于传统的条形码技术&#xff0c;RFID技术在物资管理领域展…

net core 生成URL HtmlHelper

HtmlHelper Url.Action Url.RouteUrl RedirectToAction public IActionResult Privacy(){return RedirectToAction("Index");}Html.ActionLink Html.BeginForm Html.ActionLink 与 Url.Action 1.两者者是根据给定的Controller,Action 生成链接&#xff0c; 但是H…

零日漏洞被谷歌的 AI 工具发现

谷歌的 AI 研究工具 Big Sleep 取得了重大突破&#xff0c;发现了 SQLite 中的漏洞&#xff0c;SQLite 是全球使用最广泛的数据库引擎之一。 Google Project Zero 和 Google DeepMind 团队最近在官方博客文章中分享了这一里程碑&#xff0c;标志着 AI 驱动的漏洞检测在现实世界…

Github 2024-11-07 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-11-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10HTML项目1Kubernetes: 容器化应用程序管理系统 创建周期:3618 天开发语言:Go协议类型:Apache License 2.0Star数量:106913 个Fork数…

Java学习笔记之类

文章目录 类和对象的基础属性/成员变量⚠️ 属性的注意事项和细节⚠️ 构建函数 类和对象的区别类和对象的内存分配机制练习 成员方法方法定义⚠️ 方法使用细节⚠️ 形参列表细节⚠️ 方法内部细节⚠️ 方法调用细节方法入门代码01⚠️ 行参和成员方法重名方法入门代码02方法递…

链表删除相关算法题|删除值为x的节点|删除最小值节点|删除值在区间内的节点|删除重复节点|删除绝对值相等的节点(C)

删除值为x的节点 在带头结点的单链表L中&#xff0c;删除所有值为X的结点&#xff0c;并释放其空间&#xff0c;假设值为的结点不唯一 算法思想 删除单链表的节点需要三个指针 一个是遍历链表的工作指针cur&#xff0c;一个是指向cur的上一个节点的指针prev&#xff0c;一个…

C++:哈希表的实现

一、哈希表的基本概念 1、负载因子&#xff1a;假设哈希表中已经映射存储了N个值&#xff0c;哈希表的大小为M&#xff0c;那么负载因子 N / M&#xff0c;负载因子有些地⽅也翻译为载荷因子/装载因子等&#xff0c;他的英文为load/factor。负载因子越大&#xff0c;哈希冲突的…

2024年11月软考考前注意事项

一、重要时间节点 准考证打印时间&#xff1a; 大部分省市的准考证打印时间从11月4日起开始&#xff0c;但上海、甘肃等地区则稍晚&#xff0c;从11月6日起开放打印。 请务必注意所在地区的具体打印时间&#xff0c;并尽早打印准考证&#xff0c;以免因错过时间而影响考试。…

书生大模型实战营Linux+InternStudio 关卡任务

一、端口映射 使用以下命令进行端口映射 ssh -p {YOUR_PORT} rootssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyCheckingno 命令解释&#xff1a; -p 37367&#xff1a;是指定 SSH 连接的端口为 37367。rootssh.intern-ai.org.cn&#xff1a;表示要以…

道品科技智能水肥一体化技术要点及实施效果

## 一、引言 水肥一体化技术是现代农业中一种重要的耕作方式&#xff0c;旨在通过合理配置水资源与肥料&#xff0c;提高作物产量和质量&#xff0c;达到节水、增效和环保的目的。随着全球人口的增加和耕地资源的减少&#xff0c;水肥一体化技术在农业生产中的应用愈加重要。 …

sqlserver使用bak文件恢复数据库

进入数据库 sqlcmd -S localhost -U SA -P password备份文件 #备份格式BACKUP DATABASE your_database_name TO DISK path_to_backup_file.bak;#举例 1> BACKUP DATABASE XJZDataTest TO DISK /root/mssql.bak; 2> go使用备份文件恢复数据库 1、查询备份文件中的数据…

CSP/信奥赛C++刷题训练:经典深搜例题(1):洛谷1605 :迷宫

CSP/信奥赛C刷题训练&#xff1a;经典深搜例题&#xff08;1&#xff09;&#xff1a;洛谷1605 &#xff1a;迷宫 题目描述 给定一个 N M N \times M NM 方格的迷宫&#xff0c;迷宫里有 T T T 处障碍&#xff0c;障碍处不可通过。 在迷宫中移动有上下左右四种方式&#x…

yolov8涨点系列之Concat模块改进

文章目录 Concat模块修改步骤(1) BiFPN_Concat3模块编辑(2)在__init_.pyconv.py中声明&#xff08;3&#xff09;在task.py中声明yolov8引入BiFPN_Concat3模块yolov8.yamlyolov8.yaml引入C2f_up模块 在YOLOv8中&#xff0c; concat模块主要用于将多个特征图连接在一起。其具体…

越权访问漏洞

V2Board Admin.php 越权访问漏洞 ## 漏洞描述 V2board面板 Admin.php 存在越权访问漏洞&#xff0c;由于部分鉴权代码于v1.6.1版本进行了修改&#xff0c;鉴权方式变为从Redis中获取缓存判定是否存在可以调用… V2Board Admin.php 越权访问漏洞 漏洞描述 V2board面板 Admin.ph…

安装和运行开发微信小程序

下载HBuilder uniapp官网 uni-app官网 微信开发者工具 安装 微信小程序 微信小程序 官网 微信小程序 配置 运行 注意&#xff1a;运行前需要开启服务端口 如果运行看不到效果&#xff0c;设置下基础库选别的版本 配置

小檗碱和卤代苄基异喹啉生物碱的代谢工程合成-文献精读79

De novo biosynthesis of berberine and halogenated benzylisoquinoline alkaloids in Saccharomyces cerevisiae 在 酿酒酵母&#xff08;Saccharomyces cerevisiae&#xff09;中从头合成小檗碱和卤代苄基异喹啉生物碱 小檗碱的酵母代谢工程生物合成-文献精读78 苄基异喹…

鸿蒙开发案例:七巧板

【1】引言&#xff08;完整代码在最后面&#xff09; 本文介绍的拖动七巧板游戏是一个简单的益智游戏&#xff0c;用户可以通过拖动和旋转不同形状的七巧板块来完成拼图任务。整个游戏使用鸿蒙Next框架开发&#xff0c;利用其强大的UI构建能力和数据响应机制&#xff0c;实现了…

【TS】九天学会TS语法——1.TypeScript 是什么

今天学习的是TypeScript 基础&#xff0c;目标是了解 TypeScript 的基本概念&#xff0c;安装 TypeScript&#xff0c;编写第一个 TypeScript 程序。 TypeScript 简介安装 TypeScriptTypeScript 编译过程编写第一个 TypeScript 程序 随着前端开发的不断发展&#xff0c;TypeScr…

Docker学习—Docker的安装与使用

Docker安装 1.卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2.配置Docker的yum库 首先…

69.ov5640摄像头HDMI灰度显示

&#xff08;1&#xff09;理论学习 灰度像素&#xff1a;在 RGB 颜色模型下&#xff0c;图像中每个像素颜色的 R、G、B 三种基色的分量值相等的像素。由灰度像素组成的灰度图像只能表现256中颜色&#xff08;或亮度&#xff09;&#xff0c;通常把灰度图像中像素的亮度称为灰…