#include《初见C语言之顺序表的增删查改》

目录

一、顺序表

二、顺序表的分类

三、顺序表的实现前期准备

第一步,确定需要的文件

第二步,开始分析

四、顺序表的实现

1.初始化

2.销毁

3.申请空间

4.打印

5.尾插

6.头插

7.尾删

8.头删

9.指定位置之前插入

10.指定位置之前删除

11.查找

五、注意的问题

1.空指针(常常作为野指针)

2.申请空间(忘记)

3.头插、头删、指定位置之前的插入的下标和结束条件

4.查找相等的时候要用

5.记得要传地址,不是传值!!!


【注】要讲顺序表就要知道什么是线性表以及其中的概念,就需要去系统的对数据结构进行学习,本篇这要是讲解如何用c语言实现顺序表的增删查改

一、顺序表

【提前了解】

顺序表是线性表的一种,线性表的物理结构不一定是线性和逻辑结构一定是线性的

顺序表物理和逻辑结构都是线性的

【说明】

顺序表底层就是数组,下面我们做个比喻

数组(快餐)顺序表(大饭店)
洋芋丝豪华金丝

通过这个比喻,可以看出顺序表就是数组的一个包装。


二、顺序表的分类

顺序表又分为静态顺序表和动态顺序表

静态顺序表动态顺序表
优点

固定空间

灵活多变
缺点

1.给多了浪费空间

2.给少了不够用

容易导致内存紧张

(需释放空间)

 静态顺序表

//#define Emax 100//定义一个最大值
//
//struct SqeList
//{
//    int arr[Emax];//数组
//    int size;//有效数据
//};

 动态顺序表

typedef int Datatype;//定义一个数据类型,
typedef struct SqeList
{
    Datatype* arr;//数组
    int size;//有效数据
    int capacity;//空间大小
}SL;//结构体变量名

【观察】

  1. 动态顺序表笔静态多一个空间大小的变化,所以我们一般选用动态顺序表来实现顺序表的增删查改。 
  2. typedef int Datatype;//定义一个数据类型,将来可以随时改要增删查改的数据类型

三、顺序表的实现前期准备

不管是快餐还是大饭店,都是要提前准备好

第一步,确定需要的文件

这里需要三个文件

第一个是测试文件,每次写完一个功能就要测试,防止代码写完,处处报错的崩溃感

第二个是顺序表的功能实现文件,在在测试文件调用

第三个事顺序表的头文件,主要是把函数声明和库函数的放在这个文件(也是整个代码的目录,方便查阅代码的功能) 

第二步,开始分析

顺序的增删查改说白了就是数组的增删查改,只需要在数组的基础上初始化和销毁

主要实现的功能

//初始化
void SLorigin(SL* ps);
//销毁
void SLdestory(SL* ps);

//打印
void Print(SL ps);
//尾插
void SLbackinsert(SL* ps, Datatype x);
//头插
void SLfrontinsert(SL* ps, Datatype x);
//尾删
void SLbackdelete(SL* ps);
//头删
void SLforntdelete(SL* ps);
//指定位置之前插入
void SLbeforeinsert(SL* ps,int pot,Datatype x);
//指定位置之前删除
void SLbeforedelete(SL* ps, int pot);
//查找
int SLFind(SL*ps,Datatype x);


四、顺序表的实现

1.初始化

以下是头文件(类似) 

//初始化
void SLorigin(SL* ps);

SL是结构体的变量名,要传地址才能使用,所以用指针 ,之后的都是类似的

这一步就是大饭店开始做宴席时,要把锅碗瓢盆擦干净——(要动态顺序表的arr,size,capacity不能有其他东西)

代码实现:

void SLorigin(SL* ps)
{
	ps->arr = NULL;
	ps->capacity = ps->size = 0;
}

 调试展示:

 画图展示:

2.销毁

//销毁
void SLdestory(SL* ps);

这一步就是餐馆里吃完饭后要把碗筷收回洗干净备用——(将顺序表的内存收回)

代码实现:

//销毁
void SLdestory(SL* ps)
{
    if (ps->arr != NULL)
    {
        free(ps->arr);
    }
    ps->arr = NULL;
    ps->capacity = ps->size = 0;
}

  调试展示:

画图展示:

 

3.申请空间

这个就是餐馆的后厨,需要再一个地方把菜炒出来——(顺序表的空间)

这一步我们直接封装成函数,要用时直接调用(谁都可以在这里炒菜)

代码实现:

//申请空间
void SLCheckspace(SL*ps)
{
	if (ps->size == ps->capacity)
	{
		int	Newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		Datatype* tmp = (Datatype*)realloc(ps->arr, sizeof(Datatype) * Newcapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return 1;
		}
		ps->arr = tmp;
		ps->capacity = Newcapacity;
	}
}

这里的增容使用的是realloc,realloc可以动态的增容,让空间不够用时会按照原来的两倍增容 

这样的好处是:既不会打断系统的操作,也不会空间紧张。

调试展示:

4.打印

将菜的成品端上餐桌

//打印
void Print(SL ps);

代码实现:

//打印
void Print(SL ps)
{
	for (int i = 0; i < ps.size; i++)
	{
		printf("%d ", ps.arr[i]);
	}
	printf("\n");
}

 画图展示:

5.尾插

宴席上从最后一桌开始上菜——尾插顾名思义就是从数组的最末端开始插入

//尾插
void SLbackinsert(SL* ps, Datatype x);

代码实现:

//尾插
void SLbackinsert(SL* ps, Datatype x)
{
	assert(ps);
	SLCheckspace(ps);
	ps->arr[ps->size] = x;
	++ps->size;
}

调试展示:

画图展示:

6.头插

从第一桌开始端菜——从数组下标为0的地方插入

//头插
void SLfrontinsert(SL* ps, Datatype x);

代码实现:

//头插
void SLfrontinsert(SL* ps, Datatype x)
{
	assert(ps);
	SLCheckspace(ps);
	for (int i = ps->size; i>0; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[0] = x;
	++ps->size;
}

调试展示:

画图展示:

7.尾删

从餐桌的最后一桌开始收

//尾删
void SLbackdelete(SL* ps);

代码实现:

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

 运行结果:

画图展示:

8.头删

从第一桌开始收

//头删
void SLforntdelete(SL* ps); 

代码实现:

//头删
void SLforntdelete(SL* ps)
{
	assert(ps);
	assert(ps->size);
	for (int i = 0; i<ps->size; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	--ps->size;
}

运行结果:

画图演示:

 

9.指定位置之前插入

谁点的菜上谁桌

//指定位置之前插入
void SLbeforeinsert(SL* ps,int pot,Datatype x);

代码实现:

//指定位置之前插入
void SLbeforeinsert(SL* ps, int pot, Datatype x)
{
	assert(ps);
	assert(pot >= 0 && pot <= ps->size);
	SLCheckspace(ps);
	for (int i = ps->size; i>pot; i--)
	{
		ps->arr[i] = ps->arr[i-1];
	}
	ps->arr[pot] = x;
	ps->size++;
}

 运行结果:

 画图展示:

10.指定位置之前删除

谁投诉退谁的菜

//指定位置之前删除
void SLbeforedelete(SL* ps, int pot);

代码实现:

//指定位置之前删除
void SLbeforedelete(SL* ps, int pot)
{
	assert(ps);
	assert(pot >= 0 && pot < ps->size);
	SLCheckspace(ps);
	for (int i =pot ; i<ps->size-1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	--ps->size;
}

运行结果:

 画图展示:


11.查找

查账本

//查找
int SLFind(SL*ps,Datatype x);

 代码实现:

//查找
int SLFind(SL* ps,Datatype x)
{
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x)
		{
			return i;
		}
	}
	return -1;
}

运行结果:


五、注意的问题

1.空指针(常常作为野指针)

ps->arr=NULL;

2.申请空间(忘记)

if()

3.头插、头删、指定位置之前的插入的下标和结束条件

for()

4.查找相等的时候要用

(==)

5.记得要传地址,不是传值!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

grid的常见使用场景

场景1&#xff1a;固定几列显示&#xff0c;显示不下会自动换行 <div id"container"><div class"item item-1">1</div><div class"item item-2">2</div><div class"item item-3">3</div>&l…

vscode go语言开发中在任意包运行和调试代码 Example使用方法

一般情况下我们在进行go语言开发的时候我们都需要创建一个main方法和main包才能运行go代码&#xff0c; 针对这个问题&#xff0c;go语言给我们内置了功能强大的testing测试框架&#xff0c; 其中一个很有意思的Example测试就非常的方便使用。 他不管你在什么包&#xff0c;也…

LNMP环境部署WordPress——使用源码包安装方式部署环境

目录 一.前提准备 二.源码安装Mysql 1.MySQL类型 2.MySQL 版本说明 3.MySQL 安装方式 3.1 yum 安装 3.2 编译安装 3.3 二进制安装 3.4 rpm 安装 4. 编译安装MySQL5.7 4.1 清理安装环境 4.2 创建mysql用户 4.3 从官网下载tar包 4.4 安装编译工具 4.5 解压 4.6 …

Vue3:路由

1. 路由简介 在Vue3中&#xff0c;路由是一个核心概念&#xff0c;特别是在构建单页面应用程序&#xff08;SPA&#xff09;时。以下是Vue3中路由的基本概念&#xff1a; 1. **路由&#xff08;Route&#xff09;**&#xff1a;在Vue3中&#xff0c;路由是指根据特定的规则将用…

i春秋-Backdoor

题目 考点 git源码泄露 Linux文件恢复 代码审计 http 解题 参考wp https://blog.csdn.net/cbhjerry/article/details/105791056https://www.pianshen.com/article/19461342501/扫描 题目给出提示&#xff1a;敏感文件泄漏 于是使用dirsearch扫一下 python dirsearch.py -…

如何到《新英格兰医学杂志》 NEJM查找下载文献

《新英格兰医学杂志》NEJM是世界上阅读、引用最广泛、影响力最大的综合性医学期刊之一。NEJM集团出版的期刊还包括NEJM Journal Watch、NEJM Catalyst及NEJM Evidence。NEJM是一份全科医学周刊&#xff0c;出版对生物医学科学与临床实践具有重要意义的一系列主题方面的医学研究…

废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp(源码搭建/上线/运营/售后/更新)

一款基于FastAdminThinkPHPUniApp开发的废品回收系统&#xff0c;适用废品回收站、再生资源回收公司上门回收使用的小程序。 一、FastAdmin框架特色功能及优势 模块化开发&#xff1a;控制器、模型、视图、JS一一对应&#xff0c;使用RequireJS进行插件机制&#xff0c;支持插…

QX----mini51单片机学习---(7)矩阵键盘

目录 1矩阵键盘的识别 2相关c语言 3实践编程 1矩阵键盘的识别 假设按列扫描按下S6P30&#xff1a;0P34&#xff1a;1然后高流向低&#xff0c;P34&#xff1a;0&#xff0c;刚开始是0xf0&#xff1a;1111 0000 后面是0xe0&#xff1a;1110 0000 &#xff0c;当是0xe0能确…

如何通过AI技术实现员工培训的革命性变革

AI个性化培训&#xff1a;开启员工潜力的新篇章 在当今这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的影响力已经渗透到社会的各个层面&#xff0c;包括教育与培训行业。AI技术正在彻底改变我们获取知识与技能的方式&#xff0c;特别是在员工培训领域…

Offline: Overcoming Model Bias for Robust Offline Deep Reinforcement Learning

EAAI 2023 paper Intro model-free的离线强化学习由于价值函数估计问题存在训练的稳定性以及鲁棒性较低。本文提出基于模型的方法&#xff0c;同构构建稳定的动力学模型帮助策略的稳定训练。 method 本文基于模型的方法&#xff0c;所构造的转移模型输入状态动作&#xff0…

【python】python中的argparse模块,教你如何自定义命令行参数

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

C++容器——list

目录 list容器 list容器使用流程 加入头文件 定义 list容器的使用 添加元素&#xff1a; 删除元素&#xff1a; 访问元素&#xff1a; 容器大小&#xff1a; 迭代器操作&#xff1a; 其他操作&#xff1a; list容器 功能&#xff1a;将数据进行链式存储 链表(list…

数据结构--队列

一、认识队列 队列&#xff08;Queue&#xff09;是一种 受限的线性数据结构&#xff0c;具有 先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的特点。 受限之处&#xff1a; 只允许在表的前端&#xff08;front&#xff09;进行删除操作。只允许在表…

《Decoupled Optimisation for Long-Tailed Visual Recognition》阅读笔记

论文标题 《Decoupled Optimisation for Long-Tailed Visual Recognition》 长尾视觉识别的解耦优化 作者 Cong Cong、Shiyu Xuan、Sidong Liu、Shiliang Zhang、Maurice Pagnucco 和 Yang Song、 来自新南威尔士大学计算机科学与工程学院、北京大学计算机学院多媒体信息处…

乡村振兴与乡村振兴战略的深度融合:落实乡村振兴战略,推动乡村全面发展,打造富强民主文明和谐美丽的社会主义现代化新农村

一、引言 在全面建设社会主义现代化国家的新征程中&#xff0c;乡村振兴战略承载着推动乡村全面发展、实现农业农村现代化的重大使命。乡村振兴战略的实施&#xff0c;不仅关系到亿万农民的福祉&#xff0c;也关系到国家整体发展的质量和水平。因此&#xff0c;深化乡村振兴与…

YOLOv8项目使用说明

1. 下载群公告中的百度云连接&#xff0c;得到一个压缩文件 2. 解压并使用相关软件&#xff08;如pycharm、VSCode等&#xff09;打开 3. 选择一个合适的模型yaml文件&#xff0c;及数据集yaml文件进行训练 4. 配置并填入数据集yaml文件 5. 运行即可

MyCat实现分库分表

两个集群 两个库 两个表 搭建数据库服务使用docker启动两个mysql 3506 3507连接MyCat创建两个数据源连接MyCat创建集群 mycat创建逻辑库MyCat创建全局表广播表创建分片表mycat逻辑库MyCat插入数据mycat查看数据物理库3506查看数据物理库3507查看数据 ER表创建ER表mycat插入数据…

【Linux:lesson1】的基本指令

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f697;打开Xshell&#xff0c;登陆root…

Python | Leetcode Python题解之第76题最小覆盖子串

题目&#xff1a; 题解&#xff1a; class Solution:def minWindow(self, s: str, t: str) -> str:ans_left, ans_right -1, len(s)left 0cnt_s Counter() # s 子串字母的出现次数cnt_t Counter(t) # t 中字母的出现次数less len(cnt_t) # 有 less 种字母的出现次数…

【Vue基础】Vue在组件数据传递详解

Vue核心基础-CSDN博客 先回顾Vue特性&#xff1a; Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;具有许多强大的特性。以下是一些主要的 Vue 特性&#xff1a; 响应式数据&#xff1a;Vue 使用双向绑定来实现数据的响应式更新。当数据发生变化时&#xff0c;视图会自…