【数据结构】新篇章 -- 顺序表

🌈 个人主页:白子寰
🔥 分类专栏:python从入门到精通,魔法指针,进阶C++,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分80+),分享更多关于深度学习、C/C++,python领域的优质内  容!(希望得到您的关注~) 

 

目录

数据结构

概念

为什么需要数据结构 

使用数据结构的效果

线性表

概念

顺序表与数组的区别 

顺序表导图

动态顺序表 

typedef定义结构的两种方法

空间不够,扩容

尾部插入数据

头部插入数据

 尾部数据删除

头部数据删除

指定位置之前插入数据 

删除指定位置数据

查找顺序表中元素位置

销毁


数据结构

概念

数据结构是计算机存储组织数据的方式

为什么需要数据结构 

在这之前我们学过数组,数组是最基础的数据结构

那为什么学了数组还用学数据结构呢?

最基础的数据结构能够提供的操作已经不能完全满足复杂算法实现

使用数据结构的效果

1)能够将数据存储

     (顺序表、链表等结构)

2)方便查看存储的数据 

线性表

概念

线性表在逻辑上是线性结构,也就是说是连续的一条直线

                      但在物理结构上并不一定是连续的

线性表物理上存储时,通常以数组和链式结构的形式存储

常见的线性表:

顺序表、链表、栈、队列、字符串

顺序表与数组的区别 

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

顺序表导图

动态顺序表 

SX.h:定义顺序表的结构,顺序要实现的接口/方法

SX.c:具体实现顺序表里定义的接口/方法

test.c:测试顺序表

typedef定义结构的两种方法

//第一种方法//数据类型
typedef int datatype;//结构体
struct shunxu
{datatype* arr; //存储数据的底层结构:数组int size;      //顺序表空间大小int nowsize;   //顺序表有效数据个数
};typedef struct shunxu SX;
//第二种方法//数据类型
typedef int datatype;//结构体
typedef struct shunxu
{datatype* arr; //存储数据的底层结构:数组int size;      //顺序表空间大小int nowsize;   //顺序表有效数据个数
}SX;

以下是在SX.h中实现顺序表 

空间不够,扩容

//空间不够,扩容
void publicKUOR(SX* ps)
{//如果顺序表空间大小 = 顺序表空间有效个数if (ps->size == ps->nowsize){//三目操作符int newnowsize = ps->nowsize == 0 ? 4 : 2 * sizeof(datatype);//新建一个临时变量,因为如果realloc扩容失败,会造成技术事故datatype* tmp = (datatype*)realloc(ps->arr, newnowsize * sizeof(datatype));if (tmp == NULL){perror("realloc");exit(1);}//扩容后的数组ps->arr = tmp;//扩容后的有效空间大小ps->nowsize = newnowsize;}
}

 

尾部插入数据

 

//顺序表的尾插
void CHARUback(SX* ps, datatype x)
{//方式一:断言 -- 暴力方式 --会报错且知道具体错误位置assert(ps);//方式二:断言 -- 温柔方式--会报错,不知道具体错误位置/*if (ps == NULL){return;}*///空间不够,扩容publicKUOR(ps);//空间足够,直接插入/*第一种写法*///ps->arr[ps->size] = x;//ps->size++;/*第二种写法*/ps->arr[ps->size++] = x;}

头部插入数据

//头插
void CHARUfront(SX* ps, datatype x)
{//判断ps是否为空指针assert(ps);//空间不够,扩容publicKUOR(ps);//空间足够,数据往后挪一位int i = 0;for (i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;ps->size++;
}

 尾部数据删除

//尾部删除
void SXdestroyback(SX* ps)
{//判断ps是否为有效指针assert(ps);//判断顺序表中有无数据assert(ps->size);//顺序表不为空ps->size--;
}

头部数据删除

//头部删除
void SXdestroyfront(SX* ps)
{//判断ps是否为有效指针assert(ps);//判断顺序表是否有数据assert(ps->size);//顺序表不为空,往前挪for (int i = 0; i < ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

指定位置之前插入数据 

//指定位置之前插入数据
//顺序表下标位置pos
void SXpointfrontestroy(SX* ps,int pos,datatype x)
{//判断ps是否为有效指针assert(ps);//断言,保证下标pos>=0且pos小于等于顺序表空间大小sizeassert(pos >= 0 && pos <= ps->size);for (int i = ps->size; i < pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;
}

删除指定位置数据

//删除指定位置数据
void SXpointdestroy(SX* ps, int pos)
{//判断ps是否为有效指针assert(ps);//断言,保证下标pos>=0且pos小于顺序表空间大小sizeassert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

查找顺序表中元素位置

//查找顺序表元素位置
int SXfind(SX* ps, datatype x)
{for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x){return i;}}return -1;
}

销毁

void SXdestroy(SX* ps)
{//保证指针有效assert(ps);if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->size = ps->nowsize = 0;
}

 ***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“走过这场雾,就是柏林的冬”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。

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

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

相关文章

光伏智慧管理平台:全周期全流程光伏业务管理

随着光伏技术的快速发展和光伏电站规模的不断扩大&#xff0c;光伏业务的管理变得越来越复杂。为了提高管理效率、降低运营成本并提升光伏电站的运行效益&#xff0c;光伏智慧管理平台应运而生。本文将重点介绍光伏智慧管理平台的功能及其在全周期全流程光伏业务管理中的应用。…

哲学家带你深♂入了解文件操作

目录 一、文件指针 二、文件的打开与关闭 三、顺序读写函数的介绍 四、文件的随机读写 1、fseek 2、ftell 3、rewind 总结 前言 c语言中的文件操作虽然不怎么常用但也是非常重要的知识&#xff0c;今天由本哲学家带大家深♂入了解c语言文件操作。 一、文件指针 每个被使用的文…

【python】深入探讨flask是如何预防CSRF攻击的

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

快排(六大排序)

快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子序列中所…

Doris实践——叮咚买菜基于OLAP引擎的应用实践

目录 前言 一、业务需求 二、选型与对比 三、架构体系 四、应用实践 4.1 实时数据分析 4.2 B端业务查询取数 4.3 标签系统 4.4 BI看板 4.5 OLAP多维分析 五、优化经验 六、总结 原文大佬介绍的这篇Doris数仓建设实践有借鉴意义的&#xff0c;这些摘抄下来用作沉淀学…

driver-class-name: com.mysql.jdbc.Driver爆红解决方式

文章目录 问题解决方式一:手动添加mysql的jar包 问题 问题&#xff1a;在springboot项目工程中想要进行数据库配置&#xff0c;在application.yml中添加以下代码&#xff1a; # 数据库配置 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: root #…

[每周一更]-第91期:认识AMD的CPU

这一章来认识下AMD,说起AMD&#xff0c;从我上大学那时候&#xff0c;就选购的AMD 速龙系列&#xff0c;生活拮据的情况下&#xff0c;拉着室友去郑州电子城&#xff0c;在跟奸商老板的拉扯下&#xff0c;斥资2000购入一个无显卡 的台式机&#xff08;实在是资金有限&#xff0…

蓝队面经(一)

蓝队面经(一) 文章目录 蓝队面经(一)入侵排查思路windows入侵排查思路Linux入侵排查思路 Linux 如何查看登录日志Windows 和 Linux 的日志文件放在哪里&#xff1f;WindowsLinux Linux 常用排查命令有哪些&#xff1f;Linux 的 Selinux 是什么&#xff1f;如何设置 Selinux&…

关系数据库理论

函数依赖: 关系数据库的规范化理论是数据库逻辑设计的工具。 关系模式由五部分组成&#xff0c;是一个五元组&#xff1a; R(U, D, DOM, F)  关系名 R 是符号化的元组语义  U 为一组属性  D 为属性组 U 中的属性所来自的域  DOM 为属性到域的映射  F 为属…

宝石 STL hash

发现可以O(N^2) 然后可以边做边处理两个宝石的乘积&#xff0c;然后另一个可以直接查hash #include<bits/stdc.h> using namespace std; using ll long long; using pii pair<int,int>; #define int long long const int N 1e510; const int inf 0x3f3f3f3f; …

43 带 fixed 列的 el-table 不兼容于 sortablejs

前言 这是一个基于 sortablejs 来实现的 el-table 的拖拽功能的基础实现 然后 这个过程中遇到的一个比较特殊的问题是, 关于 el-table-column 的 fixed 的属性, 对于 sortablejs 这边来定位目标选择列 影响的一个问题 在基础的用例中, 使用 “.el-table__body-wrapper tbo…

大数据学习-2024/3/29-oracle使用介绍

在plsql中登录ORACLE数据。 默认用户&#xff1a; 1、sys&#xff1a; 角色&#xff1a;数据库超级管理员账户。 权限&#xff1a;具有最高的权限&#xff0c;可以执行任何操作&#xff0c;包括操作数据字典和控制文件。可以创建和删除数据库对象&#xff0c;授予和回收其他用户…