当前位置: 首页 > news >正文

线性表--顺序表

目录

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判断是否扩容&#xff0c;按需扩容 2.5头插/尾插 2.6头删/尾删 2.7指定位置插入数据/指定位置删除数据 3.动态顺序表代码 1.什么是顺序表 线性表是n个具有相同特性的数据元素的…...

前端面试题:节流和防抖

节流和防抖都是通过降低事件执行的频率而达到节省资源的效果 节流 一段时间只执行一次,多少秒之后获取验证码、resize 事件和scroll 事件等 类似王者荣耀中的传送,一段时间内只能传送一次,具体实现如下: function throttle(fn, delay) {let lastTime = 0;return functi…...

网络工程师学习笔记——交换机路由器 数据传输

交换机和路由器是数据通信最核心&#xff0c;也是所有网工最熟悉的设备。今天学习&#xff1a;交换机%路由器数据传输过程。 目录 一、交换机 1、交换机原理 2、交换机数据传输过程 3、交换机基本原理配置命令 二、路由器 1、路由器原理 2、路由器数据传输过程 3、静态…...

【论文笔记】A Survey on 3D Gaussian Splatting

原文链接&#xff1a;https://arxiv.org/abs/2401.03890 1. 引言 NeRF在计算效率和可控性上具有局限性&#xff0c;这导致了3D高斯溅射&#xff08;3D GS&#xff09;的出现&#xff0c;重新定义了场景表达和渲染。 3D GS通过引入新的场景表达技术&#xff0c;用大量的3D高斯…...

项目实战————苍穹外卖(DAY11)

苍穹外卖-day11 课程内容 Apache ECharts 营业额统计 用户统计 订单统计 销量排名Top10 功能实现&#xff1a;数据统计 数据统计效果图&#xff1a; 1. Apache ECharts 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#x…...

非常好用的Mac清理工具CleanMyMac X 4.14.7 如何取消您对CleanMyMac X的年度订购

CleanMyMac X 4.14.7是Mac平台上的一款非常著名同时非常好用的Mac清理工具。全方位扫描您的Mac系统&#xff0c;让垃圾无处藏身&#xff0c;您只需要轻松单击2次鼠标左键即可清理数G的垃圾&#xff0c;就这么简单。瞬间提升您Mac速度。 CleanMyMac X 4.14.7下载地址&#xff1a…...

【51单片机系列】proteus仿真单片机的串口通信

本文参考&#xff1a;https://zhuanlan.zhihu.com/p/425809292。 在proteus之外使用串口软件和单片机通信。通过在proteus设计一个单片机接收PC发送的数据&#xff0c;并将接收的数据发送出去&#xff0c;利用软件【Configure Virtual Serial Port Driver】创建一对虚拟串口&am…...

【Qt】对象树与坐标系

需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、Qt Creator快捷键 二、对象树 1、对象树的析构 2、自定义类的编写…...

【设计模式】腾讯二面:自动贩卖机/音频播放器使用了什么设计模式?

状态模式是什么&#xff1f; 状态模式&#xff0c;也被称作状态对象模式&#xff0c;是一种行为设计模式。 当一个对象的内在状态改变时&#xff0c;允许改变其行为&#xff0c;这个对象看起来像是改变了其类。 它让对象在其内部状态改变时改变自己的行为。外部调用者无需了…...

转换操作符转换类型:普通函数指针(普通函数、类的静态函数)、类的成员函数指针

一、转换操作符的定义 转换操作符是一种特殊的类成员函数 &#xff0c;它定义将类类型值转变为其他类型值的转换&#xff0c;转换操作符在类定义体内声明&#xff0c;在保留字operator之后跟着转换的目标类型&#xff0c;转换函数采用如下通用形式&#xff1a; operator type(…...

易控智驾高精度地图开发工程师校招一面、二面面经

本文介绍2024届秋招中&#xff0c;北京易控智驾科技有限公司的高精度地图开发工程师岗位的2场面试基本情况、提问问题等。 12月投递了北京易控智驾科技有限公司的高精度地图开发工程师岗位&#xff0c;所在部门暂不清楚。目前完成了一面、二面流程&#xff0c;在这里记录一下2场…...

用VSCode玩STM32的烧录工具 CooCox Cortex Flash Programmer

一、下载软件 经热心兄弟推荐的版本&#xff0c;不知道有没有版权&#xff0c;如有版权问题&#xff0c;请通知删除。 CSDN - 0积分下载&#xff1a;https://download.csdn.net/download/qq_49053936/88744187 二、生成bin文件 插件不同&#xff0c;方法有所不同&#xff0c;各…...

Pycharm无法刷新远程解释器的框架: Can‘t get remote credentials for deployment server

在Pycharm上部署项目到远程服务器&#xff0c;有时候需要启动SSH会话&#xff0c;启动的时候发现没反应&#xff0c;且事件日志显示&#xff1a;无法刷新远程解释器的框架: Can’t get remote credentials for deployment server 观察pycharm界面最下边&#xff0c;发现“无默…...

c++设计模式之单例模式

介绍 一个类无论创建多少对象&#xff0c;都只能得到一个实例 A* p1new A(); A* p2new A(); A* p3new A(); 如上述代码中&#xff0c;我们通过new运算符创建出了类A的三个对象实例&#xff0c;而我们现在要做的是&#xff0c;如何设计类A&#xff0c;使得上述代码运行之后永远…...

Git学习笔记(第5章):Git团队协作机制

目录 5.1 团队内协作 5.2 跨团队协作 Git进行版本控制都是在本地库操作的。若想使用Git进行团队协作&#xff0c;就必须借助代码托管中心。 5.1 团队内协作 问题引入&#xff1a;成员1&#xff08;大佬&#xff09;利用Git在宿主机上初始化本地库&#xff0c;完成代码的整体…...

Python 面向对象绘图(Matplotlib篇-16)

Python 面向对象绘图(Matplotlib篇-16)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…...

Linux开机自动挂载window密码有转义字符的共享文件夹

项目上遇到需要自动挂载windows共享盘到linux系统中&#xff0c;由于windows密码有英文逗号(,)&#xff0c;被linux识别成了参数分隔符&#xff0c;在网上找了很多办法都不行&#xff0c;后来通过这种方式完美解决&#xff0c;linux系统是centos8.4文章阅读操作时间在5分钟左右…...

Redis(四)

1、Redis的单/多线程 1.1、单线程 其实直接说Redis什么单线程或者是多线程&#xff0c;不太准确&#xff0c;在redis的4.0版主之前是单线程&#xff0c;然后在之后的版本中redis的渐渐改为多线程。 Redis是单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#…...

一文解读ISO26262安全标准:术语

一文解读ISO26262安全标准&#xff1a;术语 做汽车行业的人&#xff0c;都知道安全标准ISO26262&#xff0c;但是仔细说说它到底讲的是什么&#xff1f;好像又说不出来&#xff0c;这是个玄之又玄的话题&#xff0c;笔者试图将这份标准以简明扼要、并且容易理解的形式梳理出来&…...

使用stable diffussion插件StableSR将图片高清放大

一&#xff1a;需要安装的插件 1、StableSR&#xff0c;项目地址&#xff1a;https://github.com/pkuliyi2015/sd-webui-stablesr 不过国内没什么用&#xff0c;访问不了&#xff0c;可以用下面的国内镜像&#xff1a; https://gitee.com/han51535/sd-webui-stablesr.git 这…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...