数据结构——顺序表详解

目录

前言

一.线性表

1.概念

二.顺序表

1.概念

2.分类

2.1静态顺序表

2.2动态顺序表


前言

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

一.线性表

1.概念

线性表(linear list)是n个具有相同特性的数据元素的有限序列.线性表是一种在实际中广泛使用的数据结构

2.分类

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

3.性质

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

物理结构上并不一定连续,在物理上存储时,通常以数组链式结构的形式存储

二.顺序表

1.概念

逻辑结构是线性的,物理结构是连续的

2.分类

2.1静态顺序表

2.1.1概念

使用定长数组存储元素

2.1.2弊端

给定的数组长度,若不够会导致后续的数据保存失败;若多了会导致空间的大量浪费

严重的会导致重大的技术事故

2.1.3实现
静态顺序表
#define N 100
struct SeqList
{SLDataType a[N];//定长数组int size;//有效数据个数
};

2.2动态顺序表

2.2.1概念

使用动态开辟的数组存储

 三.接口实现

通过顺序表,我们可以实现创建、初始化、扩容、尾插、头插、尾删、头删、指定位置删除、指定位置添加、查找、打印、销毁

为了有一个好习惯以及将来处理多的代码,我们进行分装处理

将函数的声明、类型的声明放在头文件(.h)中,函数的实现放在源文件(.c)中

typedef int SLDataType;typedef struct SeqList
{SLDataType* arr;//存储数据的底层结构int capacity;//记录顺序表的空间大小int size;//记录顺序表当前有效的数据个数
}SL;typedef struct SeqList SL;//初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLPrint(SL* ps);//保持接口一致性//顺序表的头部/尾部插入
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);//顺序表的头部/尾部删除
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);//指定位置之前插入数据
//删除指定位置数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);//查找
int SLFind(SL* ps, SLDataType x);

1.创建及初始化

在这里我们使用typedef定义一个新的数据类型,方便我们进行后续的修改(如将int->char)

typedef int SLDataType;
typedef struct SeqList SL;
typedef struct SeqList
{SLDataType* arr;//存储数据的底层结构int capacity;//记录顺序表的空间大小int size;//记录顺序表当前有效的数据个数
}SL;
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}

 2.扩容

针对后续的添,我们需要判断空间是否足够,若不够我们就需要进行动态内存开辟(realloc函数)

我们创建一个临时变量去接收新开辟的空间,然后在安全的情况下再给原变量

void SLCheckCapacity(SL* ps)
{if (ps->size == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SLDataType* temp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));if (temp == NULL){perror("realloc fail!");exit(1);}//扩容成功ps->arr = temp;ps->capacity = newCapacity;}
}

3.尾插头插与尾删头删

3.1尾插头插

对于尾插,先判断空间是否足够,之后直接插入即可

对于头插,我们也是需要先判断空间,之后将下标前一位的值赋给后一位

void SLPushBack(SL* ps, SLDataType x)
{//断言--粗暴的解决方式//assert(ps != NULL);assert(ps);//if判断--温柔的方式/*if (ps == NULL){return;}*///空间不够,扩容SLCheckCapacity(ps);//空间足够,直接插入ps->arr[ps->size++] = x;//ps->size++;
}
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[0] = x;ps->size++;
}

3.2尾删头删

对于尾删,我们可以直接删除size即可

对于头删,我们将后一位赋给前一位

void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);//顺序表不为空//ps->arr[ps->size - 1] = -1;ps->size--;
}
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->size--;
}

4.指定位置删除添加

添加

void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);{SLCheckCapacity(ps);//pos及以后的数据往后挪动一位,pos空出来for (int i=ps->size;i>pos;i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;}
}

删除 

void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);//pos以后的数据往前挪动一位for (int i=pos;i<ps->size-1;i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

5.查找打印销毁

查找

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;
}

打印 

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

销毁

void SLDestroy(SL* ps)
{assert(ps);free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}

如果上述内容对您有帮助,希望给个三连谢谢 

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

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

相关文章

【Linux系统化学习】文件描述符fd

目录 基础IO预备知识 C语言文件接口 "w"的方式打开&#xff0c;fputs写入 以"a"的方式打开&#xff0c;fputs写入 使用位图传参 系统调用操作文件 open的使用 第一种形式 第二种形式 write() 文件描述符 文件描述符和进程的关系 默认的三个IO流…

NModbus的NuGet包使用样例

首先仿真软件ModbusSlave简单配置3条数据&#xff1a; 连接配置&#xff1a; VS中安装NuGet包&#xff1a;NModbus4 简单获取湿度 SerialPort serialPort new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);serialPort.Open();Modbus.Device.ModbusSer…

mysql项目实战,常用sql语句的实战笔记

1.使用sql语句对数据库进行创建 //创建实验用的数据库 CREATE DATABASE jsschool;//使用当前数据库 USE jsschool;//创建学生表 CREATE TABLE student (sno VARCHAR(20) PRIMARY KEY COMMENT 学生编号,sname VARCHAR(20) NOT NULL COMMENT 学生姓名,ssex VARCHAR(10) NOT NULL…

WebSocket相关问题

1.WebSocket是什么&#xff1f;和HTTP的区别&#xff1f; WebSocket是一种基于TCP连接的全双工通信协议&#xff0c;客户端和服务器仅需要一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并且支持双向数据的传输。WebSocket和HTTP都是基于TCP的应用层协议&am…

解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上,运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本,激活win10步骤流程。

一. 解决 0x803F7001在运行Microsoft Windows非核心版本的计算机错误 首先&#xff0c;按下winR打开"运行",输入 regedit 后回车&#xff0c;打开注册表。   然后再注册表下输入地址HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProt…

YOLO部署实战(2):使用OpenCV优化视频转图片流程并设置帧数

在计算机视觉和图像处理领域&#xff0c;OpenCV是一个强大的开源库&#xff0c;它为处理图像和视频提供了丰富的工具和功能。本文将介绍如何使用OpenCV将视频文件转换为一系列图片&#xff0c;并演示如何通过设置转换的帧数来优化这一过程。 1 Win10配置OpenCV 在Windows操作…

开源项目的三年,我的项目经历了哪些变化?

0.前言 自己一个项目写了三年&#xff0c;到底写了什么东西了&#xff0c;这个项目经历了哪些变化呢&#xff1f;其中的心路历程如何&#xff1f; 兄弟们&#xff0c;要是感觉我的项目有价值&#xff0c;去b站给俺点点关注呐。我更新的更快。点击下面的了解就可以跳转去b站。…

水面漂浮物监测识别摄像机

水面漂浮物监测识别摄像机是一种用于监测水域表面上漂浮物的设备&#xff0c;可以帮助环保部门或海洋研究机构快速发现和识别水中的浮游物&#xff0c;有助于保护水质和生态环境。这种摄像机通常具有以下功能和特点&#xff1a; 高分辨率摄像头&#xff1a;配备高清晰度摄像头&…

ongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(2)-Swagger框架集成

Swagger是什么&#xff1f; Swagger是一个规范且完整API文档管理框架&#xff0c;可以用于生成、描述和调用可视化的RESTful风格的 Web 服务。Swagger 的目标是对 REST API 定义一个标准且和语言无关的接口&#xff0c;可以让人和计算机拥有无须访问源码、文档或网络流量监测就…

算法练习-删除二叉搜索树中的节点(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;二叉树 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨…

第三百一十三回

文章目录 1. 概念介绍2. 实现方法2.1 obscureText属性2.2 decoration属性 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何实现倒计时功能"相关的内容&#xff0c;本章回中将介绍如何实现密码输入框.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍…

【JS逆向七】逆向某翻译网站的sign参数,并模拟生成 仅供学习

逆向日期&#xff1a;2024.02.07 使用工具&#xff1a;Node.js 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 可使用AES进行解密处理&#xff08;直接解密即可&#xff09;&#xff1a;AES加解密工具 1、打开某某网站(请使用文章开头的AES…