03 顺序表
目录
- 线性表
- 顺序表
- 练习
线性表(Linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串。。。
线性表在逻辑上时线性结构,是连续的一条直线。但在物理结构上不一定是连续的,存储时,通常以数组和链式结构的形式存储

2. 顺序表
2.1 概念和结构
顺序表是一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改
顺序表一般可以分为:
-
静态顺序表:使用定长数组存储元素

-
使用动态开辟的数组

2.2 接口实现
静态顺序表只适用于确定知道存多少数据的场景.静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用.所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表
头文件
#pragma once
#include <stdio.h>
顺序表的静态存储
//#define N 7
//typedef int SLDataType;
//
//typedef struct _SeqList
//{
// SLDataType array[N]; //定长数组
// size_t size; //有效数据的个数
//}SeqList;//顺序表的动态存储
typedef int SLDataType;typedef struct _SeqList
{SLDataType *array; //动态开辟的数组size_t size; //有效数据的个数size_t capacity; //容量大小
}SeqList;//接口
//初始化
void SLInit(SeqList* psl);//增加
//头插
void SLPushFront(SeqList* psl, SLDataType data);
//尾插
void SLPushBack(SeqList* psl, SLDataType data);
//中间插
void SLInsert(SeqList* psl, int pos, SLDataType data);//打印
void SLPrint(SeqList* psl);
//头删
void SLPopFront(SeqList* psl);
//尾删
void SLPopBack(SeqList* psl);
//中间删
void SLEarse(SeqList* psl, int pos);//查询
int SLFind(SeqList* psl, SLDataType data);
// 修改
void SLModify(SeqList* psl, int pos, SLDataType data);
//销毁
void SLDestory(SeqList* psl);
实现文件
#include "SeqList.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>void SLInit(SeqList* psl)
{assert(psl);psl->array = (SLDataType*)malloc(sizeof(SLDataType) * 4);if (psl->array == NULL){perror("malloc fail");return;}psl->capacity = 4;psl->size = 0;
}//检查容量
void CheckCapc(SeqList* psl)
{assert(psl);if (psl->size == psl->capacity){SLDataType* temp = (SLDataType*)realloc(psl->array, sizeof(SLDataType) * psl->capacity * 2);if (temp == NULL){perror("realloc fail");return;}psl->array = temp;psl->capacity = psl->capacity * 2;}}void SLPushFront(SeqList* psl, SLDataType data)
{assert(psl);/*CheckCapc(psl);int end = psl->size - 1;while (end >= 0){psl->array[end + 1] = psl->array[end];end--;}psl->array[0] = data;psl->size++;*///调用中间插入SLInsert(psl, 0, data);
}void SLPushBack(SeqList* psl, SLDataType data)
{assert(psl);/*CheckCapc(psl);psl->array[psl->size] = data;psl->size++;*///调用中间插入SLInsert(psl, psl->size, data);
}void SLInsert(SeqList* psl, int pos, SLDataType data)
{assert(psl);assert(pos >= 0 && pos <= psl->size);CheckCapc(psl);int end = psl->size - 1;while (end >= pos){psl->array[end + 1] = psl->array[end];end--;}psl->array[pos] = data;psl->size++;
}void SLPrint(SeqList* psl)
{assert(psl);for (int i = 0; i < psl->size; i++){printf("%d ", psl->array[i]);}printf("\r\n");
}void SLPopFront(SeqList* psl)
{assert(psl);assert(psl->size > 0);/*int start = 0;while (start < psl->size - 1){psl->array[start] = psl->array[start + 1];start++;}psl->size--;*/SLEarse(psl, 0);
}void SLPopBack(SeqList* psl)
{assert(psl);assert(psl->size > 0);psl->size--;
}void SLEarse(SeqList* psl, int pos)
{assert(psl);assert(psl->size > 0);int start = pos + 1;while (start < psl->size){psl->array[start - 1] = psl->array[start];start++;}psl->size--;
}int SLFind(SeqList* psl, SLDataType data)
{assert(psl);int i = 0;for (; i < psl->size; i++){if (psl->array[i] == data)return i;}return -1;
}void SLModify(SeqList* psl, int pos, SLDataType data)
{assert(psl);assert(pos >= 0 && pos <= psl->size);psl->array[pos] = data;
}void SLDestory(SeqList* psl)
{assert(psl);if (psl->array != NULL){free(psl->array);psl->array = NULL;}psl->capacity = 0;psl->size = 0;psl = NULL;
}
主文件
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "SeqList.h"int main()
{SeqList array;SLInit(&array);//增加SLPushBack(&array, 1);SLPushBack(&array, 2);SLPushBack(&array, 3);SLPushBack(&array, 4);SLPushBack(&array, 5);SLPushFront(&array, 6);SLPrint(&array);//删除SLPopBack(&array);SLPrint(&array);SLPopFront(&array);SLPrint(&array);SLInsert(&array, 4, 4);SLPrint(&array);//删除指定元素SLEarse(&array, 2);SLPrint(&array);SLInsert(&array, 4, 8);SLPrint(&array);int pos = SLFind(&array, 8);if (pos != -1){SLModify(&array, pos, 10);}SLPrint(&array);SLDestory(&array);return 0;
}
传入顺序表指针的函数都需要检查一下指针是否为空,用断言直接报错的好处在于运行的时候哪里出问题报错提示很明显
菜单界面在调试阶段最好别加,影响调试效率,菜单界面也不是必须的
菜单项在添加数据的时候,如何判断输入数据结束了。用-1或某个值也可能遇到用户刚好需要存入-1的情况。这时可以先输入插入数据的数量,再逐个输入数据
当scanf接收输入失败的时候会卡住下次输入,如果不清空缓冲区,可能会无限读入,可以通过判断scanf返回值看是否输入成功
3. 练习
移除元素: https://leetcode.cn/problems/remove-element/

第一种:
暴力求解,遍历数组,遇到和值一样的,将后面的往前覆盖,继续查找

时间复杂度:O(N2)
空间复杂度: O(1)
第二种:
新建一个数组,遇到值和给定值不一样的放入新数组里

时间复杂度:O(N)
空间复杂度: 开辟了新数组, O(N)
第三种:
和第二种思路相似,但不开辟新数组,在原数组上修改。用两个下标,一个des,一个src,遇到和给定值不一样的,将des处值改为src的值,两个下标都增加1,遇到一样的,只增加src下标。当src遍历完数组,返回长度

int removeElement(int* nums, int numsSize, int val) {int sign1 = 0;int sign2 = 0;for(int i = 0; i < numsSize; i++){if(nums[sign1] != val){nums[sign2] = nums[sign1];sign1++;sign2++;}else{sign1++;}}return sign2;
}
相关文章:
03 顺序表
目录 线性表顺序表练习 线性表(Linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串。。。 线性表在逻辑上时线性结构,是连续的一条直线。但在物理结…...
2023年全球软件开发大会(QCon北京站2023)9月:核心内容与学习收获(附大会核心PPT下载)
随着科技的飞速发展,全球软件开发大会(QCon)作为行业领先的技术盛会,为世界各地的专业人士提供了交流与学习的平台。本次大会汇集了全球的软件开发者、架构师、项目经理等,共同探讨软件开发的最新趋势、技术与实践。本…...
ChatGPT 和 文心一言 的优缺点及需求和使用场景
ChatGPT和文心一言是两种不同的自然语言生成模型,它们有各自的优点和缺点。 ChatGPT(Generative Pre-trained Transformer)是由OpenAI开发的生成式AI模型,它在庞大的文本数据集上进行了预训练,并可以根据输入生成具有上…...
架构师之超时未支付的订单进行取消操作的几种解决方案
今天给大家上一盘硬菜,并且是支付中非常重要的一个技术解决方案,有这块业务的同学注意自己尝试一把哈! 一、需求如下: 生成订单30分钟未支付,自动取消 生成订单60秒后,给用户发短信 对上述的需求,我们给…...
【容器固化】 OS技术之OpenStack容器固化的实现原理及操作
1. Docker简介 要学习容器固化,那么必须要先了解下Docker容器技术。Docker是基于GO语言实现的云开源项目,通过对应用软件的封装、分发、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里的应用软件&am…...
设置 SSH 通过密钥登录
我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器。但是,一般的密码方式登录,容易有密码被暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者禁用 root 账户登录。其实,有一个更…...
1.6 面试经典150题 - 买卖股票的最佳时机
买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易…...
locust快速入门--使用分布式提高测试压力
背景: 使用默认的locust启动命令进行压测时,尽管已经将用户数设置大比较大(400),但是压测的时候RPS一直在100左右。需要增加压测的压力。 问题原因: 如果你是通过命令行启动的或者参考之前文章的启动方式…...
K8s(三)Pod资源——pod亲和性与反亲和性,pod重启策略
目录 pod亲和性与反亲和性 pod亲和性 pod反亲和性 pod状态与重启策略 pod状态 pod重启策略 本文主要介绍了pod资源与pod相关的亲和性,以及pod的重启策略 pod亲和性与反亲和性 pod亲和性(podAffinity)有两种 1.podaffinity,…...
免费的域名要不要?
前言 eu.org的免费域名相比于其他免费域名注册服务,eu.org的域名后缀更加独特。同时,eu.org的域名注册也比较简单,只需要填写一些基本信息,就可以获得自己的免费域名。 博客地址 免费的域名要不要?-雪饼前言 eu.org…...
高通sm7250与765G芯片是什么关系?(一百八十一)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
[Python进阶] Python操作MySQL数据库:pymysql
7.7 操作MySQL数据库:pymysql 7.7.1 准备工作(创建mysql数据库) PHPStudy介绍: phpstudy是一款非常有用的PHP开发工具,旨在帮助开发者更加便捷地进行PHP程序的开发与调试。它提供了一个友好的图形用户界面,使得用户能够方便地进…...
Vue3实现带点击外部关闭对应弹出框(可共用一个变量)
首先,假设您在单文件组件(SFC)中使用了Vue3,并且有两个div元素分别通过v-if和v-else来切换显示一个带有.elpopver类的弹出组件。在这种情况下,每个弹出组件应当拥有独立的状态管理(例如:各自的isOpen变量)。…...
可视化试题(一)
1. 从可视化系统设计的角度出发,通常需要根据系统将要完成的任务的类型选择交互技术。按照任务类型分类可以将数据可视化中的交互技术分为选择、( 重新配置 )、重新编码、导航、关联、( 过滤 )、概览和细节等八…...
RHCE 【在openEuler系统中搭建基本论坛(网站)】
目录 网站需求: 准备工作: 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 测试: 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于[www.openla…...
20240112让移远mini-PCIE接口的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通【DTS部分】
20240112让移远mini-PCIE接口的4G模块EC20在Firefly的AIO-3399J开发板的Android11下跑通【DTS部分】 2024/1/12 16:20 https://blog.csdn.net/u010164190/article/details/79096345 [Android6.0][RK3399] PCIe 接口 4G模块 EC20 调试记录 https://blog.csdn.net/hnjztyx/artic…...
日志采集传输框架之 Flume,将监听端口数据发送至Kafka
1、简介 Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传 输的系统。Flume 基于流式架构,主要有以下几个部分组成。 主要组件介绍: 1)、Flume Agent 是一个 JVM 进程…...
关于Vue前端接口对接的思考
关于Vue前端接口对接的思考 目录概述需求: 设计思路实现思路分析1.vue 组件分类和获取数值的方式2.http 通信方式 分类 如何对接3.vue 组件分类和赋值方式, 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your p…...
【设计模式之美】SOLID 原则之三:里式替换(LSP)跟多态有何区别?如何理解LSP中子类遵守父类的约定
文章目录 一. 如何理解“里式替换原则”?二. 哪些代码明显违背了 LSP?三. 回顾 一. 如何理解“里式替换原则”? 子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。 里氏替换原则…...
代码随想录第六十三天——被围绕的区域,太平洋大西洋水流问题,最大人工岛
leetcode 130. 被围绕的区域 题目链接:被围绕的区域 步骤一:深搜或者广搜将地图周边的’O’全部改成’A’ 步骤二:遍历地图,将’O’全部改成’X’,将’A’改回’O’ class Solution { private:int dir[4][2] {-1, 0…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
