【零基础学数据结构】顺序表

目录

1.了解数据结构

什么是数据结构? 

为什么要进行数据管理? 

2.顺序表 

顺序表概要解析: 

​编辑顺序表的分类: 

差别和使用优先度: 

1.创建顺序表

1.1顺序表分为静态顺序表和动态顺序表

 1.2顺序表的初始化

 1.3顺序表的销毁

 1.4顺序表的打印

 1.5顺序表的扩容

1.6顺序表的头插,尾插

 1.6.1头插

1.6.2尾插

 1.7顺序表的头删,尾删

 1.7.1头删

1.7.2尾删

 1.8顺序表在指定位置之前插入,删除数据

 1.8.1 插入数据

1.8.2 删除数据

 1.9顺序表数据的查找

 测试代码:


 

1.了解数据结构

什么是数据结构? 

为什么要进行数据管理? 

 

2.顺序表 

顺序表概要解析: 

顺序表的分类: 

  • 静态顺序表
  • 动态顺序表 

差别和使用优先度: 

1.创建顺序表

1.1顺序表分为静态顺序表和动态顺序表


// 设定类型为一个全新名字,方便后续更改
typedef int SLDataType;// 静态顺序表#define N 100
typedef struct SeqList
{SLDataType arr[N];//创建数组储存数据int size;			//有效数据的数量
}SL;// 动态顺序表
typedef struct SeqList
{SLDataType* arr;//动态的空间,创建指针变量int size;		//有效数据的数量int capacity;   //空间的大小容量
}SL;

 1.2顺序表的初始化

void SLInit(SL* ps);
// 顺序表的初始化
void SLInit(SL* ps)
{ps->arr = NULL;				//将顺序表指针置为NULLps->size = ps->capacity = 0;//将其他数据置为0
}// 顺序表的销毁
void SLDestroy(SL* ps)
{if (ps->arr)   //判断ps->arr是否为NULL,如果不为NULL,说明空间需要释放{free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}

 1.3顺序表的销毁

void SLDestroy(SL* ps);
// 顺序表的销毁
void SLDestroy(SL* ps)
{if (ps->arr)   //判断ps->arr是否为NULL,如果不为NULL,说明空间需要释放{free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}

 1.4顺序表的打印

void SLPrint(SL* ps);
// 顺序表的打印
void SLPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}

 1.5顺序表的扩容

void SLCheckCapacity(SL* ps);
// 顺序表的扩容
void SLCheckCapacity(SL* ps)
{// 判断容量是否够用if (ps->capacity == ps->size){//执行扩容//检验原先的容量,如果有在原先容量*2,没有的话就先分配4。int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;// 为了防止空间申请失败返回NULL,先用临时变量tmp接收SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));//申请失败提前返回if (tmp == NULL){printf("perror realloc!");return;}//申请成功ps->arr = tmp;ps->capacity = newCapacity;}
}

1.6顺序表的头插,尾插

 1.6.1头插

void SLPushFront(SL* ps, SLDataType x);
//头插
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);//断言防止传入空指针// 插入之前判断空间容量是否够SLCheckCapacity(ps);//进行头插for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];//ps->arr[1]=ps->arr[2]}ps->arr[0] = x;ps->size++;
}

 

1.6.2尾插

void SLPushBack(SL* ps, SLDataType x);
void SLPushBack(SL* ps, SLDataType x)
{assert(ps);//断言防止传入空指针// 插入之前判断空间容量是否够SLCheckCapacity(ps);//进行尾插ps->arr[ps->size++] = x;
}

 

 1.7顺序表的头删,尾删

 1.7.1头删

void SLPopFront(SL* ps);
//头删
void SLPopFront(SL* ps)
{assert(ps);//断言防止传入空指针//防止顺序表没有数据可以删除assert(ps->size);//进行头删操作for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];//ps->arr[size-2]=ps->arr[size-1]}ps->size--;
}

 

1.7.2尾删

void SLPopBack(SL* ps);
//尾删
void SLPopBack(SL* ps)
{assert(ps);//断言防止传入空指针//防止顺序表没有数据可以删除assert(ps->size);//进行尾删操作ps->size--;
}

 

 1.8顺序表在指定位置之前插入,删除数据

 1.8.1 插入数据

void SLInsert(SL* ps, int pos, SLDataType x);
//在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);//断言防止传入空指针//判断插入的数据是否合法if (pos >= 0 && pos <= ps->size){// 插入之前判断空间容量是否够SLCheckCapacity(ps);//插入数据for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];//ps->arr[pos+1]=ps->arr[pos];}ps->arr[pos] = x;ps->size++;}}

 

1.8.2 删除数据

void SLErase(SL* ps, int pos);
//在指定位置之前删除数据
void SLErase(SL* ps, int pos)
{assert(ps);//断言防止传入空指针//判断删除的数据是否合法if (pos >= 0 && pos < ps->size){// 删除数据for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];//ps->[size-2]=ps->arr[size-1]}ps->size--;}
}

 

 1.9顺序表数据的查找

int SLFind(SL* ps, SLDataType x); 
// 1.9顺序表数据的查找
int SLFind(SL* ps, SLDataType x)
{assert(ps);//断言防止传入空指针//遍历顺序表for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x){return i;//返回下标}}// 没有找到return -1;//返回一个不存在的下标
}

 测试代码:

#include "SeqList.h"void SLText01()
{SL sl;//初始化SLInit(&sl);//打印//SLPrint(&sl);//增删查改//头插//SLPushFront(&sl, 1);//SLPushFront(&sl, 2);//SLPushFront(&sl, 3);//SLPushFront(&sl, 4);//SLPrint(&sl);// 4 3 2 1//头删/*SLPopFront(&sl);SLPopFront(&sl);SLPopFront(&sl);SLPrint(&sl);*///尾插//SLPushBack(&sl, 1);//SLPushBack(&sl, 2);//SLPushBack(&sl, 3);//SLPushBack(&sl, 4);//SLPrint(&sl);// 1 2 3 4//尾删//SLPopBack(&sl);//SLPopBack(&sl);//SLPopBack(&sl);//SLPopBack(&sl);//SLPrint(&sl);在指定位置之前插入数据//SLPushFront(&sl, 1);//SLPushFront(&sl, 2);//SLPushFront(&sl, 3);//SLPushFront(&sl, 4);//SLPrint(&sl);// 4 3 2 1//SLInsert(&sl, 4, 6);//SLPrint(&sl);// 4 3 2 6 1//在指定位置之前删除数据//SLPushFront(&sl, 1);//SLPushFront(&sl, 2);//SLPushFront(&sl, 3);//SLPushFront(&sl, 4);//SLPrint(&sl);// 4 3 2 1//SLErase(&sl, 2);//SLPrint(&sl);// 4 3  1// 1.9顺序表数据的查找//SLPushFront(&sl, 1);//SLPushFront(&sl, 2);//SLPushFront(&sl, 3);//SLPushFront(&sl, 4);//printf("顺序表中有:");//SLPrint(&sl);// 4 3 2 1//int find = SLFind(&sl, 6);//if (find > 0)//{//	printf("找到了!下标是:%d\n", find);//}//else//{//	printf("没有找到!\n");//}//销毁SLDestroy(&sl);}int main()
{SLText01();return 0;
}

 源代码文件:SeqList_2024_4_3 · 14c5b99 · 阳区欠/C语言学习路程 - Gitee.com

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

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

相关文章

【C++STL详解(二)】——string类模拟实现

目录 前言 一、接口总览 二、默认成员函数 1.构造函数 2.拷贝构造 写法一&#xff1a;传统写法 写法二&#xff1a;现代写法&#xff08;复用构造函数&#xff09; 3.赋值构造 写法一&#xff1a;传统写法 写法二&#xff1a;现代写法(复用拷贝构造) 4.析构函数 三、…

JVM原理

java 代码执行过程 ● 1.用javac代码编译为class ● 2.装载class ClassLoader ● 3.执行class&#xff0c;包括解释执行和编译执行 内存管理 jvm 内存区域 程序计数器&#xff08;线程私有&#xff09; 空间相对比较小&#xff0c;为数不多不会发送OutofMemoryError&#x…

数据文件大小扩容或缩容必备技能

欢迎关注“数据库运维之道”公众号&#xff0c;一起学习数据库技术! 本期将为大家分享“数据文件大小扩容或缩容必备技能” 。 关键词&#xff1a;Resize Datafile、ORA-03297、高水位线 表空间跟数据文件是一对多的关系&#xff0c;数据文件存放到磁盘或ASM磁盘组。当磁盘空间…

OSX-02-Mac OS应用开发系列课程大纲和章节内容设计

本节笔者会详细介绍下本系统专题的大纲&#xff0c;以及每个专题章节的组织结构。这样读者会有一个全局的概念。 在开始前还是在再介绍一下下面这个框架图&#xff0c;因为比较重要&#xff0c;在这里再冗余介绍一下。开发Apple公司相关产品的软件时&#xff0c;主要有两个框架…

JavaScript基础(5)之对象的方法和调用

JavaScript基础5之对象的方法和调用 对象对象使用语法属性和访问方法和调用null遍历对象 内置对象Math属性方法 基本数据类型和引用数据类型堆栈空间分配区别&#xff1a;简单类型的内存分配复杂类型的内存分配 对象 对象是 JavaScript 数据类型的一种&#xff0c;之前已经学习…

AI音乐GPT时刻来临:Suno 快速入门手册!

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

回溯算法|78.子集

力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {result.push_back(path); // 收集子集&#xff0c;要放在终止添加的上面&#xff0c;否则会漏掉自…

Leaflet使用多面(MultiPolygon)进行遥感影像掩膜报错解决之道

目录 前言 一、问题初诊断 1、山重水复 2、柳暗花明 3、庖丁解牛 4、问题定位 二、解决多面掩膜问题 1、尝试数据修复 2、实际修复 3、最终效果 三、总结 前言 之前一篇讲解遥感影像掩膜实现&#xff1a;基于SpringBoot和Leaflet的行政区划地图掩膜效果实战&#xff0…

Docker实例

华子目录 docker实例1.为Ubuntu镜像添加ssh服务2.Docker安装mysql docker实例 1.为Ubuntu镜像添加ssh服务 (1)访问https://hub.docker.com&#xff0c;寻找合适的Ubuntu镜像 (2)拉取Ubuntu镜像 [rootserver ~]# docker pull ubuntu:latest latest: Pulling from library/ub…

开源大模型AI代理操作系统:像Windows一样,操控AI代理

去年&#xff0c;AutoGPT的出现让我们见识到了AI代理强大的自动化能力&#xff0c;并开创了一个全新的AI代理赛道。但在子任务调度、资源分配以及AI之间协作还有不少的难题。 因此&#xff0c;罗格斯大学的研究人员开源了AIOS&#xff0c;这是一种以大模型为核心的AI代理操作系…

【智能算法】蜜獾算法(HBA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;FA Hashim等人受到自然界中蜜獾狩猎行为启发&#xff0c;提出了蜜獾算法&#xff08;(Honey Badger Algorithm&#xff0c;HBA&#xff09;。 2.算法原理 2.1算法思想 蜜獾以其…

C++重载和模板

重载与模板 函数模板可以被另一个模板或一个普通非模板函数重载。 与往常一样&#xff0c;名字相同的函数必须具有不同数量或类型的参数。 如果涉及函数模板&#xff0c;则函数匹配规则会在以下几方面受到影响&#xff1a; 对于一个调用&#xff0c;其候选函数包括所有模板…

成都欣丰洪泰文化传媒有限公司引领电商新风向

在当今数字化时代&#xff0c;电子商务行业日新月异&#xff0c;竞争激烈。然而&#xff0c;在这股浪潮中&#xff0c;成都欣丰洪泰文化传媒有限公司凭借其独特的战略眼光和创新精神&#xff0c;正引领着电商领域的新浪潮。本文将探讨成都欣丰洪泰文化传媒有限公司如何在激烈的…

C++ //练习 11.12 编写程序,读入string和int的序列,将每个string和int存入一个pair中,pair保存在一个vector中。

C Primer&#xff08;第5版&#xff09; 练习 11.12 练习 11.12 编写程序&#xff0c;读入string和int的序列&#xff0c;将每个string和int存入一个pair中&#xff0c;pair保存在一个vector中。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#x…

Linux简单介绍

Linux简单介绍 编译器VMware虚拟机Ubuntu——LinuxOS为什么使用LinuxOS&#xff1f; 目录结构Windows目录结构Linux操作系统home是不是家目录&#xff1f; Linux常用命令终端命令行提示符与权限切换命令tab 作用&#xff1a;自动补全上下箭头pwd命令ls命令mkdir命令touch命令rm…

笔记: JavaSE day15 笔记

第十五天课堂笔记 数组 可变长参数★★★ 方法 : 返回值类型 方法名(参数类型 参数名 , 参数类型 … 可变长参数名){}方法体 : 变长参数 相当于一个数组一个数组最多只能有一个可变长参数, 并放到列表的最后parameter : 方法参数 数组相关算法★★ 冒泡排序 由小到大: 从前…

Docker之ruoyi-vue项目部署

文章目录 创建自定义网络安装redis安装mysql发布若依项目--后端使用Dockerfile自定义镜像运行容器 nginx 创建自定义网络 #搭建net-ry局域网&#xff0c;用于部署若依项目 docker network create net-ry --subnet172.68.0.0/16 --gateway172.68.0.1 注意1&#xff1a;关闭宿主…

Kubernetes(k8s):如何进行 Kubernetes 集群健康检查?

Kubernetes&#xff08;k8s&#xff09;&#xff1a;如何进行 Kubernetes 集群健康检查&#xff1f; 一、节点健康检查1、使用 kubectl 查看节点状态2、查看节点详细信息3、检查节点资源使用情况 2、Pod 健康检查2.1、 使用 kubectl 查看 Pod 状态2.2、 查看特定 Pod 的详细信息…

解决MySQL幻读?可重复读隔离级别背后的工作原理

什么是当前读和快照读 当前读&#xff1a;又称为 "锁定读"&#xff0c;它会读取记录的最新版本&#xff08;也就是最新的提交结果&#xff09;&#xff0c;并对读取到的数据加锁&#xff0c;其它事务不能修改这些数据&#xff0c;直到当前事务提交或回滚。"sele…

基于深度学习的机场航拍小目标检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;在本博客中介绍了基于YOLOv8/v7/v6/v5的机场航拍小目标检测系统。该系统的核心技术是采用YOLOv8&#xff0c;并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;从而进行性能指标的综合对比。我们详细介绍了国内外在机场航拍小目标检测领域的研究现状、数据集处理…