超详细的顺序表(附源码)

在这里插入图片描述

文章目录

  • 前言
  • 线性表
  • 顺序表
    • 顺序表的分类
      • 静态顺序表
      • 动态顺序表
  • 动态顺序表的实现
    • 🚩结构
    • 🚩初始化
    • 🚩销毁
    • 🚩插入
    • 🚩删除
    • 🚩查找
    • 📃源代码

前言

顺序表是线性表的一种,代码量对于前面的学习,有明显的难度。小编也是第一次学习数据结构,如有谬误,欢迎指正。

本篇收录于《数据结构杂谈》中

线性表

线性表(linearlist)是n个具有相同特性的数据元素的有限序列。
线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。

顺序表

顺序表的底层结构是数组,因此顺序表在逻辑结构上线性的,在物理结构上也是线性的。顺序表对数组进行了封装,是现在了增删改的操作。

顺序表的分类

静态顺序表

使用定长数组存储元素

typedef int SLDataType;
#define N 7typedef struct
{ SLDataType a[N];   //定长数组int size;          //有效个数
}SL;

缺点:空间给少了不够用,给多了造成空间浪费

动态顺序表

typedef int SLDataType;
typedef struct
{SLDataType* elme;int size;         //记录有效个数int capacity;    //空间容量
};

可增容

当size == capacity时,说明此顺序表已经满了,就需要去增容

动态顺序表的实现

🚩结构

typedef int SLDataType;
typedef struct
{SLDataType* elme;int size;         //记录有效个数int capacity;    //空间容量
};

顺序表是一个存储结构,因此什么数据类型都可以存储。将int类型的名字替换成SLDataTYpe,后续如果向存储别的类型,如char,short,结构体等类型时,只需要将int修改为char,short,结构体等类型,使得操作更加简化。

🚩初始化

在之前学习过程中吗,我们定义一个int型变量时,都使用int a = 0;进行初始化,在顺序表中也是一样,需要进行初始化。

code

//初始化
void SLinit(SL* ps) {assert(ps);ps->arr = (SLDataType*)malloc(INT_CAPACITY * sizeof(SLDataType));if (ps->arr == NULL) {perror("malloc");return;}ps->size = 0;ps->capacity = INT_CAPACITY;
}

🚩销毁

顺序表中使用了malloc动态开辟内存空间,因此需要在结束的时候释放内存,将内存归还予操作系统。

🚩插入

插入有两种情况:

  1. 顺序表空间充足,可直接插入
  2. 空间不充足,需要先进行扩容,再去插入

因此在插入数据前,我们需要先判断空间大小够不够,不够我们需要去扩容
扩容时,capacity一般是以1.5倍或者是2倍去增大

//判断空间大小
void SLCheckCapacity(SL* ps) {if (ps->size == ps->capacity) {int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)relloc(ps->arr, sizeof(SLDataType) * newCapacity);if (tmp == NULL)perror("relloc");return 1;ps->arr = tmp;ps->capacity == newCapacity;}
}

头插

在这里插入图片描述

尾插

在这里插入图片描述

在pos(任意位置)插入

在这里插入图片描述

//插入数据
void SLInsert(SL* ps, int pos, SLDataType x) {assert(ps);//限制posassert(pos >= 0 && pos <= ps->size);//判断是否扩容void SLCheckCapacity(ps);int i = 0;for (int i = ps->size; i <pos ; i--) {ps->arr[i] == ps->arr[i - 1];          //最后一次进来的时pos+1,arr[pos+1]==arr[pos]}ps->arr[pos] = x;ps->size++;
}

🚩删除

删除时,不需要再去扩容,只需要将pos+1位置往前移动即可,后面元素依次往前移动。

在这里插入图片描述

//删除数据
void SLErase(SL* ps, int pos) {assert(ps);assert(pos >= 0 && pos < ps->size);int i = 0;for (i = pos; i < ps->size - 1; i++) {ps->arr[i] = ps->arr[i + 1];          //最后一次进来的是size-2,arr[size-2]=arr[size-2]	}ps->size--;
}

🚩查找

//查找元素
int SLFind(SL* ps, SLDataType x) {assert(ps);int str;while (str < ps->size) {if (ps->arr == x) {return str;}str++;}return -1;
}

这里小编是拿int类型举的例子,因此在判断等于的时候直接使用了等于符号,如果是字符串的比较,那么就得需要使用字符串函数了。

📃源代码

小编将结构的实现和函数的声明放在了头文件中,方便阅读,将函数的具体实现放在了源文件中

.h文件

#pragma once#include<stdio.h>
#include<assert.h>
#include<errors.h>#define INT_CAPACITY 4
typedef int SLDataType;
typedef struct
{SLDataType* arr;int size;         //记录有效个数int capacity;    //空间容量
}SL;//初始化
void SLinit(SL* ps);//销毁
void SLDestory(SL* ps);//判断空间大小
void SLCheckCapacity(SL* ps);//插入数据
void SLInsert(SL* ps, int pos, SLDataType x);//删除数据
void SLErase(SL* ps, int pos);//查找元素
int SLFind(SL* ps, SLDataType x);

.c文件

# define _CRT_SECURE_NO_WARNINGS#include"SeqList.h"//初始化
void SLinit(SL* ps) {assert(ps);ps->arr = (SLDataType*)malloc(INT_CAPACITY * sizeof(SLDataType));if (ps->arr == NULL) {perror("malloc");return;}ps->size = 0;ps->capacity = INT_CAPACITY;
}//销毁
void SLDestory(SL* ps) {if (ps->arr)free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}//判断空间大小
void SLCheckCapacity(SL* ps) {if (ps->size == ps->capacity) {int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* tmp = (SLDataType*)relloc(ps->arr, sizeof(SLDataType) * newCapacity);if (tmp == NULL)perror("relloc");return 1;ps->arr = tmp;ps->capacity == newCapacity;}
}//插入数据
void SLInsert(SL* ps, int pos, SLDataType x) {assert(ps);//限制posassert(pos >= 0 && pos <= ps->size);//判断是否扩容void SLCheckCapacity(ps);int i = 0;for (int i = ps->size; i <pos ; i--) {ps->arr[i] == ps->arr[i - 1];          //最后一次进来的时pos+1,arr[pos+1]==arr[pos]}ps->arr[pos] = x;ps->size++;
}//删除数据
void SLErase(SL* ps, int pos) {assert(ps);assert(pos >= 0 && pos < ps->size);int i = 0;for (i = pos; i < ps->size - 1; i++) {ps->arr[i] = ps->arr[i + 1];          //最后一次进来的是size-2,arr[size-2]=arr[size-2]	}ps->size--;
}//查找元素
int SLFind(SL* ps, SLDataType x) {assert(ps);int str;while (str < ps->size) {if (ps->arr == x) {return str;}str++;}return -1;
}

在这里插入图片描述

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

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

相关文章

K邻近算法(KNN,K-nearest Neighbors Algorithm)

文章目录 前言应用场景欧几里得距离&#xff08;欧氏距离&#xff09;两类、单一属性&#xff08;1D&#xff09;两类、两种属性&#xff08;2D&#xff09;两类、两种以上属性&#xff08;>3D&#xff09; Examples in R再来一个补充一下什么是变量 什么是变量&#xff1f;…

node.js+NPM包管理器+Webpack打包工具+前端项目搭建

javascript运行环境&#xff08;无需依赖html文件&#xff09; BFF&#xff0c;服务于前端的后端 官网下载安装&#xff0c;node -v查看是否安装成功 ①、创建一个01.js文件 //引入http模块 const httprequire(http)//创建服务器 http.createServer(function(request,respo…

C# Onnx GFPGAN GPEN-BFR 人像修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms;namespace 图像修复 {public partial class Form1 : For…

传感器信息系统中的节能收集研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SecureCRT 自动测试脚本的使用方法

脚本示例&#xff08;get_batteryifo_interval_2s.vbs&#xff09;&#xff1a; Sub Main Do While(1)crt.Screen.Send "pm_client batteryinfo" & chr(13)crt.Sleep 2000 Loop End Sub 1. 解压 SecureCRT 压缩包&#xff08;网上下载&#xff09;&#xff1b…

机器人制作开源方案 | 杠杆式6轮爬楼机器人

1. 功能描述 本文示例将实现R281b样机杠杆式6轮爬楼机器人爬楼梯的功能&#xff08;注意&#xff1a;演示视频中为了增加轮胎的抓地力&#xff0c;在轮胎上贴了双面胶&#xff0c;请大家留意&#xff09;。 2. 结构说明 杠杆式6轮爬楼机器人是一种专门用于爬升楼梯或不平坦地面…

基于JAYA优化的BP神经网络(分类应用) - 附代码

基于JAYA优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于JAYA优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.JAYA优化BP神经网络3.1 BP神经网络参数设置3.2 JAYA算法应用 4.测试结果&#xff1a;5.M…

08 | Jackson 注解在实体里面如何应用?常见的死循环问题如何解决?

我们用 Spring Boot 里面默认集成的 fasterxml.jackson 加以说明&#xff0c;这看似和 JPA 没什么关系&#xff0c;但是一旦我们和 Entity 一起使用的时候&#xff0c;就会遇到一些问题&#xff0c;特别是新手同学&#xff0c;我们这一课时详细介绍一下用法。先来跟着我了解一下…

计算机毕业设计选什么题目好?springboot 美食推荐系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

clickhouse数据库简介,列式存储

clickhouse数据库简介 1、关于列存储 所说的行式存储和列式存储&#xff0c;指的是底层的存储形式&#xff0c;数据在磁盘上的真实存储&#xff0c;至于暴漏在上层的用户的使用是没有区别的&#xff0c;看到的都是一行一行的表格。 idnameuser_id1闪光10266032轨道物流10265…

基于秃鹰优化的BP神经网络(分类应用) - 附代码

基于秃鹰优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于秃鹰优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.秃鹰优化BP神经网络3.1 BP神经网络参数设置3.2 秃鹰算法应用 4.测试结果&#xff1a;5.M…

性能优化-中间件tomcat调优

Tomcat作用 主要有三个: 管理Servlet应用的生命周期。Tomcat可以管理和控制Servlet应用程序的启动、停止、暂停和恢复等生命周期过程,确保Servlet应用的稳定运行和有序管理。把客户端请求的url映射到对应的servlet。Tomcat作为一个Web服务器,可以将客户端发送的HTTP请求URL…

DL Homework 3

给定训练集,将每个样本输入给前馈神经网络&#xff0c;得到网络输出为,其在数据集上的结构化风险为 首先简单解释一下这堆话&#xff0c;结构化风险经验风险正则化项,经验风险为&#xff0c;对于函数我们大多数采取的为交叉熵函数&#xff0c;,正则化项为&#xff0c;首先神经网…

C# InformativeDrawings 生成素描画

效果 项目 下载 可执行程序exe下载 源码下载

2.1、如何在FlinkSQL中读取写出到Kafka

目录 1、环境设置 方式1&#xff1a;在Maven工程中添加pom依赖 方式2&#xff1a;在 sql-client.sh 中添加 jar包依赖 2、读取Kafka 2.1 创建 kafka表 2.2 读取 kafka消息体&#xff08;Value&#xff09; 使用 format json 解析json格式的消息 使用 format csv 解析…

【从0开发】百度BML全功能AI开发平台【实操:以部署情感分析模型为例】

目录 一、全功能AI开发平台介绍二、AI项目落地应用流程&#xff08;以文本分类为例&#xff09;2-0、项目开始2-1、项目背景2-2、数据准备介绍2-3、项目数据2-4、建模调参介绍2-5、项目的建模调参2-6、开发部署2-7、项目在公有云的部署 附录&#xff1a;调用api代码总结 一、全…

百度车牌识别AI Linux使用方法-armV7交叉编译

1、获取百度ai的sdk 百度智能云-登录 (baidu.com) 里面有两个版本的armV7和armV8架构。v7架构的性能比较低往往需要交叉编译&#xff0c;v8的板子性能往往比较好&#xff0c;可以直接在板子上编译。 解压到ubuntu里面。这里介绍v7架构的。 2、ubuntu环境配置 ubuntu下安装软件…

Bootstrap-媒体类型

加上媒体查询之后&#xff0c;只有在特定的设备之下才能起作用&#xff01;&#xff01;&#xff01;

Win10找不到hosts文件的解决方案

正常情况下&#xff0c;Windows10系统的C:\Windows\System32\drivers\etc目录下应该有hosts文件&#xff0c;但偏偏有些电脑没有&#xff0c;哪怕你打开了查看“隐藏的项目”也没见到hosts文件&#xff0c;如下&#xff1a; 解决方案 1、先点击查看&#xff0c;再点击选项&…

Ant Design Form.List基础用法

使用 Form.List 使用 项目中需要在新增可以多个如图 代码如下 // An highlighted block <Card title"产品信息" bordered{false}><Form.List name"productList" >{(fields, {add, remove}) > (<>{fields.map((field) > (<Ro…