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

news2024/11/25 4:35:24

在这里插入图片描述

文章目录

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

前言

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

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

线性表

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

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

顺序表

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

顺序表的分类

静态顺序表

使用定长数组存储元素

typedef int SLDataType;
#define N 7

typedef 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);
	//限制pos
	assert(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);
	//限制pos
	assert(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.coloradmin.cn/o/1091675.html

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

相关文章

年底旺季,Shopee、Lazada如何通过测评补单技术打造产品权重收割流量

当前Shopee和Lazada平台的主要推广方式仍然以广告为主&#xff0c;毕竟这是平台的主要收入来源之一。然而&#xff0c;由于近年来大量卖家涌入东南亚市场&#xff0c;导致卖家之间的竞争日趋激烈。高额的广告投入并不能带来预期的效果&#xff0c;因此越来越多的卖家开始自学测…

RK3588 USB蓝牙调试

一.蓝牙基本概念 蓝牙技术是一种无线通信的方式&#xff0c;利用特定频率的波段&#xff08;2.4GHz-2.485GHz左右&#xff09;&#xff0c;进行电磁波传输。蓝牙传输原理是主从关系&#xff0c;一个主设备可以与7个蓝牙从设备配对。 二.蓝牙标准 蓝牙标准版本发展如下&#x…

Redis五大数据类型的底层设计

SDS 无论是 Redis 的 Key 还是 Value&#xff0c;其基础数据类型都是字符串。虽然 Redis是使用标准 C 语言开发的&#xff0c;但并没有直接使用 C 语言中传统的字符串表示&#xff0c;而是自定义了一 种字符串。这种字符串本身的结构比较简单&#xff0c;但功能却非常强大&…

使用paddleX体验

首先paddlex的网址链接是&#xff1a;飞桨AI Studio星河社区-人工智能学习与实训社区 (baidu.com) 进入paddlex以后的界面如下所示&#xff1a; 首先说明paddlex的作用是&#xff1a; PaddleX是PaddlePaddle深度学习框架的一个扩展库&#xff0c;专注于为深度学习任务提供强大…

Python PyInstaller安装和使用教程(详解版)

在创建了独立应用&#xff08;自包含该应用的依赖包&#xff09;之后&#xff0c;还可以使用 PyInstaller 将 Python 程序生成可直接运行的程序&#xff0c;这个程序就可以被分发到对应的 Windows 或 Mac OS X 平台上运行。 安装 PyInstalle Python 默认并不包含 PyInstaller…

GaN器件的工作原理

目录 AlGaN/GaNHEMT 器件工作原理&#xff08;常开-耗尽型器件&#xff09;常关 AlGaN/GaN 功率晶体管&#xff08;增强型器件&#xff09;HD-GIT与SP-HEMT AlGaN/GaNHEMT 器件工作原理&#xff08;常开-耗尽型器件&#xff09; 来源&#xff1a;毫米波GaN基功率器件及MMIC电路…

性能测试之性能测试指标详解

前言 刚开始&#xff0c;以为做性能测试&#xff0c;就是做些脚本、参数化、关联&#xff0c;压起来之后&#xff0c;再扔出一个结果。 但实际上不止这些内容&#xff0c;还要加上性能分析&#xff0c;关注调优之后响应时间有多大的提升&#xff0c;TPS 有多大的提高&#xf…

链路层2:交换机的MAC地址表和端口聚合

交换机的MAC地址表 对于网络交换机来说&#xff0c;MAC地址表是其能否正确转发数据包的关键&#xff0c;为此&#xff0c;协议标准RFC2285和RFC 2889中都对以太网交换机的MAC地址表和MAC地址学习进行专门的描述。MAC地址表显示了主机的MAC地址与以太网交换机端口映射关系&#…

基于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…

接口自动化测试框架详解

接口自动化测试框架只需要编写yaml(excel)测试用例即可完全实现零代码落地实施自动化测试。 1、核心技术 1.1 热加载封装&#xff08;全网最早应用于自动化测试框架的封装技术&#xff09; 1.2 requests统一请求封装 1.3 接口关联封装以及接口关联封装改进 1.4 规范yaml测…

R语言——赋值(= ,<- ,<<-)

R语言 R语言——赋值&#xff08; &#xff0c;<- &#xff0c;<<-&#xff09; 文章目录 R语言一、 与 <- 的区别二、 <<- ,向上一环境层写入变量 R语言中" <- " 与 " " 都可以用来赋值&#xff0c;但R中建议使用" <- “…

图片如何制作gif动画?1分钟教会你快速制作gif

Gif动态格式图片是当下非常流行的&#xff0c;它包含了多帧图像循环播放产生了动态的效果。Gif动图能够很好的暴打自己内心的想法&#xff0c;传递信息。那么&#xff0c;这种gif动画图片是怎么制作的呢&#xff1f;很简单&#xff0c;通过使用gif动态图片制作&#xff08;http…

旅游景点咨询系统的设计与实现

旅游景点咨询系统的设计与实现 /*** file 旅游景点咨询系统的设计与实现* author jUicE_g2R(qq:3406291309) * * copyright 2023.10* COPYRIGHT 原创技术笔记&#xff1a;转载需获得博主本人同意&#xff0c;且需标明转载源** language …

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

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

Windows网络系统架构

在介绍Windows网络体系架构之前&#xff0c;我首先介绍一下Windows中的两个重要编程规范——TDI&#xff0c;NDIS.&#xff0c;然后再介绍网络体系的架构。TDI&#xff0c;Transport Driver Interface&#xff0c;传输驱动程序接口。/Windows/System32/Drivers/Tdi.sys。在实现…

VSCode自定义代码块详解

第一步&#xff1a;点击文件-首选项-用户代码片段 第二步&#xff1a;选择代码块作用域的文件类型 类型一&#xff1a;全局作用域 这种类型的代码块是创建在vscode软件内部的文件。是跟随这当前安装的vscode这个软件的&#xff0c;不会随着项目的关闭而失效&#xff0c;会一直存…

Java多线程笔记

文章目录 线程简介&#xff08;Process AND Thread&#xff09;本章核心概念 线程实现&#xff08;重点&#xff09;线程创建&#xff08;Thread、Runnable、Callable&#xff09;1.Thread class 继承Thread类&#xff08;重点&#xff09;总结&#xff1a;注意案例&#xff1a…

568A和568B两种线序

现状 现在大家都是采用568B的线序 线序 标准568A&#xff1a;橙白-1&#xff0c;橙-2&#xff0c;绿白-3&#xff0c;蓝-4&#xff0c;蓝白-5&#xff0c;绿-6&#xff0c;棕白-7&#xff0c;棕-8 标准568B&#xff1a;绿白-1&#xff0c;绿-2&#xff0c;橙白-3&#x…

GB28181学习(七)——设备视音频文件检索

要求 文件检索主要用于区域、设备、录像时间段、录像地点、录像报警为条件的查询&#xff1b;用Message消息发送检索请求和返回查询结果&#xff0c;传送结果的Message消息可以发送多条&#xff1b;文件检索请求和应答命令采用MANSCDP协议格式定义&#xff1b; 流程 目录检索…

电商爬虫API快速入门指南

​电子商务爬虫API​是一个公共数据爬虫API&#xff0c;旨在通过大多数电子商务网站收集大量实时本地化数据并搜索信息。这个数据收集工具作为一个值得信赖的解决方案&#xff0c;实现通过最复杂的电子商务网站收集公共信息。电子商务爬虫API适用于商业用例&#xff0c;诸如价格…