C语言---顺序表(二)

文章目录

  • 前言
  • 1.准备工作
  • 2.代码的实现
    • 2.1.顺序表的创建、销毁和打印
    • 2.2.顺序表的扩容、头插\删、尾插\删
      • 2.2.1.扩容
      • 2.2.2.尾插
      • 2.2.3.头插
      • 2.2.3.尾删
      • 2.2.4.头删
    • 2.3.指定位置之前插入/删除数据/查找数据
      • 2.3.1.指定位置之前插入数据
      • 2.3.2.指定位置之前删除数据
      • 2.3.3.查找特定数据
  • 总结


前言

上一篇,我们认识到了顺序表,以及实现顺序表操作的相关函数,下面我们来一一实现。


1.准备工作

示例:
打开vs2022,创建三个文件在这里插入图片描述
其中SeqList.h头文件是用来记录的,相当于一本书的目录
SeqList.c文件是用来实现函数的,相当于各种公式
test.c是用来测试的。
记住:一个好的习惯是,写完一个函数,要测试一个函数。

2.代码的实现

2.1.顺序表的创建、销毁和打印

//初始化
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}//销毁
void SLDestroy(SL* ps)
{if (ps->arr){free(ps->arr);}ps->capacity = ps->size = 0;
}
//打印
void SLPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}

这个代码较为简单。
思考:为什么向函数中传递形参时,是用指针,如果不是指针,会发生什么,大家可以试试。

2.2.顺序表的扩容、头插\删、尾插\删

2.2.1.扩容

//扩容
void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size){int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SeqDataType* tmp = (SeqDataType*)realloc(ps->arr,sizeof(SeqDataType) * newCapacity);if (tmp == NULL){perror("realloc fail!");exit(1);}ps->capacity = newCapacity;ps->arr = tmp;}
}

2.2.2.尾插

void SLPushBack(SL* ps, SeqDataType x)
{assert(ps);//要判断arr空间是否充足SLCheckCapacity(ps);ps->arr[ps->size++] = x;}

2.2.3.头插

void SLPushFront(SL* ps, SeqDataType x)
{assert(ps);SLCheckCapacity(ps);//要将原来数组的每一个数,移动到前面for (int i = ps->size; i>0; i--){ps->arr[i] = ps->arr[i - 1];//arr[1]=arr[0]}ps->arr[0] = x;ps->size++;
}

2.2.3.尾删

尾删可能是最简单的,但是可能第一次想象不到,只需要size–即可,在输出的结果上一看,便是少了一个,并且也是最后一个。

void SLPopBack(SL* ps)
{assert(ps);assert(ps->arr);//删着删着,最后要是顺序表为空,要报警ps->size--;
}

2.2.4.头删

void SLPopFront(SL* ps)
{assert(ps && ps->arr);//删除第一个数字后,将后面的数字,移动到前面for (int i=0; i<ps->size-1; i++){ps->arr[i] = ps->arr[i+1];//arr[size-2]=arr[size-1]}ps->size--;
}

2.3.指定位置之前插入/删除数据/查找数据

2.3.1.指定位置之前插入数据

void SLInsert(SL* ps, int pos, SeqDataType x)
{assert(ps && ps->arr);assert(pos >= 0 && pos < ps->size);SLCheckCapacity(ps);for (int i = ps->size; i>pos; i--){ps->arr[i] = ps->arr[i-1];}ps->arr[pos] = x;ps->size++;
}

assert(pos >= 0 && pos < ps->size);为什么不是<=呢,是因为咱们得目的是让数据插入到指定位置之前,如果传入的位置是ps->size的话,最后的代码将会是在ps->size之后插入的,不符合需要的功能,所以是<

2.3.2.指定位置之前删除数据

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

2.3.3.查找特定数据

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

总结

上面便是顺序表的常见的操作,大家可以根据代码,自己理解,并掌握。

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

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

相关文章

Freecad参数化三维建模的趋势——水利水电设计

最近以chatgpt3.5彻底放开和Kimi小程序如此方便使用而火爆。 三维参数化模型是一个趋势&#xff0c;特别对于这些常规的建筑物设计&#xff0c;基本极少各种曲线曲面&#xff0c;所以特别适合做参数化。 而水利水电工程上应用的设备和产品&#xff0c;也可以建立参数化库&…

微信小程序 uniapp+vue.js医疗在线问诊挂号系统4oy17

预约挂号系统的逐渐发展&#xff0c;进一步方便了广大用户&#xff0c;使其可以更方便、快捷地预约挂号&#xff0c;并且也有效地防止号贩子“倒号”&#xff0c;使用户预约挂号更公平&#xff0c;然而现有预约挂号系统或多或少有所欠缺 小程序前端框架&#xff1a;uniapp 小程…

LeetCode 2529. 正整数和负整数的最大计数——每日一题

上一篇博客&#xff1a;LeetCode 993. 二叉树的堂兄弟节点——每日一题 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.…

「合肥*讯飞」4月19日PolarDB开源数据库沙龙,报名中!

庐州聚智&#xff0c;数字经济启航智慧海 江淮引才&#xff0c;科技浪潮激荡智慧潮 4月19日周五&#xff0c;PolarDB开源社区联合科大讯飞共同举办开源数据库技术沙龙&#xff0c;本次沙龙我们邀请了众多数据库领域的专家&#xff0c;与广大数据库开发者和爱好者们进行技术交…

三十一 超级数据查看器 教程 列表界面的特殊功能

三十一 超级数据查看器 教程 列表界面的特殊功能 点击 打开该讲的视频 点击访问app下载页面 豌豆荚 下载地址 大家好&#xff0c;这一课我们讲一下超级数据查看器的特殊功能&#xff0c;特殊功能能在列表界面空白处点击后&#xff0c;执行一些特殊的功能 首先&#xff0c;我们…

可视化展示点云数据——PCL

pcd文件的可视化 #include<pcl/io/pcd_io.h> #include<pcl/io/ply_io.h> #include<pcl/visualization/cloud_viewer.h>void viewerOneOff(pcl::visualization::PCLVisualizer& viewer) {viewer.setBackgroundColor(0, 0, 0); //设置背景颜色为黑色 }boo…

C#Socket通信实现多人联机和群发消息

1.服务器代码&#xff08;这个服务器每次接受消息后就会遍历连接的客户端&#xff0c;将消息发给其他所有的客户端&#xff09; using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading;pu…

【P2P】

文章目录 P2P应用纯P2P架构文件分发&#xff1a;C/S vs P2P文件分发时间&#xff1a;C/S模式文件分发时间&#xff1a;P2P模式 P2P文件分发&#xff1a;BitTorrentP2P文件分发&#xff1a;BitTorrentBitTorrent&#xff1a;请求&#xff0c;发送文件块BitTorrent&#xff1a;ti…

Java常用数据结构与集合

数据结构 数组&#xff1a; 内存地址连续检索效率高(可以通过下标访问成员)增删操作效率低(保证数据越界的问题,需动态扩容)长度固定&#xff0c;扩容的需要新的数组复制或者Arrays类的copyOf方法 链表 内存地址不连续查询快删除慢&#xff0c;因为需要移动指针又分双向链表…

基于Springboot的餐厅点餐系统

基于SpringbootVue的餐厅点餐系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 首页展示 菜品详情页 菜品信息 个人中心 后台管理 菜品信息管理 用户管理 菜…

为什么负载电流增加时电源电压会下降?

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 大家好&#xff0c;我是工程师看海。 在以前的文章中我总是提到当负载电流增加时&#xff0c;电源的输出电压会下降&#xff0c;很多同学在实…

Kubernetes学习笔记12

k8s核心概念&#xff1a;控制器&#xff1a; 我们删除Pod是可以直接删除的&#xff0c;如果生产环境中的误操作&#xff0c;Pod同样也会被轻易地被删除掉。 所以&#xff0c;在K8s中引入另外一个概念&#xff1a;Controller&#xff08;控制器&#xff09;的概念&#xff0c;…