线性表--顺序表
目录
1.什么是顺序表
2.动态顺序表实现
2.1动态顺序表结构体
2.2初始化
2.3打印验证函数
2.4判断是否扩容,按需扩容
2.5头插/尾插
2.6头删/尾删
2.7指定位置插入数据/指定位置删除数据
3.动态顺序表代码
1.什么是顺序表
线性表是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串等,在逻辑结构上呈线性,在物理结构(存储)上不一定线性。顺序表是线性表的一种,在逻辑结构上呈线性,在物理结构(存储)也是线性的,因为底层结构是数组,加上增删查改等功能封装在一起形成顺序表,顺序表分成静态顺序表和动态顺序表。
2.动态顺序表实现
2.1动态顺序表结构体

SLDataType是类型重命名,便于替换类型;
size是有效数据个数,也是一种重要下标,即为最后一个有效数据的下一个下标;
capacity是arr空间容量;
2.2初始化/销毁

要初始化后才能后续使用该结构体,用完后进行销毁;
2.3打印验证函数

便于后续验证直接使用;
2.4判断是否扩容,按需扩容

当空间容量不够时(即空间容量与有效数据值相等),就需要扩容,起始空间容量扩容4,后面的扩容按原空间容量的2倍或者1.5倍的原则扩容;
使用中间指针判断是否扩容成功,失败退出程序,成功就将原指针更新为中间指针,并更新扩容后的空间容量;
2.5头插/尾插

头插分为三种情况:

注意后移形式,避免覆盖到后续后移数据;

尾插分三种情况:
2.6头删/尾删

头删分两种情况:


尾删:

2.7指定位置插入数据/指定位置删除数据

pos是插入下标:



2.8查找数据

2.9改变指定下标的数据

3.动态顺序表代码
具体代码如下:
//头文件 SeqList.h#pragma once#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLDataType;//便于类型替换//动态顺序表
typedef struct SeqList
{SLDataType* arr;//存储数据的底层结构int size; //有效数据个数int capacity; //空间容量
}SL;静态顺序表
//#define N 10
//typedef struct SeqList
//{
// SLDataType arr[N];//定长数组
// int size; //有效数据个数
//}SL;//初始化和销毁
void SLInit(SL* ps);
void SLDestory(SL* ps);
//打印验证
void SLPrint(SL* ps);//顺序表头插
void SLPushFront(SL* ps, SLDataType x);
//顺序表尾插
void SLPushBack(SL* ps, SLDataType x);//判断是否需要扩容,需要进行扩容
void SLCheckCapacity(SL* ps);//顺序表的头删
void SLPopFront(SL* ps);
//顺序表的尾删
void SLPopBack(SL* ps);//指定位置插入数据,后面数据存在就后移
void SLInsert(SL* ps, int pos, SLDataType x);
//删除指定位置数据,后面数据存在就前移
void SLErase(SL* ps, int pos);//改变指定下标的数据
void SLChange(SL* ps, int pos, SLDataType x);//查找
int SLFind(SL* ps, SLDataType x);
//SeqList.c#define _CRT_SECURE_NO_WARNINGS 1#include "SeqList.h"//初始化和销毁
void SLInit(SL* ps)
{ps->arr = NULL; //初始化为空指针 ps->size = ps->capacity = 0; //初始化什么都没有,所以为0
}
void SLDestory(SL* ps)
{assert(ps);free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}
//打印验证
void SLPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}//判断是否需要扩容,需要进行扩容
void SLCheckCapacity(SL* ps)
{if (ps->size == ps->capacity)//有效数据个数与空间容量相等的时候,要插入需要先扩容{int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//起始空间容量为0,则第一次扩容4个,扩容原则扩容原空间容量的2倍或1.5倍SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));//中间指针接收扩容后的地址if (tmp == NULL)//扩容失败{perror("Realloc Fail!");exit(1);//意外退出}ps->arr = tmp;//扩容成功ps->capacity = newCapacity;//更新扩容后的空间容量}
}//顺序表头插
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);//或者if(ps == NULL) { return; }//若空间不够,需要扩容SLCheckCapacity(ps);for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;ps->size++;
}
//顺序表尾插
void SLPushBack(SL* ps, SLDataType x)
{assert(ps);//若空间不够,需要扩容SLCheckCapacity(ps);ps->arr[ps->size] = x;ps->size++;
}//顺序表的头删
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);//顺序表为空不能再删了for (int i = 0; i < ps->size - 1; i++)//向前覆盖{ps->arr[i] = ps->arr[i + 1];}ps->size--;//有效数据减1
}
//顺序表的尾删
void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);//顺序表为空不能再删了ps->size--;//直接减去最后一位的有效数据
}//指定位置插入数据,后面数据存在就后移
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;
}
//删除指定位置数据,后面数据存在就前移
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}//改变指定下标的数据
void SLChange(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos < ps->size);ps->arr[pos] = x;
}//查找
int SLFind(SL* ps, SLDataType x)
{for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x){return i;}}return -1;
}
//测试,project.c#define _CRT_SECURE_NO_WARNINGS 1#include "SeqList.h"void test()
{SL ps;SLInit(&ps);SLPushFront(&ps, 5);SLPushFront(&ps, 4);SLPushFront(&ps, 3);SLPushFront(&ps, 2);SLPushFront(&ps, 1);SLPrint(&ps);SLPushBack(&ps, 6);SLPushBack(&ps, 7);SLPushBack(&ps, 8);SLPushBack(&ps, 9);SLPushBack(&ps, 10);SLPrint(&ps);SLPopFront(&ps);SLPopFront(&ps);SLPrint(&ps);SLPopBack(&ps);SLPopBack(&ps);SLPrint(&ps);SLInsert(&ps, 0, 1);SLInsert(&ps, 1, 2);SLInsert(&ps, 8, 9);SLInsert(&ps, 9, 10);SLPrint(&ps);SLErase(&ps, 4);SLErase(&ps, 7);SLPrint(&ps);SLInsert(&ps, 4, 5);SLInsert(&ps, 7, 9);SLChange(&ps, 0, 10);SLChange(&ps, 1, 11);SLPrint(&ps);int ret = SLFind(&ps, 3);if (ret != -1){printf("找到了,在下标为%d的位置\n", ret);}else{printf("不存在数据,查找失败\n");}SLDestory(&ps);
}int main()
{test();return 0;
}
相关文章:
线性表--顺序表
目录 1.什么是顺序表 2.动态顺序表实现 2.1动态顺序表结构体 2.2初始化 2.3打印验证函数 2.4判断是否扩容,按需扩容 2.5头插/尾插 2.6头删/尾删 2.7指定位置插入数据/指定位置删除数据 3.动态顺序表代码 1.什么是顺序表 线性表是n个具有相同特性的数据元素的…...
前端面试题:节流和防抖
节流和防抖都是通过降低事件执行的频率而达到节省资源的效果 节流 一段时间只执行一次,多少秒之后获取验证码、resize 事件和scroll 事件等 类似王者荣耀中的传送,一段时间内只能传送一次,具体实现如下: function throttle(fn, delay) {let lastTime = 0;return functi…...
网络工程师学习笔记——交换机路由器 数据传输
交换机和路由器是数据通信最核心,也是所有网工最熟悉的设备。今天学习:交换机%路由器数据传输过程。 目录 一、交换机 1、交换机原理 2、交换机数据传输过程 3、交换机基本原理配置命令 二、路由器 1、路由器原理 2、路由器数据传输过程 3、静态…...
【论文笔记】A Survey on 3D Gaussian Splatting
原文链接:https://arxiv.org/abs/2401.03890 1. 引言 NeRF在计算效率和可控性上具有局限性,这导致了3D高斯溅射(3D GS)的出现,重新定义了场景表达和渲染。 3D GS通过引入新的场景表达技术,用大量的3D高斯…...
项目实战————苍穹外卖(DAY11)
苍穹外卖-day11 课程内容 Apache ECharts 营业额统计 用户统计 订单统计 销量排名Top10 功能实现:数据统计 数据统计效果图: 1. Apache ECharts 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观&#x…...
非常好用的Mac清理工具CleanMyMac X 4.14.7 如何取消您对CleanMyMac X的年度订购
CleanMyMac X 4.14.7是Mac平台上的一款非常著名同时非常好用的Mac清理工具。全方位扫描您的Mac系统,让垃圾无处藏身,您只需要轻松单击2次鼠标左键即可清理数G的垃圾,就这么简单。瞬间提升您Mac速度。 CleanMyMac X 4.14.7下载地址:…...
【51单片机系列】proteus仿真单片机的串口通信
本文参考:https://zhuanlan.zhihu.com/p/425809292。 在proteus之外使用串口软件和单片机通信。通过在proteus设计一个单片机接收PC发送的数据,并将接收的数据发送出去,利用软件【Configure Virtual Serial Port Driver】创建一对虚拟串口&am…...
【Qt】对象树与坐标系
需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。 目录 一、Qt Creator快捷键 二、对象树 1、对象树的析构 2、自定义类的编写…...
【设计模式】腾讯二面:自动贩卖机/音频播放器使用了什么设计模式?
状态模式是什么? 状态模式,也被称作状态对象模式,是一种行为设计模式。 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。 它让对象在其内部状态改变时改变自己的行为。外部调用者无需了…...
转换操作符转换类型:普通函数指针(普通函数、类的静态函数)、类的成员函数指针
一、转换操作符的定义 转换操作符是一种特殊的类成员函数 ,它定义将类类型值转变为其他类型值的转换,转换操作符在类定义体内声明,在保留字operator之后跟着转换的目标类型,转换函数采用如下通用形式: operator type(…...
易控智驾高精度地图开发工程师校招一面、二面面经
本文介绍2024届秋招中,北京易控智驾科技有限公司的高精度地图开发工程师岗位的2场面试基本情况、提问问题等。 12月投递了北京易控智驾科技有限公司的高精度地图开发工程师岗位,所在部门暂不清楚。目前完成了一面、二面流程,在这里记录一下2场…...
用VSCode玩STM32的烧录工具 CooCox Cortex Flash Programmer
一、下载软件 经热心兄弟推荐的版本,不知道有没有版权,如有版权问题,请通知删除。 CSDN - 0积分下载:https://download.csdn.net/download/qq_49053936/88744187 二、生成bin文件 插件不同,方法有所不同,各…...
Pycharm无法刷新远程解释器的框架: Can‘t get remote credentials for deployment server
在Pycharm上部署项目到远程服务器,有时候需要启动SSH会话,启动的时候发现没反应,且事件日志显示:无法刷新远程解释器的框架: Can’t get remote credentials for deployment server 观察pycharm界面最下边,发现“无默…...
c++设计模式之单例模式
介绍 一个类无论创建多少对象,都只能得到一个实例 A* p1new A(); A* p2new A(); A* p3new A(); 如上述代码中,我们通过new运算符创建出了类A的三个对象实例,而我们现在要做的是,如何设计类A,使得上述代码运行之后永远…...
Git学习笔记(第5章):Git团队协作机制
目录 5.1 团队内协作 5.2 跨团队协作 Git进行版本控制都是在本地库操作的。若想使用Git进行团队协作,就必须借助代码托管中心。 5.1 团队内协作 问题引入:成员1(大佬)利用Git在宿主机上初始化本地库,完成代码的整体…...
Python 面向对象绘图(Matplotlib篇-16)
Python 面向对象绘图(Matplotlib篇-16) 🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…...
Linux开机自动挂载window密码有转义字符的共享文件夹
项目上遇到需要自动挂载windows共享盘到linux系统中,由于windows密码有英文逗号(,),被linux识别成了参数分隔符,在网上找了很多办法都不行,后来通过这种方式完美解决,linux系统是centos8.4文章阅读操作时间在5分钟左右…...
Redis(四)
1、Redis的单/多线程 1.1、单线程 其实直接说Redis什么单线程或者是多线程,不太准确,在redis的4.0版主之前是单线程,然后在之后的版本中redis的渐渐改为多线程。 Redis是单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#…...
一文解读ISO26262安全标准:术语
一文解读ISO26262安全标准:术语 做汽车行业的人,都知道安全标准ISO26262,但是仔细说说它到底讲的是什么?好像又说不出来,这是个玄之又玄的话题,笔者试图将这份标准以简明扼要、并且容易理解的形式梳理出来&…...
使用stable diffussion插件StableSR将图片高清放大
一:需要安装的插件 1、StableSR,项目地址:https://github.com/pkuliyi2015/sd-webui-stablesr 不过国内没什么用,访问不了,可以用下面的国内镜像: https://gitee.com/han51535/sd-webui-stablesr.git 这…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
