数据结构之顺序表

news/2024/5/17 18:49:57

一、概念及结构

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

顺序表一般可以分为:

1. 静态顺序表:使用定长数组存储元素。

2. 动态顺序表:使用动态开辟的数组存储。 

 二、具体代码实现

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

#pragma once// SeqList.h
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>typedef int SLDateType;
typedef struct SeqList
{SLDateType* a;int size;int capacity;
}SeqList;// 对数据的管理:增删查改 //初始化
void SeqListInit(SeqList* ps);//销毁
void SeqListDestroy(SeqList* ps);//打印
void SeqListPrint(SeqList* ps);//尾插
void SeqListPushBack(SeqList* ps, SLDateType x);//头插
void SeqListPushFront(SeqList* ps, SLDateType x);//查看顺序表容量,若满了就扩容
void CheckSeqlist(SeqList* ps);//头删
void SeqListPopFront(SeqList* ps);//尾删
void SeqListPopBack(SeqList* ps);// 顺序表查找
int SeqListFind(SeqList* ps, SLDateType x);// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLDateType x);// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos);

 

//SeqList.c
#include "SeqList.h"void SeqListInit(SeqList* ps)
{int i = 0;ps->a = (SLDateType*)malloc(sizeof(SLDateType) * 5);ps->capacity = 5;ps->size = 0;for (i = 0; i < ps->capacity; i++){ps->a[i] = 0;}
}void SeqListDestroy(SeqList* ps)
{ps->capacity = 0;ps->size = 0;free(ps->a);
}void SeqListPrint(SeqList* ps)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}void CheckSeqlist(SeqList* ps)
{assert(ps);if (ps->size == ps->capacity){SLDateType* tmp = (SLDateType*)realloc(ps->a,sizeof(SLDateType) * (ps->capacity) * 2);ps->capacity *= 2;//若容量满了就扩容为原来的两倍if (tmp != NULL){ps->a = tmp;}}
}void SeqListPushBack(SeqList* ps, SLDateType x)
{assert(ps);CheckSeqlist(ps);ps->a[ps->size] = x;(ps->size)++;
}void SeqListPushFront(SeqList* ps, SLDateType x)
{assert(ps);CheckSeqlist(ps);int j = ps->size;for (; j > 0; j--){ps->a[j] = ps->a[j- 1];}ps->a[0] = x;ps->size++;
}void SeqListPopFront(SeqList* ps)
{assert(ps);assert(ps->size > 0);int j = 0;for (j = 0; j < ps->size-1; j++){ps->a[j] = ps->a[j + 1];}ps->size--;
}void SeqListPopBack(SeqList* ps)
{assert(ps);assert(ps->size > 0);ps->size--;
}int SeqListFind(SeqList* ps, SLDateType x)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){if (ps->a[i] == x){return i;}}return -1;
}void SeqListInsert(SeqList* ps, int pos, SLDateType x)
{assert(ps);assert(pos <= ps->size && pos >= 0);CheckSeqlist(ps);int j = ps->size;for (; j >pos; j--){ps->a[j] = ps->a[j - 1];}ps->a[pos] = x;ps->size++;
}void SeqListErase(SeqList* ps, int pos)
{assert(ps);assert(pos < ps->size && pos >= 0);int j;for (j = pos; j < ps->size-1; j++){ps->a[j] = ps->a[j + 1];}ps->size--;
}
//test.c
#include "SeqList.h"int main()
{SeqList s;SeqListInit(&s);SeqListPushBack(&s, 10);SeqListPushBack(&s, 20);SeqListPushBack(&s, 30);SeqListPushBack(&s, 40);SeqListPushBack(&s, 50);SeqListPushFront(&s, 0);SeqListPrint(&s);SeqListPopFront(&s);SeqListPrint(&s);SeqListPopBack(&s);SeqListPrint(&s);SeqListInsert(&s, 1, 1);SeqListPrint(&s);SeqListErase(&s, 1);SeqListPrint(&s);SeqListDestroy(&s);return 0;
}

三、顺序表的问题及思考

1. 中间/头部的插入删除,时间复杂度为O(N)
2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到
200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

下面即将学习的链表就可以进一步优化顺序表。


http://www.mrgr.cn/p/00050181

相关文章

骨传导耳机它的工作原理是什么?骨传导耳机长期使用会有脑损伤吗?

骨传导耳机&#xff0c;就是利用头骨和额骨传导声音头骨和额骨传导声音的耳机&#xff0c;这并不是夸大其词&#xff0c;不用惊讶。 骨传导耳机的工作原理其实也很简单&#xff0c;声波通过颅骨、颌骨等头部骨头的振动&#xff0c;直接将声音传到内耳&#xff0c;直接避免接触到…

DataEase开源BI工具安装_数据全量_增量同步_大屏拖拽自动生成_多数据源支持_数据血缘分析---大数据工作笔记0183

我这里用的是Centos7.9安装的 可以通过uname -p来查看一下我们的电脑架构,可以看到是x86_64架构的 我们下第一个,这个是x86架构的,第二个arm架构的 然后解压到/opt/module中 然后再去重命名一下文件夹. 推荐200G 本地模式的功能比较多 推荐100G

立即报名 | AI +Serverless Meetup 上海站 8 月 5 日等你相约!

自 2021 年 5 月后&#xff0c;KubeSphere 社区与上海的各位小伙伴已阔别两年&#xff0c;许久不见&#xff0c;甚是想念&#xff01;2023 年 8 月 5 日&#xff0c;KubeSphere 社区将走进上海组织一场主题为 “AI Serverless” 的 Meetup。此外&#xff0c;云原生也依旧是本次…

windows中注册redis服务启动时报1067错误

注册完redis服务&#xff0c;打开计算机 服务时确实有redis服务存在&#xff0c;但是点击启动时却报1067错误&#xff0c;而命令行用redis-server.exe redis.windows.conf 命令却也可以启动 查看6379的端口也没有被占用&#xff08;netstat -ano | findstr :6379&#xff09; …

【二开】JeecgBoot-vue3二次开发 前端 扩展online表单js增强等-初始化列表之后执行

【二开】JeecgBoot-vue3二次开发 前端 扩展online表单js增强等-初始化列表之后执行 二开位置 OnlineAutoList.js.initAutoList 定义方法 /*** 初始化列表之后执行* js增强* param tableColumns* returns {Promise<void>|*}*/onlineTableContext["afterInitAutoList…

4-Linux组管理和权限管理

Linux组管理和权限管理 Linux组的基本介绍文件/目录的所有者组的创建文件/目录所在的组其它组改变用户所在的组权限的基本介绍第0-9位说明rwx权限详解rwx 修饰文件时rwx修饰目录时 修改权限第一种方式&#xff1a;、-、 变更权限第二种方式&#xff1a;通过数字变更权限 修改文…

文档管理NAS储存安全吗?

关键词&#xff1a;私有化、知识管理系统、文档管理、群晖NAS、协同编辑 随着企业不断发展扩大&#xff0c;企业的知识文档也逐渐增多&#xff0c;很多企业方便管理及考虑数据安全问题会将文件数据储存至NAS。 但将企业文档数据放在NAS上就足够安全的吗&#xff1f; 天翎文档管…

Mybatis源码解析(三)------SqlSession

Mybatis源码解析&#xff08;三&#xff09;------SqlSession 序言SqlSession接口SqlSession的实现类DefaultSqlSessionSelect获取Statement查询 序言 Mybatis里面的核心就是SqlSession这个接口&#xff0c;前面我们已经研究了Mybatis的配置过程和Mapper的注册过程&#xff0c…

【数学建模】时间序列分析

文章目录 1. 条件2. 模型分类3. SPSS处理时间序列 1. 条件 1.使用于具有时间、数值两种要素 2.数据具有周期性可以使用时间序列分解 2. 模型分类 叠加模型【YTSCI】 序列的季节波动变化越来越大&#xff0c;反映变动之间的关系发生变化乘积序列【YTSC*I】 时间序列波动保持恒…

舌体分割的初步展示应用——依托Streamlit搭建demo

1 前言 去年在社区发布了有关中医舌象诊断的博文&#xff0c;其中舌象识别板块受到了极高的关注和关注。&#x1f60a;最近&#xff0c;我接触到了Python的Streamlit库&#xff0c;它可以帮助数据相关从业人员轻松搭建数据看板。本文将介绍如何使用Streamlit构建舌体分割的演示…

网络层IP协议的基本原理 数据链路层ARP协议 域名解析以及一些重要技术

目录 1 网络层IP协议协议头格式网段划分DHCPCIDR&#xff1a;基于子网掩码的划分方式特殊的IP号IP地址的数量限制私有IP地址和公网IP地址路由路由表 2 数据链路层 — 局域网的转发问题以太网认识以太网以太网帧格式局域网通信原理 MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对…

脑电信号处理与特征提取——6.运用机器学习技术和脑电进行大脑解码(涂毅恒)

目录 六、运用机器学习技术和脑电进行大脑解码 6.1 前言 6.2 基于脑电数据的机器学习基础分析 6.3 基于脑电数据的机器学习进阶分析 6.4 代码解读 六、运用机器学习技术和脑电进行大脑解码 6.1 前言 6.2 基于脑电数据的机器学习基础分析 6.3 基于脑电数据的机器学习进阶分…

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现

目录 一、总述 1.1 前端思路 1.2 后端思路 二、前端实现 2.1 判断是否能进行拖拽 2.2 收集受影响的节点&#xff0c;提交给服务器 三、后端实现 四、总结 一、总述 这个拖拽功能对于这种树形的列表&#xff0c;整体的搬迁是很方便的。但是其实现却并不是那么的简单。 …

如何在不使用脚本和插件的情况下手动删除 3Ds Max 中的病毒?

如何加快3D项目的渲染速度&#xff1f; 3D项目渲染慢、渲染卡顿、渲染崩溃&#xff0c;本地硬件配置不够&#xff0c;想要加速渲染&#xff0c;在不增加额外的硬件成本投入的情况下&#xff0c;最好的解决方式是使用渲云云渲染&#xff0c;在云端批量渲染&#xff0c;批量出结…

大厂HR经常会问到的Java线程池面试题

一、什么是线程池 线程池和数据库连接池非常类似&#xff0c;可以统一管理和维护线程&#xff0c;减少没有必要的开销。 二、为什么要使用线程池 因为在项目开发过程中频繁的开启线程或者停止线程&#xff0c;线程需要重新被CPU从就绪状态调度到运行状态&#xff0c;需要发生C…

爆肝整理,接口自动化测试-数据驱动框架封装(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口自动化框架—…

SpringBoot环境标识设置及nacos匹配配置

本地环境标识设置 本地父类maven配置 可以看到相关的分类&#xff0c;设置环境标识主要需要用到profiles; <profiles><profile><id>dev</id><properties><!-- 环境标识&#xff0c;需要与配置文件的名称相对应 --><profiles.active&…

2023项目管理产品排行榜:优化企业项目管理的顶级选择

随着全球竞争加剧和商业环境的变化&#xff0c;企业对项目管理的需求越来越迫切。优秀的项目管理产品能够帮助企业提高工作效率、资源利用率和项目交付质量。 本文参考了不同的产品测评网站&#xff0c;在众多项目管理产品中&#xff0c;总结了以下几款备受好评的项目管理工具&…

stm32 mpu6050 cubemx DMP法读取角度

文章目录 前言一、相关文件二、cubemx配置三、代码变量初始化主循环 总结 前言 文件 记录使用dmp库来读取mpu6050的角度。 这是参考文件 参考1–主要参考 github参考 参考2 参考三 一、相关文件 相关文件在这里下载&#xff08;未填&#xff0c;不过可以在上面的git中下载&a…

js全端支持的深拷贝structuredClone

Jul 7, 2023 经过一年半的试用&#xff0c;structuredClone转正了&#xff0c;全端可以正式使用。 https://developer.mozilla.org/en-US/docs/Web/API/structuredClone