线性表——顺序表(增删查改)

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

静态顺序表——使用定长数组储存数据

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

动态顺序表

在这里插入图片描述

动态顺序表的实现

多应用文件的形式写代码:text.c ——测试
seqlist,c ——函数实现
seqlist.h ——函数的声明

首先在头文件中创建一个动态顺序表的内存储存结构体

#include<stdio.h>
#include<stdlib.h> typedef int SLDataType;
typedef struct SeqList
{SLDataType* a;//指向动态开辟的数组int size;//记录有效数组个数int capicity;//记录空间大小
}SL;//重名名为SL

然后在text.c中的main函数中定义一个结构体变量s,

int main()
{SL s;SLInit(&s);//传址才能改变形参return 0;
}

然后再seqlist.c中实现顺序表的初始化

void SLInit(SL* p)
{p->a = (SLDataType*)malloc(sizeof(SLDataType) * 4);//开辟4个空间if (p->a == NULL){perror("malloc faild");exit(-1);}p->size = 0;p->capicity = 4;
}

在顺序表的末尾增加数据
在这里插入图片描述
主函数调用传参就可以增加了


int main()
{SL s;SLInit(&s);//传址才能改变形参SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 1);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);PRint(&s);SLDestroy(&s);return 0;
}
void SLPushBack(SL* p, SLDataType x)
{if (p->size == p->capicity)//如果相等就要增容{SLDataType* ps = (SLDataType*)realloc(p->a, p->capicity * 2 * (sizeof(SLDataType)));if (ps == NULL){perror("realloc faild");exit(-1);}p->a = ps;p->capicity *= 2;}p->a[p->size] = x;p->size++;}void PRint(SL* p)
{for (int i = 0; i < p->size; i++){printf("%d ", p->a[i]);}printf("\n");
}

在这里插入图片描述
在顺序表的末尾删除数据
——直接size–把末尾的有效数据删了,空间capicity不变,但是要注意不能越界,所以删除函数中还要写代码来检测是否删除越界了(szieof<0)

void SLPoBack(SL* p)
{//当size小于0后,就不删了//温柔的方法/*if (p->size == 0)return;*///强制的方法——越界了就直接给报错assert(p->size > 0);p->size--;
}

在顺序表的头部插入数据
——整体数据向后挪动,给要插入的数据腾出首位置
因为这种方法也要考虑需不需要曾容的问题,所以直接把增容的代码也打包成一个函数封装使用

void SLPushFront(SL* p, SLDataType x)
{SLCheckCapacity(p);//判断增容函数//挪动数据int end = p->size - 1;while (end >= 0){p->a[end+1] = p->a[end];end--;}//这样就实现了原有数据的整体向后挪动p->a[0] = x;//首位置增加数据p->size++;//有效数据+1
}

头部删除数据——直接用后面的数据覆盖
在这里插入图片描述

void SLPopFront(SL* p)
{
//当没有数据的时候如果还删的话就会出现越界报错
assert(p->size>0);//挪动数据int exit =1;while (exit<p->size)p->a[exit-1] = p->a[exit];++exit;}//这样就实现了原有数据的整体向后挪动p->size--;//有效数据+1
}

在pos位置插入x

在这里插入图片描述
代码:

void SLInsert(SL* p, int pos, SLDataType x)
{assert(pos >= 0 && pos <= p->size);SLCheckCapacity(p);//判断增容函数,因为如果pos=size那么就是在末尾增加数据,就要判断是否要增容int end = p->size - 1;while (end >= pos){p->a[end + 1] = p->a[end];end--;}p->a[pos] = x;p->size++;
}

有了这个方法,那么我们在之前的头增尾增的代码就可以改成直接调用这个函数就行
在这里插入图片描述
在这里插入图片描述

删除pos位置的值

在这里插入图片描述
代码:

void SLErase(SL* p, int pos)
{assert(pos >= 0 && pos < p->size);int begin = pos + 1;while (begin < p->size){p->a[begin - 1] = p->a[begin];begin++;}p->size--;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springWeb

springweb就是spring框架中的一个模块&#xff0c;对web层进行了封装&#xff0c;使用起来更加方便。如何方便&#xff1f;参数接收框架进行封装 SpringWeb拥有控制器&#xff0c;接收外部请求&#xff0c;解析参数传给服务层。 SpringWeb运行流程 用户发起请求 ip:端口/项目名…

利用 Python 中的地理空间数据与 GeoPandas

推荐&#xff1a;使用 NSDT编辑器快速搭建3D应用场景 空间数据的真正潜力在于它能够连接数据点及其各自的位置&#xff0c;为高级分析创造无限的可能性。地理空间数据科学是数据科学中的一个新兴领域&#xff0c;旨在利用地理空间信息并通过空间算法和机器学习或深度学习等先进…

车载多通道语音识别挑战赛(ICMC-ASR)丨ICASSP2024

由希尔贝壳、理想汽车、西工大音频语音与语言处理研究组、新加坡南洋理工大学、天津大学、WeNet开源社区、微软、中国信通院等单位发起的“车载多通道语音识别挑战赛”&#xff08;ICMC-ASR&#xff09;将作为IEEE声学、语音与信号处理国际会议&#xff08;ICASSP2024&#xff…

2个U盘安装Windows10的方法推荐!

"我刚刚购买了一块全新的硬盘。我在旧硬盘上安装了 Windows 10 操作系统&#xff0c;现在我希望将它迁移到我的新硬盘上。是否有人可以提供帮助&#xff0c;并指导我该如何进行&#xff1f;我是否只需将旧硬盘插入计算机&#xff0c;然后在 BIOS 中更改启动顺序以启动新硬…

第4篇 vue的基本语法操作以及组件,声明周期,路由的操作

一 vue常用操作案例 1.1 事件渲染 1.数据渲染的方式&#xff1a;使用插值表达式{{}}进行数据渲染 2.数据渲染的方式&#xff1a;以使用 v-bind指令&#xff0c;它的简写的形式就是一个冒号&#xff08;:&#xff09;&#xff0c;v-bind 特性被称为指令。指令带有前缀 v- 代…

element -ui table表格内容无限滚动 使用插件vue-seamless-scroll

使用插件 一、安装组件依赖 npm install vue-seamless-scroll 二、引入组件 import vueSeamlessScroll from "vue-seamless-scroll"; components: { vueSeamlessScroll }, <div class"table-list "><vue-seamless-scroll :class-option"…

SSTI注入利用姿势合集

文章目录 前言SSTI模板注入原理&#xff1f;关于Python的类知识构造链的思路Jinjia2获取配置信息lipsumrequesturl_forget_flashed_messagesg对象 Jinjia2 Bypass.绕过引号绕过_绕过init过滤[ ]被过滤 羊城杯2023[决赛] SSTI2020XCTF 华为专项赛Tornado通用手法tornado.templat…

js dispatchEvent派发自定义事件

低版本IE浏览器不兼容 dispatchEvent使用 在标准浏览器提供了元素触发自定义事件的方法 element.dispatchEvent()&#xff0c;就是说&#xff0c;我们可以不用在DOM上点击按钮触发事件&#xff0c;在代码里通过 dispatchEvent&#xff08;&#xff09;就能触发事件。如下&…

NZ系列工具NZ03:利用右键进行筛选操作

【分享成果&#xff0c;随喜正能量】生活就是这样&#xff0c;别人看的是结果&#xff0c;而自己撑的却是整个过程。曾经的微笑&#xff0c;是一种心情&#xff0c;现在的微笑&#xff0c;只不过是一种表情。如果情绪不能用言语说出来&#xff0c;那就去吹吹风吧。。 我的教程…

RobotFrameWork自动化测试环境搭建

前言 Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性&#xff0c;支持关键字驱动&#xff0c;可以同时测试多种类型的客户端或者接口&#xff0c;可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发&#xff08;ATDD&#xff0…

蓝桥杯打卡Day7

文章目录 阶乘的末尾0整除问题 一、阶乘的末尾0IO链接 本题思路&#xff1a;由于本题需要求阶乘的末尾0&#xff0c;由于我们知道2*510可以得到一个0&#xff0c;那么我们就可以找出2的数和5的数&#xff0c;但是由于是阶乘&#xff0c;所以5的数量肯定是小于2的数量&#xf…

企业网络革命:连接和访问的智慧选项

近年来&#xff0c;企业网络通信需求可谓五花八门&#xff0c;变幻莫测。它不仅为企业的生产、办公、研发、销售提供全面赋能&#xff0c;同时也让企业业务规模变大成为了可能。今天&#xff0c;我们来聊聊广域网中两个不可忽视的概念&#xff1a;连接&#xff08;Connection&a…