数据结构之顺序表的实现(C语言版)

     Hello, 大家好,我是一代,今天给大家带来有关顺序表的有关知识

     所属专栏:数据结构

     创作不易,望得到各位佬们的互三呦

一.前言

1.首先在讲顺序表之前我们先来了解什么是数据结构

数据结构是由“数据”和“结构”两词组合⽽来。
什么是数据?常见的数值1、2、3、4.....、教务系统⾥保存的用户信息(姓名、性别、年龄、学历等
等)、网页里肉眼可以看到的信息(文字、图片、视频等等),这些都是数据
什么是结构?
当我们想要使⽤⼤量使⽤同⼀类型的数据时,通过⼿动定义⼤量的独⽴的变量对于程序来说,可读性
⾮常差,我们可以借助数组这样的数据结构将⼤量的数据组织在⼀起,结构也可以理解为组织数据的方式。
概念: 数据结构是计算机存储、组织数据的⽅式。数据结构是指相互之间存在⼀种或多种特定关系 的数据元素的集合。数据结构反映数据的内部构成,即数据由哪部分构成,以什么方式构成,以及数据元素之间呈现的结构。

二.顺序表的概念及结构

 1.线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使

用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...
线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,
线性表在物理上存储时,通常以数组和链式结构的形式存储。
案例:蔬菜分为绿叶类、瓜类、菌菇类。线性表指的是具有部分相同特性的⼀类数据结构的集合

2.顺序表分类

1.顺序表和数组的区别

     顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝

2.顺序表分类

顺序表分为静态顺序表和动态顺序表两种

1.静态顺序表

2.动态顺序表

这里有两种顺序表,但动态顺序表比静态顺序表跟好,因为静态顺序表结构体中定义的数组大小是一定的,如果想要数组满了,就不可以增加数据,而且静态顺序表可能会造成空间大量浪费,比如说我开辟的数组大小是10000,但我只用了两个空间的大小,这样就会造成空间大量浪费,但动态顺序表就可以很好的解决这个缺点。

所以下面我就给大家介绍动态顺序表,相信大家将动态顺序表学会,静态顺序表就自然会写了。

三.动态顺序表的结构 

1.动态顺序表对应函数及结构体(SeqLIst.h

#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 SLPrint(SL s);
void SLCheckCapacity(SL* ps);//头部插入删除 / 尾部插入删除
void SLPushBack(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPushFront(SL* ps, SLDataType x);
void SLPopFront(SL* ps);//指定位置之前插入/删除数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
int SLFind(SL* ps, SLDataType x);

2.对应函数的实现(SeqList.c) 

1.顺序表的初始化

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

2.顺序表的摧毁

void SLDestroy(SL*ps)
{if(ps->a)free(ps->a);//记住动态开辟的空间才可以释放,静态顺序表不可以这样ps->a = NULL;ps->size = ps->capacity = 0;
}

3.顺序表的扩容

void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
//三目操作符如果空间为0,则给四个大小为SLDataType的空间,否则就为原来空间的两倍SLDataType* str = (SLDataType*)realloc(ps->a, newcapacity*sizeof(SLDataType));if (str == NULL)//扩容失败{perror("realloc");exit(1);}ps->a = str;ps->capacity = newcapacity;}
}

4.顺序表的尾插

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

5.顺序表的头插

void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size - 1; i >= 0; i--){ps->a[i + 1] = ps->a[i];}ps->a[0] = x;ps->size++;
}

6.顺序表的尾删

void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);ps ->size--;
}

7.顺序表的头删

void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);for (int i = 0; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;//有效数据减1
}

8. 顺序表在指定位置插入数据

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

9.顺序表删除指定位置的数据

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

10.顺序表的查找

int SLFind(SL* ps, SLDataType x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->a[i] == x){//找到啦return i;}}//没有找到return -1;
}

11.顺序表的打印

void SLPrint(SL s)
{for (int i = 0; i < s.size; i++){printf("%d ", s.a[i]);}printf("\n");
}

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

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

相关文章

【Diffusion实战】训练一个diffusion模型生成蝴蝶图像(Pytorch代码详解)

上一篇Diffusion实战是确确实实一步一步走的公式&#xff0c;这回采用一个更方便的库&#xff1a;diffusers&#xff0c;来实现Diffusion模型训练。 Diffusion实战篇&#xff1a;   【Diffusion实战】训练一个diffusion模型生成S曲线&#xff08;Pytorch代码详解&#xff09;…

六西格玛管理培训:我的转变与成长之旅

4月初&#xff0c;我参与了天行健咨询的六西格玛管理培训&#xff0c;这次经历不仅极大地提升了我的工作效率&#xff0c;还帮助我在工作中实现了卓越。现在&#xff0c;我想分享一些我在这次培训中的学习心得和实践经验&#xff0c;希望能对正在寻求提升绩效和卓越之路的大家有…

用于车载T-BOX汽车级的RA8900CE

用于车载T-BOX等高精度计时的汽车级时钟模块RTC:RA8900CE.车载实时时钟芯片RA8900CE内置32.768Khz的晶体&#xff0c;实现年、月、日、星期、小时、分钟和秒精准计时。RA8900CE满足AEC-Q200认证&#xff0c;内置温补功能&#xff0c;保证实时时钟的稳定可靠&#xff0c;功耗低至…

【目标检测】YOLO系列-YOLOv1 理论基础 通俗易懂

为方便大家理解YOLO的原理&#xff0c;这里将YOLOv1的部分内容基础内容进行用比较直白的话和例子进行阐述&#xff0c;为后续大家学习YOLO作为铺垫。 1、模型所干的活 工作中&#xff0c;大家经常将 Word 文档 上传到某转换器&#xff0c;然后转换输出为PDF文档。目标检测中我…

嵌入式Linux八股(二)——Linux

二、Linux 01.Linux系统编程 01.Linux系统文件类型&#xff1a; 7/8 种 普通文件&#xff1a;- 目录文件&#xff1a;d 字符设备文件&#xff1a;c 块设备文件&#xff1a;b 软连接&#xff1a;l 管道文件&#xff1a;p 套接字&#xff1a;s 未知文件 文件权限说明 …

抖音运营全攻略 沈阳新媒体运营培训

抖音发展趋势 数据显示&#xff0c;2023年&#xff0c;抖音日活量突破10亿。是目前最火的短视频软件。 抖音的总用户数量已超过12亿&#xff0c;日活10亿&#xff0c;人均单日使用时长超过2小时&#xff0c;这只是平均数据&#xff0c;其实大部分人刷抖音时间会超过3个小时&am…

Hbuilder快捷键个人习惯修改

自定义修改 [// {"key":"ctrld","command":"editor.action.deleteLines"},// {"key":"ctrle","command":"editor.action.addSelectionToNextFindMatch"}//目录内查找字符串{"key"…

动物解剖流程3d仿真展示动画支持反复观看和使用

在兽医专业的广袤领域中&#xff0c;动物解剖学作为基石学科&#xff0c;为组织胚胎学、生理学、病理解剖学、外科手术学、临床诊断学等科研教学提供了坚实的基础。而如今&#xff0c;随着科技的飞速发展&#xff0c;我们迎来了一个全新的学习时代——3D数字动物解刨虚拟仿真实…

亚马逊自养号测评三大要点,你了解多少?

对于初涉亚马逊测评的新手而言&#xff0c;近期最常听闻的莫过于平台风控日益严苛&#xff0c;尤其是在留评管理方面。稍有不慎&#xff0c;便可能面临评论被删除的风险。那么&#xff0c;如何有效规避这一困境呢&#xff1f;对于亚马逊新手小白来说&#xff0c;进行测评时又需…

helpdesk桌面运维常见问题解决

helpdesk是一套帮助IT团队管理IT工单生命周期、自动化日常工作、优化工作流程的软件或软件集合&#xff0c;它可以帮助IT团队提高生产力、降低成本、改善服务水平和客户体验。 在现代企业中&#xff0c;helpdesk桌面运维是一项至关重要的工作&#xff0c;helpdesk团队负责处理员…

【机器学习】分类与预测算法的评价与优化

以实际案例解析F1值与P-R曲线的应用 一、分类算法与性能评价的重要性二、F1值与P-R曲线的概念与意义三、实例解析&#xff1a;以垃圾邮件检测为例四、代码实现与结果分析五、结论与展望 在数据驱动的时代&#xff0c;机器学习算法以其强大的数据处理和分析能力&#xff0c;成为…

鸿蒙开发使用云数据库的坑

在使用华为官网提供的CloudDBZoneWrapper.js有个坑&#xff0c; CloudDBZoneWrapper.js需要使用两个包 const clouddb require(hw-agconnect/database-server/dist/index.js); const agconnect require(agconnect/common-server); const path require(path);/*配置区域 */…