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

顺序表(增删查改)

目录

  • 一、什么是顺序表
  • 二、顺序表的增删查改
    • 2.1 结构体的声明
    • 2.2 顺序表的初始化
    • 2.3 顺序表检查容量
    • 2.4 顺序表尾部插入数据
    • 2.5 顺序表头部插入数据
    • 2.6 顺序表尾部删除数据
    • 2.7 顺序表头部删除数据
    • 2.8 顺序表查找数据
    • 2.9 顺序表任意位置插入数据
    • 2.10 顺序表任意位置删除数据
    • 2.11 顺序表打印数据
    • 2.12 顺序表销毁
  • 三、顺序表汇总

一、什么是顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。换句话说就是一个动态开辟的数组,然后用一个结构体来封装这一个动态数组,再增加两个结构体成员记录数组中保存数据的情况。

二、顺序表的增删查改

2.1 结构体的声明

typedef int SLDataType;typedef struct SeqList
{SLDataType* data;int sz;int capacity;}SL;

2.2 顺序表的初始化

void SeqListInit(SL* ps)
{assert(ps);ps->data = (SLDataType*)malloc(sizeof(SLDataType) * 4);if (ps->data == NULL){perror("malloc fail");return;}ps->capacity = 4;ps->sz = 0;
}

2.3 顺序表检查容量

void check_capacity(SL* ps)
{assert(ps);if (ps->capacity == ps->sz){SLDataType* tmp = (SLDataType*)realloc(ps->data, sizeof(SLDataType) * ps->capacity * 2);if (tmp == NULL){perror("realloc fail");return;}ps->data = tmp;ps->capacity *= 2;}
}

2.4 顺序表尾部插入数据

void SeqListPushBack(SL* ps,SLDataType x)
{/*assert(ps);check_capacity(ps);ps->data[ps->sz] = x;ps->sz++;*/SeqListInsert(ps, ps->sz, x);}

2.5 顺序表头部插入数据

void SeqListPushFront(SL* ps, SLDataType x)
{/*assert(ps);check_capacity(ps);int i = ps->sz - 1;for (i; i >= 0; i--){ps->data[i + 1] = ps->data[i];}ps->data[0] = x;ps->sz++;*/SeqListInsert(ps, 0, x);}

2.6 顺序表尾部删除数据

void SeqListPopBack(SL* ps)
{/*assert(ps);assert(ps->sz > 0);ps->sz--;*/SeqListErase(ps, ps->sz - 1);}

2.7 顺序表头部删除数据

void SeqListPopFront(SL* ps)
{/*assert(ps);assert(ps->sz > 0);int i = 0;for (i = 0; i < ps->sz - 1; i++){ps->data[i] = ps->data[i + 1];}ps->sz--;*/SeqListErase(ps, 0);}

2.8 顺序表查找数据

int SeqListFind(SL* ps, SLDataType x)
{assert(ps);int i = 0;for (i = 0; i < ps->sz; i++){if (ps->data[i] == x){printf("找到了,下标为:%d\n", i);return i;}}printf("找不到!\n");return -1;
}

2.9 顺序表任意位置插入数据

void SeqListInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->sz);check_capacity(ps);int i = 0;for (i = ps->sz - 1; i >= pos; i--){ps->data[i + 1] = ps->data[i];}ps->data[pos] = x;ps->sz++;
}

2.10 顺序表任意位置删除数据

void SeqListErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->sz);int i = 0;for (i = pos; i < ps->sz - 1; i++){ps->data[i] = ps->data[i + 1];}ps->sz--;}

2.11 顺序表打印数据

void Print(SL* ps)
{assert(ps);int i = 0;for (i = 0; i < ps->sz; i++){printf("%d ", ps->data[i]);}printf("\n");
}

2.12 顺序表销毁

void SeqListDestroy(SL* ps)
{assert(ps);free(ps->data);ps->data = NULL;ps->capacity = ps->sz = 0;
}

三、顺序表汇总

SeqList.h

#pragma once/
//SeqList.h
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>typedef int SLDataType;typedef struct SeqList
{SLDataType* data;int sz;int capacity;}SL;//函数声明
extern void SeqListInit(SL* ps);
extern void SeqListDestroy(SL* ps);
extern void SeqListPushBack(SL* ps, SLDataType x);
extern void SeqListPushFront(SL* ps, SLDataType x);
extern void SeqListPopBack(SL* ps);
extern void SeqListPopFront(SL* ps);
extern void Print(SL* ps);
extern int SeqListFind(SL* ps, SLDataType x);
extern void SeqListInsert(SL* ps, int pos, SLDataType x);
extern void SeqListErase(SL* ps, int pos);

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1/
//SeqList.c#include "SeqList.h"void SeqListInit(SL* ps)
{assert(ps);ps->data = (SLDataType*)malloc(sizeof(SLDataType) * 4);if (ps->data == NULL){perror("malloc fail");return;}ps->capacity = 4;ps->sz = 0;
}void SeqListDestroy(SL* ps)
{assert(ps);free(ps->data);ps->data = NULL;ps->capacity = ps->sz = 0;
}void check_capacity(SL* ps)
{assert(ps);if (ps->capacity == ps->sz){SLDataType* tmp = (SLDataType*)realloc(ps->data, sizeof(SLDataType) * ps->capacity * 2);if (tmp == NULL){perror("realloc fail");return;}ps->data = tmp;ps->capacity *= 2;}
}void SeqListPushBack(SL* ps,SLDataType x)
{/*assert(ps);check_capacity(ps);ps->data[ps->sz] = x;ps->sz++;*/SeqListInsert(ps, ps->sz, x);}void Print(SL* ps)
{assert(ps);int i = 0;for (i = 0; i < ps->sz; i++){printf("%d ", ps->data[i]);}printf("\n");
}void SeqListPushFront(SL* ps, SLDataType x)
{/*assert(ps);check_capacity(ps);int i = ps->sz - 1;for (i; i >= 0; i--){ps->data[i + 1] = ps->data[i];}ps->data[0] = x;ps->sz++;*/SeqListInsert(ps, 0, x);}void SeqListPopBack(SL* ps)
{/*assert(ps);assert(ps->sz > 0);ps->sz--;*/SeqListErase(ps, ps->sz - 1);}void SeqListPopFront(SL* ps)
{/*assert(ps);assert(ps->sz > 0);int i = 0;for (i = 0; i < ps->sz - 1; i++){ps->data[i] = ps->data[i + 1];}ps->sz--;*/SeqListErase(ps, 0);}int SeqListFind(SL* ps, SLDataType x)
{assert(ps);int i = 0;for (i = 0; i < ps->sz; i++){if (ps->data[i] == x){printf("找到了,下标为:%d\n", i);return i;}}printf("找不到!\n");return -1;
}void SeqListInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->sz);check_capacity(ps);int i = 0;for (i = ps->sz - 1; i >= pos; i--){ps->data[i + 1] = ps->data[i];}ps->data[pos] = x;ps->sz++;
}void SeqListErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->sz);int i = 0;for (i = pos; i < ps->sz - 1; i++){ps->data[i] = ps->data[i + 1];}ps->sz--;}

test.c

#define _CRT_SECURE_NO_WARNINGS 1/
//test.c
#include "SeqList.h"void test_SeqListPushBack(void)
{SL sl;SeqListInit(&sl);SeqListPushBack(&sl, 1);SeqListPushBack(&sl, 2);SeqListPushBack(&sl, 3);SeqListPushBack(&sl, 4);SeqListPushBack(&sl, 5);SeqListInsert(&sl, 2, 9);SeqListErase(&sl, 3);Print(&sl);SeqListFind(&sl, 4);}void test_SeqListPushFront(void)
{SL sl;SeqListInit(&sl);SeqListPushFront(&sl, 1);SeqListPushFront(&sl, 2);SeqListPushFront(&sl, 3);SeqListPushFront(&sl, 4);SeqListPushFront(&sl, 5);Print(&sl);
}void test_SeqListPopBack(void)
{SL sl;SeqListInit(&sl);SeqListPushBack(&sl, 1);SeqListPushBack(&sl, 2);SeqListPushBack(&sl, 3);SeqListPushBack(&sl, 4);SeqListPushBack(&sl, 5);Print(&sl);SeqListPopFront(&sl);Print(&sl);SeqListPopFront(&sl);Print(&sl);SeqListPopFront(&sl);Print(&sl);SeqListPopFront(&sl);Print(&sl);SeqListPopFront(&sl);Print(&sl);}int main()
{//test_SeqListPushBack();//test_SeqListPushFront();test_SeqListPopBack();return 0;
}

你学会了吗?喜欢的话请点亮一下小心心呗!!

相关文章:

顺序表(增删查改)

目录一、什么是顺序表二、顺序表的增删查改2.1 结构体的声明2.2 顺序表的初始化2.3 顺序表检查容量2.4 顺序表尾部插入数据2.5 顺序表头部插入数据2.6 顺序表尾部删除数据2.7 顺序表头部删除数据2.8 顺序表查找数据2.9 顺序表任意位置插入数据2.10 顺序表任意位置删除数据2.11 …...

一款优秀的低代码开发平台是什么样的?

目录 一、一款优秀的低代码平台应该是什么样的&#xff1f; 二、低代码核心能力 01、全栈可视化编程&#xff1a; 02、全生命周期管理&#xff1a; 03、低代码扩展能力&#xff1a; 三、小结 一、一款优秀的低代码平台应该是什么样的&#xff1f; 从企业角度来说&#x…...

ElasticSearch 学习笔记总结(四)

文章目录一、ES继承 Spring Data 框架二、SpringData 功能集成三、ES SpringData 文档搜索四、ES 优化 硬件选择五、ES 优化 分片策略六、ES 优化 路由选择七、ES 优化 写入速度优化七、ES 优化 内存设置八、ES 优化 重要配置一、ES继承 Spring Data 框架 Spring Data 是一个用…...

HDFS文件块大小

HDFS中的文件在物理上是分块存储&#xff08;Block&#xff09;&#xff0c;块的大小可以通过配置参数&#xff08;dfs.blocksize&#xff09;来规定&#xff0c;默认大小在Hadooop2X版本中是128M&#xff0c;老版本中是64M。 思考&#xff1a;为什么块的大小不能设置太小&…...

C++——优先级队列(priority_queue)的使用及实现

目录 一.priority_queue的使用 1.1、基本介绍 1.2、优先级队列的定义 1.3、基本操作(常见接口的使用&#xff09; 1.4、重写仿函数支持自定义数据类型 二.priority_queue的模拟实现 2.1、构造&&重要的调整算法 2.2、常见接口的实现 push() pop() top() empt…...

Linux学习记录——십일 环境变量

文章目录1、认识2、通过代码获取环境变量1、手动获取2、函数获取3、重新认识环境变量1、认识 在云服务器上写程序时&#xff0c;最终的执行需要./文件名&#xff0c;点表示当前目录&#xff0c;/是文件分隔符&#xff0c;之后就会打印程序&#xff0c;这是用户的操作&#xff…...

【人工智能 Open AI 】我们程序员真的要下岗了- 全能写Go / C / Java / C++ / Python / JS 人工智能机器人

文章目录[toc]人工智能 AI Code 写代码测试用golang实现冒泡排序用golang实现计算环比函数goroutine and channel用golang实现二叉树遍历代码用golang实现线程安全的HashMap操作代码using C programming language write a tiny Operation Systemuse C language write a tiny co…...

STM32 EXTI外部中断

本文代码使用 HAL 库。 文章目录前言一、什么是外部中断&#xff1f;二、外部中断中断线三、STM32F103的引脚复用四、相关函数&#xff1a;总结前言 一、什么是外部中断&#xff1f; 外部中断 是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时&#xff0c;单片…...

Mapper代理开发——书接MaBatis的简单使用

在这个mybatis的普通使用中依旧存在硬编码问题,虽然静态语句比原生jdbc都写更少了但是还是要写&#xff0c;Mapper就是用来解决原生方式中的硬编码还有简化后期执行SQL UserMapper是一个接口&#xff0c;里面有很多方法&#xff0c;都是一一和配置文件里面的sql语句的id名称所对…...

实体对象说明

1.工具类层Utilutil 工具顾明思义&#xff0c;util层就是存放工具类的地方&#xff0c;对于一些独立性很高的小功能&#xff0c;或重复性很高的代码片段&#xff0c;可以提取出来放到Util层中。2.数据层POJO对象&#xff08;概念比较大&#xff09; 包含了以下POJO plain ord…...

JAVA中加密与解密

BASE64加密/解密 Base64 编码会将字符串编码得到一个含有 A-Za-z0-9/ 的字符串。标准的 Base64 并不适合直接放在URL里传输&#xff0c;因为URL编码器会把标准 Base64 中的“/”和“”字符变为形如 “%XX” 的形式&#xff0c;而这些 “%” 号在存入数据库时还需要再进行转换&…...

改进YOLO系列 | ICLR2022 | OMNI-DIMENSIONAL DYNAMIC CONVOLUTION: 全维动态卷积

单个静态卷积核是现代卷积神经网络(CNNs)的常见训练范式。然而,最近的动态卷积研究表明,学习加权为其输入依赖注意力的n个卷积核的线性组合可以显著提高轻量级CNNs的准确性,同时保持高效的推理。然而,我们观察到现有的作品通过卷积核空间的一个维度(关于卷积核数量)赋予…...

信息收集之Github搜索语法

信息收集之Github搜索语法1.Github的搜索语法2.使用 Github 进行邮件配置信息收集3.使用Github进行数据库信息收集4.使用Github进行 SVN 信息收集5.使用Github进行综合信息收集在测试的信息收集阶段&#xff0c;可以去Github和码云上搜索与目标有关的信息&#xff0c;或者就有意…...

【案例教程】拉格朗日粒子扩散模式FLEXPART

拉格朗日粒子扩散模式FLEXPART通过计算点、线、面或体积源释放的大量粒子的轨迹&#xff0c;来描述示踪物在大气中长距离、中尺度的传输、扩散、干湿沉降和辐射衰减等过程。该模式既可以通过时间的前向运算来模拟示踪物由源区向周围的扩散&#xff0c;也可以通过后向运算来确定…...

试题 算法训练 自行车停放

问题描述 有n辆自行车依次来到停车棚&#xff0c;除了第一辆自行车外&#xff0c;每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或右边。(e.g.停车棚里已经有3辆自行车&#xff0c;从左到右编号为&#xff1a;3,5,1。现在编号为2的第4辆自行车要停在5号自行车的左…...

泛型与Map接口

Java学习之道 泛型 泛型这种参数类型可以用在类、方法和接口中&#xff0c;分别被称为泛型类&#xff0c;泛型方法&#xff0c;泛型接口 参数化类型&#xff1a;将类型由原来的具体的类型参数化&#xff0c;在使用/调用时传入具体的类型JDK5引入特性提供了安全检测机制&#xf…...

Unity Bug记录本

//个人记录&#xff0c;持续更新 1、将此代码挂载到空脚本上&#xff1a; bool flag (object)GetComponent<Camera>() null; bool flag1 (object)GetComponent<Text>() null; Debug.Log(flag"::"flag1); //输出结果&#xff1a;False::True bool…...

B. The Number of Products)厉害

You are given a sequence a1,a2,…,ana1,a2,…,an consisting of nn non-zero integers (i.e. ai≠0ai≠0). You have to calculate two following values: the number of pairs of indices (l,r)(l,r) (l≤r)(l≤r) such that al⋅al1…ar−1⋅aral⋅al1…ar−1⋅ar is neg…...

一起Talk Android吧(第五百一十二回:自定义Dialog)

文章目录整体思路实现方法第一步第二步第三步第四步各位看官们大家好&#xff0c;上一回中咱们说的例子是"自定义Dialog主题",这一回中咱们说的例子是" 自定义Dialog"。闲话休提&#xff0c;言归正转&#xff0c; 让我们一起Talk Android吧&#xff01;整体…...

GinVueAdmin源码分析3-整合MySQL

目录文件结构数据库准备配置文件处理config.godb_list.gogorm_mysql.gosystem.go初始化数据库gorm.gogorm_mysql.go开始初始化测试数据库定义实体类 Userserviceapi开始测试&#xff01;文件结构 本文章将使用到上一节创建的 CommonService 接口&#xff0c;用于测试连接数据库…...

从网吧到企业网:静态路由在小型网络中的3种典型应用场景

从网吧到企业网&#xff1a;静态路由在小型网络中的3种典型应用场景 在当今数字化商业环境中&#xff0c;网络连通性已成为各类企业运营的基础需求。对于中小型商业场所如连锁网吧、零售分店或小微企业分支机构而言&#xff0c;如何在有限预算下构建稳定可靠的网络架构&#xf…...

Polars 2.0清洗卡顿?,一文讲透Arrow IPC缓存、predicate pushdown与schema inference协同配置逻辑

第一章&#xff1a;Polars 2.0清洗卡顿现象的根因诊断Polars 2.0 在大规模数据清洗场景中偶发的卡顿并非源于计算能力不足&#xff0c;而是由内存管理策略变更与惰性执行链中隐式物化点触发不当共同导致。核心问题集中在 lazy() 查询计划在遭遇特定 I/O 模式或类型推断失败时&a…...

【黑客必看】2025最新kali Linux安装教程(超详细),看这一篇就够了

【黑客必看】2025最新kali Linux安装教程&#xff08;超详细&#xff09;&#xff0c;看这一篇就够了 【黑客必看】kali Linux安装教程&#xff08;超详细&#xff09;&#xff0c;看这一篇就够了&#xff01; 一、镜像下载 官网镜像链接&#xff1a;https://cdimage.kali.org/…...

Python 序列化实战指南:性能开销剖析、格式取舍与API/RPC协议优化

Python 序列化实战指南&#xff1a;性能开销剖析、格式取舍与API/RPC协议优化 &#x1f4cc; 为什么序列化开销值得每位Python开发者关注&#xff1f; Python作为“胶水语言”&#xff0c;从1991年诞生至今&#xff0c;已成为Web开发、数据科学、AI和自动化领域的绝对主力。其…...

Chord视频分析工具完整指南:支持MOV/AVI/MP4,宽屏界面适配大屏分析

Chord视频分析工具完整指南&#xff1a;支持MOV/AVI/MP4&#xff0c;宽屏界面适配大屏分析 1. 工具概览&#xff1a;本地智能视频分析新选择 Chord视频时空理解工具是一款基于先进多模态架构的本地化智能视频分析解决方案。这个工具最大的特点是完全在本地运行&#xff0c;不…...

开源工具go-cursor-help:技术突破Cursor限制的效率提升方案

开源工具go-cursor-help&#xff1a;技术突破Cursor限制的效率提升方案 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to pro…...

单细胞分析进阶:手把手教你用hdWGCNA挖掘Treg细胞关键基因模块(附完整代码)

单细胞分析进阶&#xff1a;手把手教你用hdWGCNA挖掘Treg细胞关键基因模块&#xff08;附完整代码&#xff09; 在免疫微环境中&#xff0c;调节性T细胞&#xff08;Treg&#xff09;扮演着维持免疫平衡的关键角色。理解这些细胞的基因共表达网络对于揭示其功能机制至关重要。本…...

TouchGal:打造纯净Galgame社区的5个简单步骤

TouchGal&#xff1a;打造纯净Galgame社区的5个简单步骤 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next TouchGal是一个专为视觉小说…...

薛定谔共价对接实战:如何为你的靶点蛋白快速找到‘锁死’它的共价抑制剂?

薛定谔共价对接实战&#xff1a;靶点蛋白的共价抑制剂高效筛选策略 药物研发领域正经历一场静默革命——共价抑制剂从曾经的"危险分子"摇身变为现代药物设计的明星。与传统可逆抑制剂不同&#xff0c;共价抑制剂能与靶点蛋白形成稳定的共价键&#xff0c;实现近乎不可…...

2026指纹浏览器与Web端设备识别技术的对抗与协同:从风控博弈到合规共生

在 2026 年的 Web 生态中&#xff0c;指纹浏览器与 Web 端设备识别技术始终处于 “对抗与协同” 的动态平衡中 —— 平台通过设备识别技术构建风控体系&#xff0c;防范恶意注册、批量操作、账号盗用等违规行为&#xff1b;指纹浏览器通过技术手段重构设备特征&#xff0c;实现…...