顺序表基本操作全面解析

文章目录

  • 1.线性表
  • 2.顺序表分类
    • 2.1 静态顺序表
    • 2.2 动态顺序表
  • 3. 顺序表各接口实现
    • 1. 定义结构体`(Seqlist)`
    • 2. 结构体初始化`(SLInit)`
    • 3.检查容量 `(SLCheckCapacity)`
    • 4.打印数据 `(SLPrintf)`
    • 5.插入操作
      • 5.1 从数据头部插入`(SLPushFront)`
      • 5.2 从数据尾部插入`(SLPushBack)`
      • 5.3 从任意下标位置的插入`(SLInsert)`
    • 6.删除操作
      • 6.1 从数据头部删除`(SLPopFront)`
      • 6.2 从数据尾部删除`(SLPopBack)`
      • 6.3 从任意下标位置的删除`(SLErase)`
    • 7 销毁操作 `(SLDestroy)`
  • 4.完整代码
    • 4.1 SeqList.h文件
    • 4.2 SeqList.c文件
    • 4.3 Test.c文件

1.线性表

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

案例:蔬菜分为绿叶类、瓜类、菌菇类。线性表指的是具有部分相同特性的一类数据结构的集合

2.顺序表分类

顺序表和数组的区别:
顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口

2.1 静态顺序表

静态顺序表概念:使用定长数组存储元素
缺点是定义空间小了不够用,定义大了浪费,不好把控。

在这里插入图片描述

2.2 动态顺序表

动态顺序表概念:使用动态开辟的数组存储。
动态顺序表 根据自己的需求调整大小,
在这里插入图片描述

3. 顺序表各接口实现

首先建立3个文件
1.SeqList.h头文件,用来声明函数
2.SeqList.c文件,用来定义函数
3.Test.c文件,用来测试函数

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

1. 定义结构体(Seqlist)

在SeqList.h头文件中

typedef int SLDataType;typedef struct Seqlist
{SLDataType* a;int size;       // 有效数据int capacity;   // 空间容量
}SL;

2. 结构体初始化(SLInit)

注意下述代码皆是:
SeqList.h头文件中定义函数
SeqList.c文件中实现函数
Test.c文件中测试函数

SeqList.h文件中
定义函数:
在这里插入图片描述
SeqList.c文件中
实现函数:

 void SLInit(SL *ps)     // 数据表初始化
{assert(ps);ps->a = NULL;ps->size = 0;ps->capacity = 0;
}

Test.c文件中
测试函数:

int main()
{SL s1;SLInit(&s1);return 0;
}

调试结果:
在这里插入图片描述

3.检查容量 (SLCheckCapacity)

定义函数:
在这里插入图片描述
实现函数:

void SLCheckCapacity(SL* ps)  // 检查内存是否足够,不够就扩容。
{//一般情况为了避免频繁插入数据而增容,或者一下开辟很大的空间,我们一般是每次增容2倍assert(ps);if (ps->size == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * newCapacity);if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity = newCapacity;}
}

测试函数:

int main()
{SL s1;SLInit(&s1);SLCheckCapacity(&s1);return 0;
}

调试结果:
在这里插入图片描述

4.打印数据 (SLPrintf)

定义函数:
在这里插入图片描述
实现函数:

void SLPrintf(SL* ps)   // 数据表打印
{assert(ps);for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}

5.插入操作

5.1 从数据头部插入(SLPushFront)

定义函数:
在这里插入图片描述
实现函数:

void SLPushFront(SL* ps, SLDataType x)  // 头插
{assert(ps);SLCheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}

动图解析:
在这里插入图片描述

测试函数结果:
在这里插入图片描述

5.2 从数据尾部插入(SLPushBack)

定义函数:
在这里插入图片描述
实现函数:

void SLPushBack(SL* ps, SLDataType x)   // 尾插
{assert(ps);SLCheckCapacity(ps);ps->a[ps->size++] = x;
}

动图解析:
在这里插入图片描述

测试函数结果:
在这里插入图片描述

5.3 从任意下标位置的插入(SLInsert)

定义函数:
在这里插入图片描述

实现函数:

void SLInsert(SL* ps, int pos, SLDataType x)  // 任意下标位置的插入
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}

动图解析:
在这里插入图片描述

测试函数结果:
在这里插入图片描述

6.删除操作

6.1 从数据头部删除(SLPopFront)

定义函数:
在这里插入图片描述

实现函数:

void SLPopFront(SL* ps) // 头删
{assert(ps);assert(ps->size>0);int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

动图解析:
在这里插入图片描述

测试函数结果:
在这里插入图片描述

6.2 从数据尾部删除(SLPopBack)

定义函数:
在这里插入图片描述
实现函数:

void SLPopBack(SL* ps)  // 尾删
{assert(ps);assert(ps->size>0);ps->size--;
}

动图解析:
在这里插入图片描述

测试函数结果:
在这里插入图片描述

6.3 从任意下标位置的删除(SLErase)

定义函数:
在这里插入图片描述

实现函数:

void SLErase(SL* ps, int pos)    // 任意下标位置的删除
{assert(ps);assert(pos >= 0 && pos < ps->size);   // 这里删除不能用等于ps->size,ps->size看作下标的话相当于下标的最后一个位置+1int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

动图解析:
在这里插入图片描述

测试函数结果:
在这里插入图片描述

7 销毁操作 (SLDestroy)

定义函数:
在这里插入图片描述

实现函数:

void SLDestroy(SL* ps)  // 数据表销毁
{assert(ps);if (ps->a != NULL){free(ps->a);ps->a = NULL;ps->size = 0;ps->capacity = 0;}
}

在这里插入图片描述

4.完整代码

4.1 SeqList.h文件

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLDataType;typedef struct Seqlist
{SLDataType* a;int size;       // 有效数据int capacity;   // 空间容量
}SL;void SLInit(SL *ps);    // 数据表初始化
void SLDestroy(SL *ps); // 数据表销毁void SLPushFront(SL* ps, SLDataType x); // 头插
void SLPushBack(SL *ps ,SLDataType x);  // 尾插void SLPopFront(SL* ps);  // 头删
void SLPopBack(SL* ps);   // 尾删void SLCheckCapacity(SL* ps); // 检查内存是否足够,不够就扩容。
void SLPrintf(SL* ps);  // 数据表打印void SLInsert(SL* ps, int pos, SLDataType x);  //任意下标位置的插入
void SLErase(SL* ps, int pos);  //任意下标位置的删除

4.2 SeqList.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"void SLCheckCapacity(SL* ps)  // 检查内存是否足够,不够就扩容。
{assert(ps);if (ps->size == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * newCapacity);if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity = newCapacity;}
}void SLPrintf(SL* ps)   // 数据表打印
{assert(ps);for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}void SLInit(SL *ps)     // 数据表初始化
{assert(ps);ps->a = NULL;ps->size = 0;ps->capacity = 0;
}void SLDestroy(SL* ps)  // 数据表销毁
{assert(ps);if (ps->a != NULL){free(ps->a);ps->a = NULL;ps->size = 0;ps->capacity = 0;}
}void SLPushFront(SL* ps, SLDataType x)  // 头插
{assert(ps);SLCheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}void SLPushBack(SL* ps, SLDataType x)   // 尾插
{assert(ps);SLCheckCapacity(ps);ps->a[ps->size++] = x;
}void SLPopFront(SL* ps) // 头删
{assert(ps);assert(ps->size > 0);int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}void SLPopBack(SL* ps)  // 尾删
{assert(ps);assert(ps->size>0);ps->size--;
}// pos是下标
void SLInsert(SL* ps, int pos, SLDataType x)  // 任意下标位置的插入
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}void SLErase(SL* ps, int pos)    // 任意下标位置的删除
{assert(ps);assert(pos >= 0 && pos < ps->size);   // 这里删除不能用等于ps->size,ps->size看作下标的话相当于下标的最后一个位置+1int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

4.3 Test.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"void TestSL1()  // 头插,尾插
{printf("TestSL1:\n");SL s1;SLInit(&s1);SLPushFront(&s1, 10);SLPushBack(&s1, 30);SLPrintf(&s1);  
}void TestSL2()  // 头删,尾删
{printf("TestSL2:\n");SL s1;SLInit(&s1);SLPushFront(&s1, 10);SLPushBack(&s1, 30);SLPushFront(&s1, 10);SLPushBack(&s1, 30);SLPrintf(&s1);SLPopBack(&s1);SLPopFront(&s1);SLPrintf(&s1);
}void TestSL3()//任意下标位置的插入,删除测试
{printf("TestSL3:\n");SL s1;SLInit(&s1);SLPushFront(&s1, 10);SLPushBack(&s1, 30);SLPrintf(&s1);SLInsert(&s1, 1, 520);SLPrintf(&s1);SLErase(&s1, 2);SLPrintf(&s1);
}int main()
{TestSL1();TestSL2();TestSL3();
}

运行结果如下:
在这里插入图片描述

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

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

相关文章

GEE:基于 Landst 遥感数据计算的 kNDVI 下载 APP

作者&#xff1a;CSDN _养乐多_ 本文记录了在Google Earth Engine&#xff08;GEE&#xff09;平台中&#xff0c;使用 Landsat 遥感数据计算并且下载 kNDVI 的应用 APP 链接&#xff0c;并介绍该 APP 的使用方法和步骤。该APP可以为用户展示 NDVI 和 kNDVI 的遥感影像&#…

抽象类, 接口, Object类 ---java

目录 一. 抽象类 1.1 抽象类概念 1.2 抽象类语法 1.3 抽象类特性 1.4 抽象类的作用 二. 接口 2.1 接口的概念 2.2 语法规则 2.3 接口的使用 2.4 接口间的继承 2.5 抽象类和接口的区别 三. Object类 3.1 toString() 方法 3.2 对象比较equals()方法 3.3 hash…

免费获取GPT-4的五种工具

不可否认&#xff0c;由OpenAI带来的GPT-4已是全球最受欢迎的、功能最强大的大语言模型&#xff08;LLM&#xff09;之一。大多数人都需要使用ChatGPT Plus的订阅服务去访问GPT-4。为此&#xff0c;他们通常需要每月支付20美元。那么问题来了&#xff0c;如果您不想每月有这笔支…

基于JavaWeb+SpringBoot+Vue医院管理系统小程序的设计和实现

基于JavaWebSpringBootVue医院管理系统小程序的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏[Java 源码获取 源码获取入口 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2 2.1微信小程序 2 2.2 …

井盖位移传感器厂家批发,守护井盖安全

窨井盖广泛分布于城市街道&#xff0c;其管理效果直接反映了城市治理的现代化程度。根据住房和城乡建设部发布的《关于进一步加强城市窨井盖安全管理的通知》&#xff0c;全国各地需加强窨井盖的安全管理。作为市政基础设施的一个重要的组成部分&#xff0c;井盖的管理工作不仅…

去水印网站哪个好?试试这个去水印软件!

在工作中&#xff0c;我们都曾遇到过图片水印的困扰。在众多的在线水印去除工具中&#xff0c;虽然选择看似丰富&#xff0c;但往往很难找到完全满足我们需求的那一个。有些工具操作过程繁复&#xff0c;有些工具在处理复杂水印时力不从心&#xff0c;还有些工具在去水印的过程…

【Spring日志】

一.日志作用 1.定位和发现问题 这是日志的主要用途,通过查看日志,我们可以定位问题发生的位置,从而快速的发现问题,分析问题. 2.系统监控 监控几乎是一个成熟系统的标配,我们可以通过日志记录这个系统的运行状态,比如记录方法的响应时间,响应状态,通过设置不同的规则,超过阈值就…

葡萄酒按酒体如何分类,都有什么特点?

葡萄酒的酒体是指酒液在口腔中的饱满度和分量感&#xff0c;品酒者常用“轻盈”“厚重”“适中”等词汇来形容。所以&#xff0c;云仓酒庄的品牌雷盛红酒分享在葡萄酒分类中还有一个类型&#xff0c;就是按照酒体进行分类。一般分为轻盈型、中等型、饱满型。 轻盈型&#xff1…

海外https代理ip如何保障信息安全?该怎么选择?

海外https代理ip是指通信协议为https的海外真实网络地址ip&#xff0c;通常应用在各种跨境业务中。 一、什么是HTTPS协议 HTTP协议是一个应用层协议&#xff0c;通常运行在TCP协议之上。它是一个明文协议&#xff0c;客户端发起请求&#xff0c;服务端给出响应的响应。由于网…

表单邮箱密码登录 原生+Jquery实现

文章目录 效果代码邮箱验证正则表达式HTMLCSS JS 效果 正确密码为&#xff1a;123456 点击登录按钮校验。 代码 表单校验 - CodeSandbox 邮箱验证正则表达式 /(?:[a-z0-9!#$%&*/?^_{|}~-](?:\.[a-z0-9!#$%&*/?^_{|}~-])*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1…

Excel表中合并两个Sheet的方法?

按AltF11&#xff0c;调出Visual Basic 界面。 在左侧窗口中&#xff0c;右键选择“插入”—“模块”&#xff1a; 将如下代码粘贴进去&#xff0c;点击运行按钮&#xff0c;完成数据表合并。 Sub MergeAllSheetsInThisWorkbook() On Error Resume Next Application.ScreenU…

JOSEF约瑟 热过载保护继电器 JR36-160,整定值100-160A

系列型号 JR36-20 1.0-1.6A热继电器 JR36-20 0.25-0.35A热继电器 JR36-20 0.32-0.5A热继电器 JR36-20 0.45-0.72A热继电器 JR36-20 0.68-1.1A热继电器 JR36-20 1.5-2.4A热继电器 JR36-20 2.2-3.5A热继电器 JR36-20 3.2-5A热继电器 JR36-20 4.5-7.2A热继电器 JR36-20 …

客户案例:保障高校邮件安全,守护教育信息安全堡垒

客户背景 电子科技大学&#xff08;以下简称“电子科大”&#xff09;&#xff0c;位于四川省成都市&#xff0c;是一所历史悠久、实力雄厚的综合性工业大学。作为我国重点建设的双一流高校&#xff0c;电子科大在国内外均享有盛誉&#xff0c;其学科涵盖了理、工、管、文等多…

7.5 Windows驱动开发:监控Register注册表回调

在笔者前一篇文章《内核枚举Registry注册表回调》中实现了对注册表的枚举&#xff0c;本章将实现对注册表的监控&#xff0c;不同于32位系统在64位系统中&#xff0c;微软为我们提供了两个针对注册表的专用内核监控函数&#xff0c;通过这两个函数可以在不劫持内核API的前提下实…

Android runtime层是如何通过缩减代码来缩减内存的

文章目录 前言&#xff1a;Android 在设备上改进内存的秘密优化编译器101代码大小改进消除写入障碍隐式暂停检查合并回调其他优化改进代码下沉循环优化消除死代码 – SimplifyAlwaysThrows加载存储消除 – 使用 try catch 块加载存储消除 – 使用释放/获取操作新的内联启发式不…

递归回溯剪枝-子集

LCR 079. 子集 - 力扣&#xff08;LeetCode&#xff09; 方法一 1. 决策树&#xff1a;对于决策树&#xff0c;思考的角度不同&#xff0c;画出的决策树也会不同&#xff0c;这道题可以从两个角度来画决策树。 2. 考虑全局变量的使用&#xff1a; 使用全局变量 List<List&…

Python 基础【五】--数据类型-序列【2023.11.24】

1.定义 Python 中的序列是一块可存放多个值的连续内存空间&#xff0c;所有值按一定顺序排列&#xff0c;每个值所在位置都有一个编号&#xff0c;称其为索引&#xff0c;我们可以通过索引访问其对应值。 list1 [Google, Runoob, 1997, 2000] list2 [1, 2, 3, 4, 5 ] list3…

马克思主义基本原理课后题答案

吐血整理马原word版课后题答案&#xff0c;大家可以自行修改&#xff0c;持续更新中... 【限于篇幅原因&#xff0c;需要的同学可以点赞收藏后&#x1f44d;&#xff0c;扫码下方的公众号&#xff0c;回复相应关键词&#xff08;马原&#xff09;自行领取⭐~】

react的开发中关于图片的知识

React是一个流行的JavaScript库&#xff0c;用于构建用户界面。在React开发中&#xff0c;图片是一个非常重要的元素&#xff0c;可以用于美化界面和展示内容。本篇博客将详细讲解React中关于图片的知识。 1. React中使用图片 在React中使用图片非常简单&#xff0c;只需要使…

【Web题】狼追兔问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…