顺序表(数据结构与算法)

请添加图片描述
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 无人扶我青云志 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 我自踏雪之山巅🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

🍋顺序表

  • 🍌顺序表的定义
  • 🍌顺序表的结构
    • 🍍静态顺序表
    • 🍍动态顺序表
  • 🍌顺序表接口的实现(增删查改)
    • 🍍其它接口
    • 🍍顺序表初始化
    • 🍍检查空间是否增容(空间满了就增容)
    • 🍍顺序表尾插
    • 🍍顺序表尾删
    • 🍍顺序表头插
    • 🍍顺序表头删
    • 🍍顺序表查找
    • 🍍顺序表在pos位置插入x
    • 🍍顺序表删除pos位置的值
    • 🍍顺序表修改pos位置的值
    • 🍍顺序表销毁
    • 🍍顺序表打印
  • 🍌顺序表整体代码的实现

🍌顺序表的定义

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

在这里插入图片描述

线性表:线性表是最基本、最简单、也是最常用的一种数据结构。大部分线性表除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。而又一些小部分,比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点

🍌顺序表的结构

🍍静态顺序表

静态顺序表就是以一定长度的数组来存储元素

//静态存储
#define  N  5
typedef int SLDetatype ;
typedef struct SeqList
{SLDetatype a[N] ;//有限空间的数组int size ;//有效的数据个数
}SeqList;

在这里插入图片描述

🍍动态顺序表

动态顺序表使用动态开辟的数组来存储元素

//动态存储
typedef  int SLDetatype ;
typedef struct SeqList
{SLDetatype *a ;   //指向动态开辟的数组int size ;       //有效的数据个数int capicity ;   //空间的容量
}SeqList;

在这里插入图片描述

🍌顺序表接口的实现(增删查改)

🍍其它接口

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int SLDatatype;
typedef struct SeqList
{SLDatatype* a;int capacity;int size;
}SeqList;

🍍顺序表初始化

void SeqListInit(SeqList* ps)
{ps->a = NULL;            //在初始情况我们可以直接置空//当然也可以创建空间,看自己习惯ps->capacity = ps->size = 0;
}

🍍检查空间是否增容(空间满了就增容)

void CheckCapacity(SeqList* ps)
{assert(ps);//在两个相等时,空间可能会满,还可能空间为0,这是因为我们在初始化没有创建空间导致if (ps->capacity == ps->size){if (ps->capacity == 0)ps->capacity = 2;elseps->capacity *= 2;int newcapacity = ps->capacity;//在扩容时,我们都是利用realloc,创建空间利用mallocSLDatatype* cur = (SLDatatype*)realloc(ps->a, sizeof(SLDatatype) * newcapacity);if (cur == NULL){perror("realloc   faild");exit(-1);}ps->a = cur;ps->capacity = newcapacity;}
}

大家如果对于malloc和realloc以及空间的创建的用法有些遗忘,可以看我这篇博客:动态内存管理(这是一个链接,有需要的朋友可以直接点进去)

🍍顺序表尾插

void SeqListPushBack(SeqList* ps, SLDatatype x)
{assert(ps);CheckCapacity(ps);  //需要检查空间是否满或者空ps->a[ps->size] = x;(ps->size)++;
}

在这里插入图片描述

🍍顺序表尾删

//顺序表尾删
void SeqListPopBack(SeqList* ps)
{assert(ps);assert(ps->size > 0);  //检查数据个数是否为0,如果为0就不执行,反之亦然(ps->size)--;
}

在这里插入图片描述

🍍顺序表头插

// 顺序表头插
void SeqListPushFront(SeqList* ps, SLDatatype x)
{assert(ps);CheckCapacity(ps);//判断空间是否满还是空//注意头插要分两种情况//第一种是数组里没有元素,此时头插就是相当于尾插//第二种是数组里有元素,这时就先把整体元素往后移动一位if (ps->size - 1 == 0){ps->a[ps->size -1] = x;(ps->size)++;}else{int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;(ps->size)++;}
}

注意
注意头插要分两种情况
(1)第一种是数组里没有元素,此时头插就是相当于尾插
(2)第二种是数组里有元素,这时就先把整体元素往后移动一位

在这里插入图片描述

🍍顺序表头删

// 顺序表头删
void SeqListPopFront(SeqList* ps)
{assert(ps);assert(ps->size > 0);//注意头删要分两种情况//第一种是数组里没有元素,此时头删就是相当于尾删//第二种是数组里有元素,这时就需要把除了第一个元素外的所有元素往前移动一位,把原来的第一位元素覆盖if (ps->size - 1 == 0){(ps->size)--;}else{int end = 0;while (end < ps->size - 1){ps->a[end] = ps->a[end + 1];end++;}(ps->size)--;}
}

注意:
注意头删要分两种情况
(1)第一种是数组里没有元素,此时头删就是相当于尾删
(2)第二种是数组里有元素,这时就需要把除了第一个元素外的所有元素往前移动一位,把原来的第一位元素覆盖

在这里插入图片描述

🍍顺序表查找

// 顺序表查找
int SeqListFind(SeqList* ps, SLDatatype x)
{assert(ps);int i = 0;for (int i = 0; i < ps->size; i++){if (ps->a[i] == x)return 1;}return -1;
}

🍍顺序表在pos位置插入x

// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLDatatype x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);CheckCapacity(ps);int i = 0;for (i = pos - 1; i < ps->size - 1; i++){ps->a[i + 1] = ps->a[i];}ps->a[pos-1] = x;(ps->size)++;
}

注意:pos必须在0到ps->size之间

在这里插入图片描述

🍍顺序表删除pos位置的值

// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{assert(ps);assert(pos >= 0 && pos <= ps->size);int i = 0;for (i = pos - 1; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}(ps->size)--;
}

注意:pos必须在0到ps->size之间

🍍顺序表修改pos位置的值

//顺序表修改pos位置的值
void SeqModify(SeqList* ps, int pos, SLDatatype x)
{assert(ps);assert(pos >= 0 && pos < ps->size);ps->a[pos - 1] = x;
}

🍍顺序表销毁

// 顺序表销毁
void SeqListDestory(SeqList* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}

🍍顺序表打印

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

🍌顺序表整体代码的实现

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int SLDatatype;
typedef struct SeqList
{SLDatatype* a;int capacity;int size;
}SeqList;//顺序表初始化
void SeqListInit(SeqList* ps)
{ps->a = NULL;ps->capacity = ps->size = 0;
}//检查空间,如果满了就增容
void CheckCapacity(SeqList* ps)
{assert(ps);if (ps->capacity == ps->size){if (ps->capacity == 0)ps->capacity = 2;elseps->capacity *= 2;int newcapacity = ps->capacity;SLDatatype* cur = (SLDatatype*)realloc(ps->a, sizeof(SLDatatype) * newcapacity);if (cur == NULL){perror("realloc   faild");exit(-1);}ps->a = cur;ps->capacity = newcapacity;}
}//顺序表尾插
void SeqListPushBack(SeqList* ps, SLDatatype x)
{assert(ps);CheckCapacity(ps);ps->a[ps->size] = x;(ps->size)++;
}//顺序表尾删
void SeqListPopBack(SeqList* ps)
{assert(ps);assert(ps->size > 0);(ps->size)--;
}// 顺序表头插
void SeqListPushFront(SeqList* ps, SLDatatype x)
{assert(ps);CheckCapacity(ps);if (ps->size == 0){ps->a[ps->size] = x;(ps->size)++;}else{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)
{assert(ps);assert(ps->size > 0);if (ps->size - 1 == 0){(ps->size)--;}else{int end = 0;while (end < ps->size - 1){ps->a[end] = ps->a[end + 1];end++;}(ps->size)--;}
}// 顺序表查找
int SeqListFind(SeqList* ps, SLDatatype x)
{assert(ps);int i = 0;for (int i = 0; i < ps->size; i++){if (ps->a[i] == x)return 1;}return -1;
}// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLDatatype x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);CheckCapacity(ps);int i = 0;for (i = pos - 1; i < ps->size - 1; i++){ps->a[i + 1] = ps->a[i];}ps->a[pos-1] = x;(ps->size)++;
}// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{assert(ps);assert(pos >= 0 && pos <= ps->size);int i = 0;for (i = pos - 1; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}(ps->size)--;
}// 顺序表销毁
void SeqListDestory(SeqList* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}// 顺序表打印
void SeqListPrint(SeqList* ps)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}//顺序表修改pos位置的值
void SeqModify(SeqList* ps, int pos, SLDatatype x)
{assert(ps);assert(pos >= 0 && pos < ps->size);ps->a[pos - 1] = x;
}void test1()
{SeqList cur;SeqListInit(&cur);SeqListPushBack(&cur, 500);//尾插SeqListPushBack(&cur, 400);//尾插SeqListPushBack(&cur, 300);//尾插SeqListPrint(&cur);SeqListPopBack(&cur);//尾删SeqListPrint(&cur);SeqListPushFront(&cur, 100);//头插SeqListPushFront(&cur, 200);//头插SeqListPushFront(&cur, 600);//头插SeqListPrint(&cur);SeqListPopFront(&cur); //头删SeqListPrint(&cur);if (SeqListFind(&cur,200) == 1)//元素查找printf("找到了\n");else{printf("没有找到\n");}SeqListInsert(&cur, 3, 999);//在pos位置插入xSeqListPrint(&cur);SeqListErase(&cur, 3);//删除pos位置的值SeqListPrint(&cur);SeqModify(&cur, 3, 666); //修改pos位置的值SeqListPrint(&cur);
}int main()
{test1();return 0;
}

请添加图片描述

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

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

相关文章

2023.11.17 hadoop之HDFS进阶

目录 HDFS的机制 元数据简介 元数据存储流程:namenode 生成了多个edits文件和一个fsimage文件 edits和fsimage文件 SecondaryNameNode辅助NameNode的方式: HDFS的存储原理 写入数据原理: 发送写入请求,获取主节点同意,开始写入,写入完成 读取数据原理:发送读取请求,获取…

vim——“Linux”

各位CSDN的uu们好呀&#xff0c;今天&#xff0c;小雅兰的内容是Linux的开发工具——vim。下面&#xff0c;我们一起进入Linux的世界吧&#xff01;&#xff01;&#xff01; Linux编辑器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 vim末行模式命令集 vim操…

【Linux网络】从原理到实操,感受PXE无人值守自动化高效批量网络安装系统

一、PXE网络批量装机的介绍 1、常见的三种系统安装方式 2、回顾系统安装的过程&#xff0c;了解系统安装的必要条件 3、什么是pxe 4、搭建pxe的原理 5、Linux的光盘镜像中的isolinux中的相关文件学习 二、关于实现PXE无人值守装机的四大文件与五个软件的对应关系详解 5个…

使用 Redis BitMap 实现签到与查询历史签到以及签到统计功能(SpringBoot环境)

目录 一、前言二、Redis BitMap 位图原理2.1、BitMap 能解决什么2.2、BitMap 存储空间计算2.3、BitMap 存在问题 三、Redis BitMap 操作基本语法和原生实现签到3.1、基本语法3.2、Redis BitMap 实现签到操作指令 四、SpringBoot 使用 Redis BitMap 实现签到与统计功能4.1、代码…

python之 flask 框架(2)项目拆分的 执行逻辑

项目的结构图 app.py # 导入__init__.py 比较特殊 from APP import create_appapp create_app() if __name__ __main__:app.run(debugTrue)init.py # __inti__.py # 初始化文件&#xff0c;创建Flask应用 from flask import Flask from .views import bluedef create_ap…

PyTorch 实战之水果分类

当我们试图提高神经网络的准确性时&#xff0c;经常会遇到过拟合训练数据的情况。当我们运行测试数据的模型时&#xff0c;这会导致一个糟糕的预测。因此&#xff0c;我采取了一个数据集&#xff0c;并应用这些技术&#xff0c;不仅提高准确性&#xff0c;而且还处理过拟合的问…

基于IDEA 进行Maven依赖管理

1. 依赖管理概念 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题&#xff0c;使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中&#xff0c;避免出现版本冲突和依赖缺失等…

一个用于操作Excel文件的.NET开源库

推荐一个高性能、跨平台的操作Excel文件的.NET开源库。 01 项目简介 ClosedXML是一个.NET第三方开源库&#xff0c;支持读取、操作和写入Excel 2007 (.xlsx&#xff0c; .xlsm)文件&#xff0c;是基于OpenXML封装的&#xff0c;让开发人员无需了解OpenXML API底层API&#xf…

go语言 | 图解字节青训营抖音(一)

前言 本文大致介绍了本人及本人所在小组为第五届字节跳动青训营后端专场大项目需求 —— 「实现一个极简版抖音」的部分实现细节。 需求 本届后端青训营大项目要求实现一个极简版抖音的后端服务&#xff0c;该后端服务通过 HTTP 协议向已被设计好的前端 App 传递数据&#xf…

识别代理IP:保障网络安全的重要一环

在互联网的世界中&#xff0c;代理服务器被广泛用于隐藏用户真实IP地址&#xff0c;带来了一些挑战&#xff0c;特别是在网络安全和欺诈检测方面。本文将探讨如何识别代理IP&#xff0c;以确保网络的安全性和可靠性。 1. 代理IP的背景与用途 代理服务器是位于用户和目标服务器…

吉林省土木建筑学会建筑电气分会及吉林省建筑电气情报网学术交流年会-安科瑞 蒋静

11月9-10日&#xff0c;吉林省土木建筑学会建筑电气分会及吉林省建筑电气情报网学术交流年会在吉林长春隆重举办。安科瑞电气股份有限公司作为智慧用电产品供应商受邀参会&#xff0c;为参会人士展示了安科瑞能源物联网云平台、电力运维云平台、智慧消防云平台、预付费管理云平…

k8s_base

应用程序在服务器上部署方式的演变,互联网发展到现在为止 应用程序在服务器上部署方式 历经了3个时代1. 传统部署 优点简单 缺点就是操作系统的资源是有限制的&#xff0c;比如说操作系统的磁盘&#xff0c;内存 比如说我8G&#xff0c;部署了3个应用程序&#xff0c;当有一天…

时序预测 | Python实现ConvLSTM卷积长短期记忆神经网络股票价格预测(Conv1D-LSTM)

时序预测 | Python实现ConvLSTM卷积长短期记忆神经网络股票价格预测(Conv1D-LSTM) 目录 时序预测 | Python实现ConvLSTM卷积长短期记忆神经网络股票价格预测(Conv1D-LSTM)预测效果基本介绍程序设计参考资料预测效果 基本介绍 时序预测 | Python实现ConvLSTM卷积长短期记忆神…

springMVC学习笔记-请求映射,参数绑定,响应,restful,响应状态码,springMVC拦截器

目录 概述 springMVC做了什么 springMVC与struts2区别 springMVC整个流程是一个单向闭环 springMVC具体的处理流程 springMVC的组成部分 请求映射 RequestMapping 用法 属性 1.value 2.method GET方式和POST方式 概述 HTTP给GET和POST做了哪些规定 GET方式&…

基于模拟退火算法优化概率神经网络PNN的分类预测 - 附代码

基于模拟退火算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于模拟退火算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于模拟退火优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

电子眼与无人机在城市安防中的协同应用研究

随着城市化进程的快速推进&#xff0c;城市安全问题成为了人们关注的焦点。传统的安防手段已经无法满足现代城市复杂多变的安全需求。因此&#xff0c;结合电子眼与无人机技术&#xff0c;实现二者之间的协同应用&#xff0c;成为提升城市安防能力的重要途径。 一、电子眼与无人…

深度系统(Deepin)开机无法登录,提示等待一千五百分钟

深度系统&#xff08;Deepin&#xff09;20.0&#xff0c; 某次开机无法登录&#xff0c;提示等待一千五百分钟。 &#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 用电脑这么多年&#xff0c;头一回遇到这种…

数据结构第四课 -----线性表之队列

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

【Spring】AOP进阶-JoinPoint和ProceedingJoinPoint详解

文章目录 1. 前言2. JoinPoint简介3. 获取被增强方法的相关信息4. ProceedingJoinPoint简介5. 获取环绕通知方法的相关信息6. 总结 1. 前言 在Spring AOP中&#xff0c;JoinPoint和ProceedingJoinPoint都是关键的接口&#xff0c;用于在切面中获取方法的相关信息以及控制方法的…

【Linux】 uptime命令使用

uptime 正常运行时间提供以下信息的单行显示。当前时间、系统运行的时间、当前登录的用户数量以及过去1、5和15分钟的系统平均负载。 语法 uptimeuptime命令 -Linux手册页 作者 由Larry Greenfield编写和迈克尔K约翰逊编写。 命令选项及作用 执行令 man uptime 执行命令结…