美团网站开发形式怎么做网站dns加速
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:24
当前位置: 首页 > news >正文
美团网站开发形式,怎么做网站dns加速,网络营销方式及流程,企业网站查询系统官网#x1f389;个人名片#xff1a; #x1f43c;作者简介#xff1a;一名乐于分享在学习道路上收获的大二在校生#x1f43b;❄个人主页#x1f389;#xff1a;GOTXX #x1f43c;个人WeChat#xff1a;ILXOXVJE#x1f43c;本文由GOTXX原创#xff0c;首发CSDN个人名片 作者简介一名乐于分享在学习道路上收获的大二在校生❄个人主页GOTXX 个人WeChatILXOXVJE本文由GOTXX原创首发CSDN系列专栏零基础学习C语言—– 数据结构的学习之路每日一句如果没有特别幸运那就请特别努力 ———————————————— 文章简介 本篇文章对 用C语言实现顺序表 学习的相关知识进行分享 如果您觉得文章不错期待你的一键三连哦你的鼓励是我创作动力的源泉让我们一起加油一起奔跑让我们顶峰相见 目录 一.顺序表的概念及存储结构 1.1储存结构 二.顺序表的实现 一.功能函数的实现 1.初始化函数 2.顺序表的销毁 3.顺序表的打印 4.扩容函数 5.尾插函数 6.尾删函数 7.头插函数 8.头删函数 9.插入函数 10.删除函数 11.查找函数 12.修改函数 三.总代码 四.顺序表的性能分析 一.顺序表的概念及存储结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构一般情况下采用数组存储。在数组上完成数据的增删查改。 顺序表可以分为静态顺序表和动态顺序表。 1.1储存结构 静态顺序表使用定长数组存储元素 动态顺序表数组的大小是根据存储的数据个数如果满了就动态开辟出来的相对而言不会造成空间的浪费 二.顺序表的实现 静态顺序表 只适用于确定知道需要存多少数据的场景 静态顺序表的定长数组导致N定大了空间开多了浪费开少了不够用。例如如果数组的大小定为200却只储存了几十个数据和动态的顺序表相比空间浪费更大所以现实中基本都是使用动态顺序表根据需要动态的分配空间大小所以下面我们实现动态顺序表。 一.功能函数的实现含图解 1.初始化函数 功能对结构体内成员进行初始化操作 代码实现 void InitList(SL* s) {assert(s); //断言防止传入空指针s-a (SLDateType* )malloc(sizeof(SLDateType) * 4); if (s-a NULL) //这里最开始开辟四个存储数据类型的大小{perror(malloc fail);exit(-1);}s-size 0; //存储的有效数据个数为0s-capacity 4; //空间置成4 } 2.顺序表的销毁 功能对动态开辟的空间进行销毁空间释放 代码实现 void DestoryList(SL* s) {assert(s);free(s-a); //释放动态开辟的空间s-a NULL; //置空s-capacity s-size 0; } 3.顺序表的打印 代码实现 void SListPrintf(SL* s) {assert(s);if (s-size 0) //如果没有数据则直接返回{return;}for (int i 0; i s-size; i){printf(%d , s-a[i]); //遍历依次打印}printf(\n); //打印完换行 } 4.扩容函数 功能检查是否需要扩容 代码实现 void CheckCapacity(SL* s) {assert(s);if (s-capacity s-size) //相等则说明空间已经满了{SLDateType* tmp realloc(s-a, sizeof(SLDateType)* 2 * s-capacity); //二倍扩容if (tmp NULL) {perror(realloc fail);exit(-1);}s-a tmp;s-capacity * 2;} } 5.尾插函数 功能在顺序表最后插入一个数据 代码实现 void PushBack(SL* s, SLDateType n) {assert(s);CheckCapacity(s); //检查空间是否满s-a[s-size] n; //直接插入到数组最后s-size; //有效数据个数 } 6.尾删函数 功能: 删除顺序表的最后一个数据 代码实现 void PopBack(SL* s) {assert(s);assert(s-size 0); //当数组中有效数据个数为0时不能再删除s-size–; //数据个数–} 7.头插函数 功能在顺序表最前面插入一个数据 代码实现 void PushFront(SL* s, SLDateType n) {assert(s);CheckCapacity(s); //检查扩容int end s-size; while (end0) {s-a[end] s-a[end - 1]; //挪动数据end–;}s-a[0] n; s-size; } 图解 性能分析头插一个数据首先需要将全部数据一次往后挪一个位置时间复杂度O(N) 是在原数组上进行挪动的空间复杂度O(1) 8.头删函数 功能删除表中第一个元素 代码实现 void Popfront(SL* s) {assert(s);assert(s-size 0); //size为0时不能再删除for (int i 0; i s-size; i){s-a[i] s-a[i1]; //向前挪动数据}s-size–; } 图解 性能分析头删一个数据首先需要将全部数据一次往前挪一个位置将第一个元素覆盖掉时间复杂度O(N) 是在原数组上进行挪动的空间复杂度O(1) 9.插入函数 功能在某个位置插入一个数据 代码实现 void SListInsert(SL* s, int pos, SLDateType n) {assert(s);assert(pos 0 pos s-size); //判断pos合法int end s-size;int begin pos;while (begin end){s-a[end] s-a[end - 1]; //挪动数据end–;}s-a[pos] n; //修改数据s-size; }图解 性能分析中间插入一个数据和头插差不多首先需要将该位置后面的全部数据依次往后挪一个位置将该位置空出来再将该数据插入时间复杂度O(N) 是在原数组上进行挪动的空间复杂度O(1) 10.删除函数 功能删除数组中任何位置的数据 代码实现 void SListErase(SL* s, int pos) {assert(s);assert(pos 0 pos s-size); //pos范围合法判断int cur pos;while (cur s-size){s-a[cur] s-a[cur1]; //挪动位置cur;}s-size–;} 图解 性能分析删除一个数据与头删差不多首先需要待删数据位置后面全部数据依次往前挪一个位置将待删元素覆盖掉时间复杂度O(N) 是在原数组上进行挪动的空间复杂度O(1) 11.查找函数 功能查找顺序表中某个数据返回下标 代码实现 int SListFind(SL* s,SLDateType n) {assert(s);for (int i 0; i s-size; i) //遍历寻找{if (s-a[i] n) //找到了返回下标{ return i;}}printf(顺序表中无该数据\n); exit(-1);} 性能分析将数组中的数据遍历一遍时间复杂度O(N) 空间复杂度O(1) 12.修改函数 功能修改数组中某个数据 代码实现 void SListModify(SL* s, int pos,SLDateType n) {assert(s);assert(pos 0 pos s-size);s-a[pos] n; //直接通过下标访问修改 } 三.总代码 #pragma once #includestdio.h #includestdlib.h #includeassert.htypedef int SLDateType;struct SeqList {SLDateType* a; //指向一个数组的指针int size; //记录数据个数int capacity; //记录容量如果与数据个数相等就扩容 };typedef struct SeqList SL;void InitList(SL* s);void SListPrintf(SL* s);void PushBack(SL* s, SLDateType n); void PushFront(SL* s, SLDateType n); void PopBack(SL* s); void Popfront(SL* s);int SListFind(SL* s,SLDateType n);void SListModify(SL* s, int pos, SLDateType n); void SListErase(SL* s, int pos); void SListInsert(SL* s, int pos, SLDateType n);void DestoryList(SL* s);#includeSeqList.hvoid InitList(SL* s) {assert(s); //断言防止传入空指针s-a (SLDateType* )malloc(sizeof(SLDateType) * 4); if (s-a NULL) //这里最开始开辟四个存储数据类型的大小{perror(malloc fail);exit(-1);}s-size 0; //存储的有效数据个数为0s-capacity 4; //空间置成4 }void SListPrintf(SL* s) {assert(s);if (s-size 0) //如果没有数据则直接返回{return;}for (int i 0; i s-size; i){printf(%d , s-a[i]); //遍历依次打印}printf(\n); //打印完换行 }void CheckCapacity(SL* s) {assert(s);if (s-capacity s-size) //相等则说明空间已经满了{SLDateType* tmp realloc(s-a, sizeof(SLDateType)* 2 * s-capacity); //二倍扩容if (tmp NULL) {perror(realloc fail);exit(-1);}s-a tmp;s-capacity * 2;} }void PushBack(SL* s, SLDateType n) {assert(s);CheckCapacity(s); //检查空间是否满s-a[s-size] n; //直接插入到数组最后s-size; //有效数据个数 }void PushFront(SL* s, SLDateType n) {assert(s);CheckCapacity(s); //检查扩容int end s-size; while (end0) {s-a[end] s-a[end - 1]; //挪动数据end–;}s-a[0] n; s-size; }void PopBack(SL* s) {assert(s);assert(s-size 0); //当数组中有效数据个数为0时不能再删除s-size–; //数据个数–}void Popfront(SL* s) {assert(s);assert(s-size 0); //size为0时不能再删除for (int i 0; i s-size; i){s-a[i] s-a[i1]; //向前挪动数据}s-size–; }int SListFind(SL* s,SLDateType n) {assert(s);for (int i 0; i s-size; i) //遍历寻找{if (s-a[i] n) //找到了返回下标{ return i;}}printf(顺序表中无该数据\n); exit(-1); }void SListModify(SL* s, int pos,SLDateType n) {assert(s);assert(pos 0 pos s-size);s-a[pos] n; //直接通过下标访问修改 }void SListErase(SL* s, int pos) {assert(s);assert(pos 0 pos s-size); //pos范围合法判断int cur pos;while (cur s-size){s-a[cur] s-a[cur1]; //挪动位置cur;}s-size–;}void SListInsert(SL* s, int pos, SLDateType n) {assert(s);assert(pos 0 pos s-size); //判断pos合法int end s-size;int begin pos;while (begin end){s-a[end] s-a[end - 1]; //挪动数据end–;}s-a[pos] n; //修改数据s-size; }void DestoryList(SL* s) {assert(s);free(s-a); //释放动态开辟的空间s-a NULL; //置空s-capacity s-size 0; }四.顺序表的性能分析 问题 1. 中间/头部的插入删除时间复杂度为O(N); 2. 增容需要申请新空间拷贝数据释放旧空间,会有不小的消耗; 3. 增容一般是呈2倍的增长势必会有一定的空间浪费。例如当前容量为100满了以后增容到200我们再继续插入了5个数据后面没有数据插入了那么就浪费了95个数据空间; 思考如何解决以上问题呢 下一章链表结构就可以解决这个问题
- 上一篇: 美团推广联盟深圳网站优化页面
- 下一篇: 美团网站网站建设发展广东网站建设报价
