【数据结构】顺序表实现超详解(保姆级教程)
【数据结构】
目录
前言
顺序表
接口实现
各项功能
接口详解
顺序表初始化
顺序表释放
顺序表展示
顺序表容量检查
顺序表数据尾插
顺序表数据头插
顺序表数据前删
顺序表数据尾删
顺序表数据查找
顺序表指定位置插入数据
顺序表指定位置删除数据
前言
本章主要讲解:
顺序表以及顺序表的接口实现
注:保姆级教程,相信你一定会的~
顺序表
顺序表是线性标的一种
- 概念:
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储(完成数据的增删查改)
- 分类:
静态顺序表
使用定长数组存储元素
- 参考代码:
//静态循序表
#define CAPACITY 100
typedef struct SeqList
{SLDateType data[CAPACITY];//动态开辟指向其地址size_t size;//已经使用的数量
}SeqList;
- 图示:
使用动态开辟的数组存储
- 参考代码:
//动态顺序表
typedef struct SeqList
{SLDateType* data;//动态开辟指向其地址size_t size;//已经使用的数量size_t capacity; //开辟空间的总大小(容量)
}SeqList;
接口实现
- 静态顺序表:
只适用于确定知道需要存多少数据的场景局限:静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用
- 动态顺序表:
现实使用时多采用动态顺序表
优势:需要多少用多少
注:下面我们着重实现动态顺序表(静态顺序表可以依法炮制~)
各项功能
顺序表的增删查改接口
//默认开辟大小
#define DEFAULT_SZ 4
//设定默认数据类型
typedef int SLDateType;
//动态顺序表
typedef struct SeqList
{SLDateType* data;//动态开辟指向其地址size_t size;//已经使用的数量size_t capacity; //开辟空间的总大小(容量)
}SeqList;// 对数据的管理:增删查改
//初始化
void SeqListInit(SeqList* ps);
//释放
void SeqListDestory(SeqList* ps);
//打印(展示)
void SeqListPrint(SeqList* ps);
//尾插
void SeqListPushBack(SeqList* ps, SLDateType x);
//头插
void SeqListPushFront(SeqList* ps, SLDateType x);
//前删
void SeqListPopFront(SeqList* ps);
//尾删
void SeqListPopBack(SeqList* ps);// 顺序表查找x的位置
int SeqListFind(SeqList* ps, SLDateType x);
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, size_t pos);
接口详解
顺序表初始化
比较简单
- 参考代码:
//初始化顺序表
void SeqListInit(SeqList* ps)//传入链表地址便于修改
{ps->data = NULL;ps->capacity = 0;ps->size = 0;return;
}
顺序表释放
动态顺序表是动态开辟的空间,结束时需要进行释放,避免造成内存泄漏
- 参考代码:
//摧毁释放顺序表
void SeqListDestory(SeqList* ps)
{free(ps->data);
//记得置空地址ps = NULL;return;
}
顺序表展示
- 注意:
- 当顺序表为空时不打印
//展示顺序表
void SeqListPrint(SeqList* ps)
{
//暴力断言(ps不为空)assert(ps->data);
//使用指针打印结构体内保存的数据for (int i = 0; i < ps->size; i++){printf("%d\t", ps->data[i]);}return;
}
顺序表容量检查
- 注意:
- 每当要增加数据时,都需要考虑空间是否使用完毕
- 如果使用完毕则需要考虑增容,增容为原来的两倍(避免频繁扩容)
- 增容后更新记录容量大小
注:这里我们考虑到有许多地方要检查是否增容,为了方便将它封装成一个函数
- 参考代码:
//顺序表容量判断
void SeqListCheak(SeqList* ps)
{int newcapacity;
//使用完毕时进行判断if (ps->size == ps->capacity){
//如果为容量为0,则开辟默认大小的空间;否则扩容为原来的两倍空间newcapacity = ps->capacity == 0 ? DEFAULT_SZ : ps->capacity* 2;
//当data为NULL时,realloc的功能和malloc一致(申请开辟空间)ps->data = realloc(ps->data, newcapacity);
//判断是否扩容(开辟)空间成功if (ps == NULL){
//为开辟(扩容)成功,则打印对应的错误原因,并结束进程perror("realloc:");exit(1);}}
//成功则更新记录容量的大小ps->capacity = newcapacity;return;
}
顺序表数据尾插
- 注意:
- 插入数据考虑扩容
- 尾插后更新记录使用数量
- 参考代码:
//顺序表数据尾插
void SeqListPushBack(SeqList* ps, SLDateType x)
{
//容量检查SeqListCheak(ps);ps->data[ps->size]=x;
//更新使用数量ps->size++;printf("顺序表尾插数据成功!\n");return;
}
顺序表数据头插
- 注意:
- 插入数据考虑扩容
- 头插从后开始移动数据(避免数据覆盖)
- 尾插后更新记录使用数量
- 参考代码:
//顺序表头插数据
void SeqListPushFront(SeqList* ps, SLDateType x)
{//插入数据考虑扩容SeqListCheak(ps);for (int i = ps->size - 1; i >= 0; i--){//头插从后开始移动数据(避免数据覆盖)ps->data[i + 1] = ps->data[i];}ps->data[0]=x;//尾插后更新记录使用数量ps->size++;printf("顺序表头插数据成功!\n");return;
}
顺序表数据前删
- 注意:
- 没有数据或者顺序表为空无法删除
- 前删后从前往后移动数据(避免覆盖)
- 更新记录使用的数量
- 参考代码:
//顺序表数据前删
void SeqListPopFront(SeqList* ps)
{//暴力断言(也可以选择if判断语句)assert(ps->data||ps->size);//从前往后移动数据(避免覆盖)for (int i = 0; i+1<ps->size; i++){ps->data[i] = ps->data[i+1];}//更新记录使用的数量ps->size--;printf("顺序表前删数据成功!\n");return;
}
顺序表数据尾删
- 注意:
- 没有数据或者顺序表为空无法删除
- 尾删数据只要记录使用数量的变量自减就行了
- 参考代码:
//顺序表尾删数据
void SeqListPopBack(SeqList* ps)
{assert(ps->data||ps->size);ps->size--;printf("顺序表尾删数据成功!\n");return;
}
顺序表数据查找
- 注意:
- 没有数据或者顺序表为空无法查找
- 遍历查找,找到则返回下标,否则返回-1
- 参考代码:
// 顺序表查找
int SeqListFind(SeqList* ps, SLDateType x)
{
//没有数据或者顺序表为空无法查找assert(ps->data||ps->size);
//遍历查找,找到则返回下标,否则返回-1int pos=-1;for (int i = 0; i < ps->size; i++){if (ps->data[i] == x){pos=i;printf("数据查到了,下标是:%d\n", pos);return pos;}}printf("链表数据未查到!\n");return pos;
}
顺序表指定位置插入数据
- 注意:
- 检查是否扩容
- 插入前先移动数据
- 插入后更新记录使用数量的大小
- 参考代码:
//顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x)
{SeqListCheak(ps);for (int i = ps->size; i >= pos; i++){ps->data[i] = ps->data[i - 1];}printf("请输入要插入的数:");scanf("%d", &ps->data[pos]);ps->size++;printf("链表插入数据成功!\n");return;
}
顺序表指定位置删除数据
- 注意:
- 没有数据或者顺序表为空无法删除
- 覆盖数据达到删除的效果
- 删除后更新记录使用的数量大小
- 参考代码:
//顺序表删除pos位置的值
void SeqListErase(SeqList* ps, size_t pos)
{assert(ps->data||ps->size);for (int i = pos; i+1 <ps->size; i++){ps->data[i] = ps->data[i+1];}ps->size--;printf("顺序表删除数据成功!\n");return;
}
以上基本上就已经讲解顺序表完毕了,别忘了留个三连再走~~
【数据结构】顺序表实现超详解(保姆级教程)相关推荐
- 参考文献顺序不对_Endnote插入参考文献的保姆级教程
作者:白鹤(baihe@iphy.ac.cn) 审核:蔡建旺 各位同学看过来,最近由于疫情严重,小伙伴们都憋在家里写论文.这倒不是什么难事,最烦人的是参考文献的插入.一篇博士论文下来,参考论文不说30 ...
- 【数据结构】八大排序(超详解+附动图+源码)
目录 前言 常见排序算法的实现 1.插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 6.1 hoare版本 6.2挖坑法 6.3前后指针法 6.4快速排序优化 6.5快速 ...
- 数据结构 顺序表实现手机通讯录
代码 #include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib. ...
- C语言石头剪子布游戏(详解保姆级)
石头剪子布游戏: (1)定义游戏规则剪刀 干掉 布石头 干掉 剪刀布 干掉石头 (2)显示玩家开始猜拳 (3)接收玩家输入的内容 (4)让电脑随机产生一种拳 (5)判断比较 (1)玩家赢的情况(显示玩 ...
- 【2023最新】超详细图文保姆级教程:App开发新手入门(1)
1. 关于 『YonBuilder移动开发』 PS: 本段内容主要目的是去除官方语音描述,用通俗的语言来简单介绍一下『YonBuilder移动开发』,方便新手开发者判断是否适合自己上手学习. 简介: ...
- STM32移植LVGL8.0.2超详细的保姆级教程附移植好的工程文件
文章目录 前言 一.什么是LVGL? 二.先看效果 三.移植前准备工作 1.准备原有工程 2.下载LVGL源码 四.开始移植 1.把源码搬运到工程文件夹里 2.把搬运好的代码添加到keil工程 3.动 ...
- 猿如意中的【ApiFox】工具的安装与使用教程,超详细,保姆级教程看这一篇文章就够了。
目录 一.什么是猿如意 二.猿如意中下载安装 ApiFox 2.1.如何下载和安装 2.2.什么是 ApiFox? 三.关于 ApiFox 的介绍以及使用 1.基本介绍 2.支持API文档导入 3.接 ...
- k8s搭建(超详细,保姆级教程)
1.简介 这里就不赘述,想要了解的朋友直接去这里深入了解什么是K8S. 2.环境要求 2台以上机器,操作系统 CentOS7.7-64位系统 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘 ...
- 超详细图文保姆级教程:App开发新手入门(六)
设置应用的Logo图标和启动页 上文回顾,我们已经完成了一个简单应用的开发,本章我们简单介绍一下如何设置应用的桌面图标及应用的启动页(本章内容超级简单 -). 1. 修改设置应用的桌面图标 1.1 登 ...
最新文章
- 13、ActiveX控件
- freemarker生成word模板
- ubuntu网络配置
- python中异常和错误是一个概念_Python的异常概念介绍以及处理
- 东南大学计算机学院张敏灵,东南大学张敏灵教授来我校作学术报告
- python 如何判断excel单元格为空_如何用python处理excel(二)
- 委托和事件[delegate and event]_C#
- 拉格朗日中值定理ξ怎么求_【实力干货】!!!高中数学教材之外的常用定理和公式!!!...
- gps l1带宽_民用GPS接收机可达到的最高更新速率是多少?
- .net项目开发工具接口说明
- 第61篇 笔记-Go 基础
- excel几个数相加等于某个数_EXCEL如何求出哪几个单元格里的数字之和等于某个特定值...
- 有量纲和无量纲是什么意思_物理量和量纲
- 查看电脑开机关机记录
- 硬盘的Smart信息说明
- 通过adb操作安卓亮屏、设置背光亮度、解锁、打开app
- 商场会员营销系统 购物中心会员精细化运营体系
- 数据库设计之实体E-R图
- 关于EasyX和graphics.h的那些事(上)
- java通过手机号查询地区信息
热门文章
- Mysql事务隔离与Spring
- 团体程序设计天梯赛-练习集 L1-058 6翻了 (15 分)
- 英文文本大小写的转换
- OSChina 周六乱弹 —— 生命诚可贵,啤酒价更高
- mysql出现表warning_查看mysql的warnings
- 多项式辗转相除法求最大公约数_辗转相除法求最大公约数
- STM32外部引脚电路个人总结
- 如何定位公众号形象,有什么方法
- 中石化卖咖啡报:产品体验报告 | 网易云音乐,体验一个“社交+音乐+直播”的动听世界
- Java数据库篇之mysql VS postgresql