数据结构:顺序表(动态顺序表)
专栏说明:本专栏用于数据结构复习,文章中出现的代码由C语言实现,在专栏中会涉及到部分OJ题目,如对你学习有所帮助,可以点赞鼓励一下博主喔💓
- 博客主页:Duck Bro 博客主页
- 系列专栏:数据结构专栏
- 关注博主,后期持续更新系列文章
- 如果有错误感谢请大家批评指出,及时修改
- 感谢大家点赞👍收藏⭐评论✍
数据结构:顺序表(动态顺序表)
目录
- 数据结构:顺序表(动态顺序表)
- 1. 概念与结构
- 1.1 概念
- 1.2 结构
- 2. 接口实现
- 2.1 动态顺序表结构
- 2.2 顺序表初始化
- 2.3 顺序表销毁
- 2.4 检查空间、扩容
- 2.5 顺序表尾插
- 2.6 顺序表尾删
- 2.7 顺序表头插
- 2.8 顺序表头删
- 2.9 顺序表查找
- 2.10 在pos位置插入x
- 2.11 删除pos位置值
- 2.12 修改pos位置值
- 2.13 打印顺序表
- 3. 详细代码页
- 3.1 SeqList.h
- 3.2 SeqList.c
- 3.3 main.c
1. 概念与结构
1.1 概念
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存
储。在数组上完成数据的增删查改。
1.2 结构
静态顺序表:使用定长数组存储元素。

#define N 7
typedef int DataType;
typedef struct SeqList
{DataType a[N];int size;int capacity;
}SL;
动态顺序表:使用动态开辟的数组存储。

typedef int DataType;
typedef struct SeqList
{DataType* a;int size;int capacity;
}SL;
2. 接口实现
2.1 动态顺序表结构
//顺序表动态存储
typedef int DataType;
typedef struct SeqList
{DataType* a; //指点动态开辟数组int size; //有效数据个数int capacity; //容量空间大小
}SL;
2.2 顺序表初始化
void SLInit(SL* pc)
{//断言assert(pc);//pc->a = NULL;pc->a = (DataType*)malloc(sizeof(DataType) * 4);//判断是否为空if (pc->a == NULL){//报错提示perror("SLInit faild");//退出程序exit(-1);}//顺序表内的数据个数pc->size = 0;//顺序表内的容量pc->capacity = 4;
}
2.3 顺序表销毁
void SLDestroy(SL* pc)
{//断言assert(pc);//释放内存free(pc->a);//将指针置为空pc->a = NULL;//设置数据个数和容量为0个pc->size = 0;pc->capacity = 0;
}
2.4 检查空间、扩容
void SLCheckCapacity(SL* pc)
{//断言assert(pc);//如果size==capacity,则进行二倍扩容if (pc->size == pc->capacity){DataType* temp = (DataType*)realloc(pc->a, pc->capacity * sizeof(DataType) * 2);//进行判断是否开辟成功if (temp == NULL){perror("SLCheckCapacity faild");exit(-1);}pc->a = temp;pc->capacity *= 2;}
}
2.5 顺序表尾插
void SLPushBack(SL* pc, DataType x)
{assert(pc);/*assert(pc);SLCheckCapacity(pc);pc->a[pc->size] = x;pc->size++;*/SLInsert(pc, pc->size, x);
}
2.6 顺序表尾删
void SLPopBack(SL* pc)
{assert(pc);/*assert(pc);assert(pc->size);pc->size--;*/SLErase(pc, pc->size - 1);
}
2.7 顺序表头插
void SLPushFront(SL* pc, DataType x)
{assert(pc);断言//assert(pc);检查空间是否足够//SLCheckCapacity(pc);end为顺序表中最后一个数据的下标//int end = pc->size - 1;将所有数据进行后移//while (end >= 0)//{// pc->a[end + 1] = pc->a[end];// --end;//}//pc->a[0] = x;//pc->size++;SLInsert(pc, 0, x);}
2.8 顺序表头删
void SLPopFront(SL* pc)
{assert(pc);/*assert(pc->size > 0);int begin = 1;while (begin < pc->size){pc->a[begin - 1] = pc->a[begin];begin++;}pc->size--;*/SLErase(pc, 0);
}
2.9 顺序表查找
int SLFind(SL* pc, DataType x)
{assert(pc);for (int i = 0; i < pc->size; i++){if (x == pc->a[i]){return i;}}return -1;
}
2.10 在pos位置插入x
void SLInsert(SL* pc, int pos, DataType x)
{assert(pos >= 0 && pos <= pc->size);SLCheckCapacity(pc);int end = pc->size - 1;while (end >= pos){pc->a[end + 1] = pc->a[end];end--;}pc->a[pos] = x;pc->size++;
}
2.11 删除pos位置值
void SLErase(SL* pc, int pos)
{assert(pc);assert(pos>=0&&pos<pc->size);int begin = pos + 1;while (begin < pc->size){pc->a[begin-1] = pc->a[begin];begin++;}pc->size--;
}
2.12 修改pos位置值
void SLModify(SL* pc, int pos, DataType x)
{assert(pc);assert(pos <= 0 && pos < pc->size);pc->a[pos] = x;}
2.13 打印顺序表
void SLPrintf(SL* pc)
{//断言assert(pc);//遍历int i = 0;for (i = 0; i < pc->size; i++){printf("%d ", pc->a[i]);}printf("\n");
}
3. 详细代码页
3.1 SeqList.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int DataType;
typedef struct SeqList
{DataType* a;int size;int capacity;
}SL;//顺序表初始化
void SLInit(SL* pc);
//顺序表销毁
void SLDestroy(SL* pc);
//容量检查,并进行扩容
void SLCheckCapacity(SL* pc);
//打印顺序表中的数据 遍历顺序表
void SLPrintf(SL* pc);//顺序表头插
void SLPushFront(SL* pc, DataType x);
//顺序表尾删
void SLPopBack(SL* pc);
//顺序表尾插
void SLPushBack(SL* pc, DataType x);
//顺序表头删
void SLPopFront(SL* pc);//查找位置
int SLFind(SL* pc ,DataType x);
//顺序表pos位置前插入X
void SLInsert(SL* pc, int pos,DataType x);
//顺序表删除pos位置值
void SLErase(SL* pc,int pos);
//修改pos位置值
void SLModify(SL* pc, int pos,DataType x);
3.2 SeqList.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"void SLInit(SL* pc)
{//断言assert(pc);//pc->a = NULL;pc->a = (DataType*)malloc(sizeof(DataType) * 4);//判断是否为空if (pc->a == NULL){//报错提示perror("SLInit faild");//退出程序exit(-1);}//顺序表内的数据个数pc->size = 0;//顺序表内的容量pc->capacity = 4;
}void SLDestroy(SL* pc)
{//断言assert(pc);//释放内存free(pc->a);//将指针置为空pc->a = NULL;//设置数据个数和容量为0个pc->size = 0;pc->capacity = 0;}void SLCheckCapacity(SL* pc)
{//断言assert(pc);//如果size==capacity,则进行二倍扩容if (pc->size == pc->capacity){DataType* temp = (DataType*)realloc(pc->a, pc->capacity * sizeof(DataType) * 2);//进行判断是否开辟成功if (temp == NULL){perror("SLCheckCapacity faild");exit(-1);}pc->a = temp;pc->capacity *= 2;}
}void SLPrintf(SL* pc)
{//断言assert(pc);//遍历int i = 0;for (i = 0; i < pc->size; i++){printf("%d ", pc->a[i]);}printf("\n");
}void SLPushFront(SL* pc, DataType x)
{assert(pc);断言//assert(pc);检查空间是否足够//SLCheckCapacity(pc);end为顺序表中最后一个数据的下标//int end = pc->size - 1;将所有数据进行后移//while (end >= 0)//{// pc->a[end + 1] = pc->a[end];// --end;//}//pc->a[0] = x;//pc->size++;SLInsert(pc, 0, x);}void SLPopBack(SL* pc)
{assert(pc);/*assert(pc);assert(pc->size);pc->size--;*/SLErase(pc, pc->size - 1);
}void SLPushBack(SL* pc, DataType x)
{assert(pc);/*assert(pc);SLCheckCapacity(pc);pc->a[pc->size] = x;pc->size++;*/SLInsert(pc, pc->size, x);
}void SLPopFront(SL* pc)
{assert(pc);/*assert(pc->size > 0);int begin = 1;while (begin < pc->size){pc->a[begin - 1] = pc->a[begin];begin++;}pc->size--;*/SLErase(pc, 0);
}void SLInsert(SL* pc, int pos, DataType x)
{assert(pos >= 0 && pos <= pc->size);SLCheckCapacity(pc);int end = pc->size - 1;while (end >= pos){pc->a[end + 1] = pc->a[end];end--;}pc->a[pos] = x;pc->size++;
}void SLErase(SL* pc, int pos)
{assert(pc);assert(pos>=0&&pos<pc->size);int begin = pos + 1;while (begin < pc->size){pc->a[begin-1] = pc->a[begin];begin++;}pc->size--;
}int SLFind(SL* pc, DataType x)
{assert(pc);for (int i = 0; i < pc->size; i++){if (x == pc->a[i]){return i;}}return -1;
}void SLModify(SL* pc, int pos, DataType x)
{assert(pc);assert(pos <= 0 && pos < pc->size);pc->a[pos] = x;}
3.3 main.c
#include "SeqList.h"
void test1()
{//测试创建顺序表初始化 销毁SL s;SLInit(&s);SLDestroy(&s);
}void test2()
{//测试顺序表尾插插SL s1;SLInit(&s1);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);//SLPushFront(&s1, 4);//SLPushFront(&s1, 4);//SLPopBack(&s1);//SLPopBack(&s1);SLPopBack(&s1);SLPopBack(&s1);SLPushBack(&s1, 67);SLPushBack(&s1, 67);SLPushBack(&s1, 67);SLPrintf(&s1);SLDestroy(&s1);
}void test3()
{//测试顺序表尾插插SL s1;SLInit(&s1);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPrintf(&s1);//SLPushFront(&s1, 4);SLPushFront(&s1, 66);SLPrintf(&s1);SLDestroy(&s1);
}void test4()
{//测试顺序表尾插插SL s1;SLInit(&s1);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);SLPushBack(&s1, 5);//SLInsert(&s1, 2, 7);int x = 0;scanf("%d", &x);int pos = SLFind(&s1, x);if (pos != -1){SLInsert(&s1, pos, 50);}SLPrintf(&s1);SLDestroy(&s1);
}
void test5()
{//测试顺序表尾插插SL s1;SLInit(&s1);SLPushBack(&s1, 1);SLPushBack(&s1, 2);SLPushBack(&s1, 3);SLPushBack(&s1, 4);SLPushBack(&s1, 5);//SLInsert(&s1, 2, 7);SLPopBack(&s1);SLPopFront(&s1);SLPrintf(&s1);SLDestroy(&s1);
}
int main()
{//test1();//test2();//test3();//test4();test5();return 0;
}

相关文章:
数据结构:顺序表(动态顺序表)
专栏说明:本专栏用于数据结构复习,文章中出现的代码由C语言实现,在专栏中会涉及到部分OJ题目,如对你学习有所帮助,可以点赞鼓励一下博主喔💓 博客主页:Duck Bro 博客主页系列专栏:数…...
springboot040社区医院信息平台
🍅点赞收藏关注 → 添加文档最下方联系方式领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅 项目视频 spr…...
windows下QT5.12.11使用MSVC编译器编译mysql驱动并使用详解
1、下载mysql开发库,后面驱动编译的时候需要引用到,下载地址:mysql开发库下载 2、使用everything搜索:msvc-version.conf,用记事本打开,添加:QMAKE_MSC_VER=1909。不然msvc下的mysql源码加载不上。...
c++写一个死锁并且自己解锁
刷算法题: 第一遍:1.看5分钟,没思路看题解 2.通过题解改进自己的解法,并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步,下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…...
JavaScript方法修改 input type=file 样式
html中的<input type "file">的样式很难修改,又跟页面风格很不匹配。我就尝试了几种方法,但是不管是用label还是用opacity:0都很麻烦,还老是出问题,所以最后还是用JavaScript来解决。 下面附上代码:…...
群控系统服务端开发模式-应用开发-前端个人信息功能
个人信息功能我把他分为了3部分:第一部分是展示登录者信息;第二步就是登录者登录退出信息;第三部分就是修改个人资料。 一、展示登录者信息 1、优先添加固定路由 在根目录下src文件夹下route文件夹下index.js文件中,添加如下代码 …...
【jupyter】文件路径的更改
使用过 jupyter notebook 环境的同行, 都体会过随机生成 .html 静态网页的过程, 虽然文档较小, 但是不堪反复使用积少成多。本文基于windows系统。 找到 runtime 目录 一般 jupyter 默认 runtime 在下述格式目录中 C:\Users\用户名\AppData…...
Ruby编程语言全景解析:从基础到进阶
Ruby是一种动态的、面向对象的编程语言,以其优雅的语法和强大的功能而闻名于世。自从1995年由日本程序员松本行弘(Yukihiro Matsumoto)发布以来,Ruby便迅速成为了开发者中颇受欢迎的编程语言之一。无论是构建简单的脚本还是复杂的…...
Elasticsearch 8.16:适用于生产的混合对话搜索和创新的向量数据量化,其性能优于乘积量化 (PQ)
作者:来自 Elastic Ranjana Devaji, Dana Juratoni Elasticsearch 8.16 引入了 BBQ(Better Binary Quantization - 更好的二进制量化)—— 一种压缩向量化数据的创新方法,其性能优于传统方法,例如乘积量化 (Product Qu…...
解决vscode不能像pycharm一样从其他同级文件夹导包
在vscode中选择:文件-首选项-设置-扩展-Python-settings.json 向setting.json添加如下代码: "terminal.integrated.env.osx": {"PYTHONPATH": "${workspaceFolder}/",},"terminal.integrated.env.linux": {"PYTHON…...
DAY24|回溯算法Part03|LeetCode:93.复原IP地址、78.子集、90.子集II
目录 LeetCode:93.复原IP地址 基本思路 C代码 LeetCode:78.子集 基本思路 C代码 LeetCode:90.子集II 基本思路 C代码 通过used实现去重 通过set实现去重 不使用used和set版本 LeetCode:93.复原IP地址 力扣代码链接 文字讲解:LeetCode:93.复原IP地…...
接口自动化测试做到什么程度的覆盖算是合格的
接口自动化测试的覆盖程度是一个衡量测试质量与效率的重要指标,其“好”的标准并非绝对,而是根据项目特性和团队需求动态调整的结果。然而,有几个原则和实践可以帮助我们确定一个相对合理的覆盖范围,以及为何这些覆盖是必要的。 1…...
Kubernetes-ArgoCD篇-01-简介
1、什么是Argo CD Argo CD 是针对 Kubernetes 的声明式 GitOps 持续交付工具。 Argo CD官方文档地址:https://argo-cd.readthedocs.io Argo CD源码地址:https://github.com/argoproj/argo-cd 1.1 关于Argo Argo是一个开源的项目,主要是扩…...
阿里云通义大模型团队开源Qwen2.5-Coder:AI编程新纪元
🚀 11月12日,阿里云通义大模型团队宣布开源通义千问代码模型全系列,共6款Qwen2.5-Coder模型。这些模型在同等尺寸下均取得了业界最佳效果,其中32B尺寸的旗舰代码模型在十余项基准评测中均取得开源最佳成绩,成为全球最强…...
【大数据学习 | HBASE高级】hbase的参数优化
Zookeeper 会话超时时间 属性:zookeeper.session.timeout 解释:默认值为 90000 毫秒(90s) hbase.client.pause(默认值 100ms)重试间隔 hbase.client.retries.number(默认 15 次)重试…...
两个链表求并集、交集、差集
两个链表求并集、交集、差集 两个链表求并集、交集、差集其实都是创建一个新链表然后遍历插入的题型,所以下边就举并集一个例子。 首先将l1里的所有节点遍历存储到新节点l中开始遍历l2,如果l中不存在l2中的节点就将其尾插到l中 下面是两个链表求并集、交集、差集的代…...
C++中的栈(Stack)和堆(Heap)
在C中,堆(heap)和栈(stack)是两种用于存储数据的内存区域。理解它们的原理和区别,对于优化代码性能和确保代码的安全性至关重要。以下是对C中堆栈的详细解析,包括它们的分配方式、优缺点、应用场…...
Linux系统编程学习 NO.11——进程的概念(2)
谈谈进程的性质 进程的竞争性 由于CPU资源是稀缺的,进程数量是众多的。不可避免需要造成进程排队等待CPU资源的动作,内核的设计者为了让操作系统合理的去调度这这些进程,就产生了进程优先级的概念。设置合理的进程优先级能让不同进程公平的去竞争CPU资…...
QT自定义控件封装
QT自定义控件封装 1.概述 这篇文章介绍如何创建UI文件,通过自定义方式将两个控件联动起来,实现自定义功能。 2.创建UI文件 新建一个widget的普通项目,然后在项目名称上右键选择And New... 新建文件,然后选择QT 再选择Qt Desig…...
【搜索结构】AVL树的学习与实现
目录 什么是AVL树 AVL树的定义 插入函数的实现 左单旋和右单旋 左右双旋与右左双旋 什么是AVL树 AVL树实际上就是二叉搜索树的一种变体,我们都知道二i叉搜索树可以将查找的时间复杂度提升到O(logn),极大提升搜索效率。但是在极端情况下,当…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
