【数据结构】动态顺序表的接口实现(附图解和源码)
创始人
2024-05-26 02:08:28
0

动态顺序表的接口实现(附图解和源码)


文章目录

  • 动态顺序表的接口实现(附图解和源码)
  • 前言
  • 一、定义结构体
  • 二、每一个接口的实现原理(附图解)
    • 1.初始化顺序表
    • 2.增容顺序表
    • 3.尾插数据
    • 4.删除顺序表信息(尾删)
    • 5.打印顺序表信息
    • 6.销毁顺序表
    • 7.头插数据
    • 8.删除顺序表信息(头删)
    • 9.查找顺序表中元素
    • 10.指定pos下标位置插入元素
    • 11.删除pos位置的数据(头删+尾删+任意位置删除)
  • 三、源代码整理
  • 总结


前言

本文主要介绍动态顺序表中增删查改等接口实现,结尾附总源码


一、定义结构体

代码如下(示例):

#define N 1000
typedef int SLDataType;//int->SLDataTypetypedef struct SeqList
{SLDataType* a;int size;      //表示数组中存储了多少个元素int capacity; //表示最大容积
}SeqList;

二、每一个接口的实现原理(附图解)

在这里插入图片描述注意:接口函数的命名风格是跟着STL走的。
这里的11个接口,我都会一 一为大家讲解(图解+源码)

1.初始化顺序表

初始化的时候把a数组为NULL,储存元素个数和最大容量都设为0

代码如下(示例):

void SeqListInit(SeqList* ps)
{ps->a = NULL;ps->size = 0;ps->capacity = 0;
}

2.增容顺序表

当我们的size和capacity相等的时候(数组已经满了),要进行增容!具体看下图!
在这里插入图片描述在这里插入图片描述

代码如下(示例):

void SeqLisrCheckCapacity(SeqList* ps)
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));if (tmp == NULL){printf("realloc fail\n");exit(-1);}ps->a = tmp;ps->capacity = newcapacity;}
}

3.尾插数据

在这里插入图片描述

代码如下(示例):

void SeqListPushBack(SeqList* ps, SLDataType x)
{SeqLisrCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}

4.删除顺序表信息(尾删)

大家可能会好奇,为什么这里只有尾删法,一会我会给大家介绍指定位置删除的方法~
在这里插入图片描述

代码如下(示例):

void SeqListPopBack(SeqList* ps)
{if (ps->size > 0){//ps->a[ps->size - 1] = 0;ps->size--;}elseprintf("容量不足,无法执行过多的删除行为!");
}

5.打印顺序表信息

打印信息和打印一个一维数组的打印方法一样,这里不做过多的介绍!

代码如下(示例):

void SeqListPrint(SeqList* ps)
{for (int i = 0; i < ps->size; ++i){printf("%d ", ps->a[i]);}printf("\n");
}

6.销毁顺序表

所谓销毁指的就是对realloc开辟的空间通过free进行释放

代码如下(示例):

void SeqListDestroy(SeqList* ps)
{free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}

7.头插数据

头插和尾插得原来差不多,尾插一定要保证end>=0,这样才不会导致越界访问~
在这里插入图片描述

代码如下(示例):

void SeqListPushFront(SeqList* ps, SLDataType x)
{SeqLisrCheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}

8.删除顺序表信息(头删)

在这里插入图片描述

代码如下(示例):

void SeqListPopFront(SeqList* ps)
{int left = 0;if (ps->size > 0){while (left != ps->size - 1){ps->a[left] = ps->a[left + 1];left++;}ps->size--;}else{printf("没有可删除的内容!");}
}

9.查找顺序表中元素

这里采用一维数组的遍历方式进行查找并返回下标~

代码如下(示例):

int SeqListFind(SeqList* ps, SLDataType x)
{for (int i = 0; i < ps->size; i++){if (ps->a[i] == x)return i;}return -1;
}

10.指定pos下标位置插入元素

这里有两个注意的点:1.要保证pos下标不越界。2.要考虑增容问题
在这里插入图片描述

代码如下(示例):

void SeqListInsert(SeqList* ps, int pos, SLDataType x)
{assert(pos <= ps->size && pos >= 0);SeqLisrCheckCapacity(ps);int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}

11.删除pos位置的数据(头删+尾删+任意位置删除)

这里的任意位置删除可以把头删和尾删替换掉,这种删除是很全面的~
注意:这里的pos不可以越界(不可以等于size)
在这里插入图片描述

代码如下(示例):

void SeqListErase(SeqList* ps, int pos)
{assert(pos < ps->size&& pos >= 0);int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

三、源代码整理

这里分为三个文件,分别是test.c(头文件包含和测试)、SepList.c(函数的实现)、SepList.h(头文件声明)

test.c 源码如下:

#include "SepList.h"
void TestSeqList1()
{SeqList s1;SeqListInit(&s1);SeqListPushBack(&s1, 1);SeqListPushBack(&s1, 2);SeqListPushBack(&s1, 3);SeqListPushBack(&s1, 4);SeqListPushBack(&s1, 5);SeqListPrint(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);SeqListPopBack(&s1);SeqListPrint(&s1);SeqListDestroy(&s1);
}
void TestSeqList2()
{SeqList s1;SeqListInit(&s1);SeqListPushBack(&s1, 1);SeqListPushBack(&s1, 2);SeqListPushBack(&s1, 3);SeqListPushBack(&s1, 4);SeqListPushBack(&s1, 5);SeqListPrint(&s1);SeqListPushFront(&s1, 30);SeqListPushFront(&s1, 40);SeqListPushFront(&s1, 50);SeqListPushFront(&s1, 60);SeqListPrint(&s1);int ret = SeqListFind(&s1, 30);//if (ret >= 0)//	printf("找到了下标是%d\n", ret);//else//	printf("%d\n", ret);SeqListInsert(&s1, 3, 35);SeqListPrint(&s1);SeqListErase(&s1, 0);SeqListPrint(&s1);
}
int main()
{//TestSeqList1();TestSeqList2();return 0;
}

SepList.h 源码如下:

#pragma once
#include 
#include  
#include #define N 1000
typedef int SLDataType;//int->SLDataTypetypedef struct SeqList
{SLDataType* a;int size;      //表示数组中存储了多少个元素int capacity; //表示最大容积
}SeqList;//接口函数 -- 命名风格是跟着STL走的。
void SeqListInit(SeqList* ps);//初始化顺序表
void SeqListPushBack(SeqList* ps, SLDataType x);//添加顺序表信息
void SeqListDestroy(SeqList* ps);//销毁顺序表
void SeqLisrCheckCapacity(SeqList* ps);//增容顺序表
void SeqListPrint(SeqList* ps);//打印顺序表信息
void SeqListPopBack(SeqList* ps);//删除顺序表信息
void SeqListPushFront(SeqList* ps, SLDataType x);//头插数据
void SeqListPopFront(SeqList* ps);//删除头插信息
int SeqListFind(SeqList* ps, SLDataType x);//找到了返回x位置下标,没有找到返回-1
void SeqListInsert(SeqList* ps, int pos, SLDataType x);//指定pos下标位置插入
void SeqListErase(SeqList* ps, int pos);//删除pos位置的数据

SepList.c 如下(示例):

#include "SepList.h"void SeqListInit(SeqList* ps)
{ps->a = NULL;ps->size = ps->capacity = 0;
}void SeqListDestroy(SeqList* ps)
{free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}void SeqListPrint(SeqList* ps)
{for (int i = 0; i < ps->size; ++i){printf("%d ", ps->a[i]);}printf("\n");
}void SeqListPopBack(SeqList* ps)
{if (ps->size > 0){//ps->a[ps->size - 1] = 0;ps->size--;}elseprintf("容量不足,无法执行过多的删除行为!");
}void SeqLisrCheckCapacity(SeqList* ps)
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));if (tmp == NULL){printf("realloc fail\n");exit(-1);}ps->a = tmp;ps->capacity = newcapacity;}
}void SeqListPushBack(SeqList* ps, SLDataType x)
{SeqLisrCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}void SeqListPushFront(SeqList* ps, SLDataType x)
{SeqLisrCheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}void SeqListPopFront(SeqList* ps)
{int left = 0;if (ps->size > 0){while (left != ps->size - 1){ps->a[left] = ps->a[left + 1];left++;}ps->size--;}else{printf("没有可删除的内容!");}
}int SeqListFind(SeqList* ps, SLDataType x)
{for (int i = 0; i < ps->size; i++){if (ps->a[i] == x)return i;}return -1;
}void SeqListInsert(SeqList* ps, int pos, SLDataType x)
{assert(pos <= ps->size && pos >= 0);SeqLisrCheckCapacity(ps);int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}void SeqListErase(SeqList* ps, int pos)
{assert(pos < ps->size&& pos >= 0);int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

总结

以上就是今天要讲的内容,本文介绍了动态顺序表的11种接口实现原理和源码图解!
如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!
在这里和大家声明一下,本人并不是大学生,而是一个编程爱好者!!!
在这里插入图片描述

相关内容

热门资讯

父亲的平凡一生   □盘和林  2025年4月26日上午,老父亲入土为安,按照他生前遗愿,葬于我奶奶坟墓旁边。享年7...
冀菜:冀味新潮 转自:河北日报大河之北·河北非遗文化解读 美食篇冀菜:冀味新潮 5月3日,游客在保定宴饮食博物...
是秀场更是生意场 文博会“交易...   羊城晚报记者 李艺戈 林园  “今年我们还要来。”第二十一届中国(深圳)国际文化产业博览交易会(...
“5·19中国旅游日”倒计时东... 转自:中国旅游报 本报讯(记者 魏彪)5月14日,在2025年“5·19中国旅游日”倒计时城市山东省...
我省抽查化肥等产品440批发现... 本报讯 记者朱柏玲报道 日前,辽宁省市场监督管理局对2025年农用薄膜等产品质量监督抽查情况进行通报...
菲律宾中期选举初步结果出炉杜特... 新华社马尼拉5月14日电 菲律宾媒体14日公布的中期选举初步统计结果显示,菲总统马科斯所在阵营参议院...
恒瑞医药拟全球发售2.245亿...   恒瑞医药(01276)于2025年5月15日-5月20日招股,拟全球发售2.245亿股H股,其中...
@来深建设者,深圳福彩“常回家...   记者从深圳市福彩中心获悉,深圳“爱心福彩·常回家看看”第八届公益活动于5月13日开放报名通道,有...
多地更新数字人民币发展计划,涉... 2025年以来,已有北京、广州、上海等多地发布数字人民币试点工作发展计划,不断创新扩大应用场景,推动...
总能找到改变的“钥匙”    2025年3月,江苏省苏州市吴江区检察院举办检察开放日活动,李冬梅为参加活动的女孩讲授自护知识...
汽车展会火热 提振消费效应显现 转自:经济参考报今年以来,在中央和地方促汽车消费政策的推动下,国内汽车市场呈现出持续向好态势。尤其是...
全国首趟“一单制”跨境铁海联运... 来源:央视新闻客户端 昨天下午,一列满载韩国货品的跨境班列从山东烟台港发车,前往吉尔吉斯斯坦,这是全...
警方提醒:当心骗子陷阱! “你好,是××吗?我是支付宝/微信工作人员,因你的‘百万医疗保险’免费期已结束,现在需立即关闭,否则...
用匠心打造“好房子” 转自:河北日报用匠心打造“好房子”——走进石家庄市长安区回迁改造项目汀香郡 当前,房地产行业...
美国政府遭多方批评 美国副国务卿克里斯托弗·兰多12日在首都华盛顿附近杜勒斯国际机场迎接59名南非白人“难民”到来。美国...
巴菲特谈卸任CEO:“当市场恐...   即将于今年年底卸任的伯克希尔哈撒韦公司CEO沃伦·巴菲特在周三发表的一次采访中表示:“如果市场出...
爱德华多·阿拉纳宣誓就任秘鲁新... 当地时间5月14日,爱德华多·阿拉纳宣誓就任秘鲁新任部长会议主席(总理)。秘鲁部长会议主席(总理)古...
这里是西藏 | 墨脱公路攻坚 转自:CGTN 【这里是西藏 | 墨脱公路攻坚】“逢山开...
老人街头晕倒 民警紧急救助伸援... 本报讯 记者白琳报道 近日,辽阳市公安局宏伟分局兰家派出所的报警电话里传来急切的声音。值班民警闻讯即...
墨西哥中部发生交通事故 已致1... 转自:央视据墨西哥中部普埃布拉州内政部门官员报告,当地时间5月14日上午,该州夸克诺帕兰-瓦哈卡公路...