数据结构之线性表(2)

顺序表中的动态存储

上文我们了解到了顺序表中的静态顺序表的相关操作,今天我们来学习动态顺序表的知识。
为什么会存在动态顺序表呢??

原因:静态顺序表给定的数据容量固定,多了浪费,少了不够用

首先我们对动态顺序表的结构体声明如下:

typedef struct SeqList
{datatype * array;//指向动态开辟的数组size_t size;//有效数据的个数 size_t capacity;//容量空间的大小
}SL;

在这里插入图片描述

动态顺序表的相关操作:

1.初始化

void SeqListInit(SL *ps)
{ps->array=NULL;ps->size=0;ps->capacity=0;
}

2.尾插

void SeqListPushBack(SL* ps,datatype x)
{Buymemory(ps);ps->array[ps->size] = x;ps->size++;
}

3.头插

void SeqListPushFront(SL* ps, datatype x)
{Buymemory(ps);int i = p->size;while (i){ps->array[i] = ps->array[i-1];i--;}ps->array[0] = x;ps->size++;
}

图解:在这里插入图片描述

4.尾删

#include<stdio.h>
void SeqListPopBack(SL *ps)
{//ps->array[ps->size]=0;  error 因为可能要删除的数据本来就是0,所以可以直接size--ps->size--;
}

5.头删

void SeqListPopFront(SL *ps)
{for(int i=0;i<ps->size;++i){ps->array[i]=ps->array[i+1];}
}

6.指定位置删除数据

#include<stdio.h>
void SeqListDelete(SL *ps,int pos)
{for(int i=pos;i<ps->size;i++){ps->array[i]=ps->array[i+1];}ps->size--;
}

7.指定位置添加数据

void SeqListincrease(SL *ps,int pos,datatype x)
{for(int i=ps->size;i>pos;i--){ps->array[i+1]=ps->array[i];}ps->array[pos]=x;ps->size++;
}

对头插和尾插操作中,可能都会造成空间大小不够需要增容的操作,每次写起来非常麻烦,我们可以将增容的过程写成一个函数,以后在头插和尾插操作中,只要调用该函数即可。

8.增容函数

void Buymemory(SL* ps)
{if (ps->size == ps->capacity){//可能开始空间为0;对0*2还是等于0,如果开始空间为0,则给4个空间大小int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;datatype* tmp = (datatype*)realloc(ps->array, newcapacity * 2 * sizeof(datatype));if (tmp == NULL){printf("realloc fail\n");exit(-1);}else{ps->array = tmp;ps->capacity = newcapacity;}}
}

9.顺序表的销毁

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

10.顺序表的打印

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

11.查找指定数据

int SeqListfind(SL* ps, datatype x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->array[i] == x)return i;}
}

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct SeqList
{datatype* array;//指向动态开辟的数组size_t size;//有效数据的个数 size_t capacity;//容量空间的大小
}SL;
//初始化
void SeqListInit(SL* ps)
{ps->array = NULL;ps->size = 0;ps->capacity = 0;
}
//增容
void Buymemory(SL* ps)
{if (ps->size == ps->capacity){//可能开始空间为0;对0*2还是等于0,如果开始空间为0,则给4个空间大小int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;datatype* tmp = (datatype*)realloc(ps->array, newcapacity * 2 * sizeof(datatype));if (tmp == NULL){printf("realloc fail\n");exit(-1);}else{ps->array = tmp;ps->capacity = newcapacity;}}
}
//尾插
void SeqListPushBack(SL* ps,datatype x)
{Buymemory(ps);ps->array[ps->size] = x;ps->size++;
}
//头插
void SeqListPushFront(SL* ps, datatype x)
{Buymemory(ps);int i = ps->size;while (i){ps->array[i] = ps->array[i-1];i--;}ps->array[0] = x;ps->size++;
}
//尾删
void SeqListPopBack(SL* ps)
{//ps->array[ps->size]=0;  error 因为可能要删除的数据本来就是0,所以可以直接size--ps->size--;
}
//头删
void SeqListPopFront(SL* ps)
{for (int i = 0; i < ps->size; ++i){ps->array[i] = ps->array[i + 1];}
}
//指定位置删除数据
void SeqListDelete(SL* ps, int pos)
{for (int i = pos; i < ps->size; i++){ps->array[i] = ps->array[i + 1];}ps->size--;
}
//指定位置添加数据
void SeqListincrease(SL* ps, int pos, datatype x)
{for (int i = ps->size; i > pos; i--){ps->array[i + 1] = ps->array[i];}ps->array[pos] = x;ps->size++;
}
//顺序表的销毁
void SLDestroy(SL* ps)
{if (ps->array)free(ps->array);ps->array = NULL;ps->capacity = ps->size = 0;
}
//顺序表的打印
void SLPrint(SL  s)
{for (int i = 0; i < s.size; i++)printf("%d ", s.array[i]);
}
int main()
{SL s;SeqListInit(&s);SeqListPushFront(&s, 1);SeqListPushFront(&s, 3);SeqListPushFront(&s, 4);SeqListPushFront(&s, 5);SeqListPushBack(&s, 2);SeqListPushBack(&s, 2);SeqListPushBack(&s, 10);SeqListPushBack(&s, 8);SLPrint(s);SLDestroy(&s);return 0;
}

动态顺序表的相关操作就是这些了,谢谢大家支持!

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

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

相关文章

【Python深度学习】——信息量|熵

【Python深度学习】——信息量|熵 假设1. 信息量1.1 含义1.2 信息量的公式: 2. 熵Entropy2. 含义2.2 熵的计算公式:2.3 熵的作用 假设 例子&#xff1a;掷硬币 假设我们有一个公平的硬币。这个硬币有两个面&#xff1a;正面&#xff08;H&#xff09;和反面&#xff08;T&…

一. 做一个前后端分离的电商项目(技术栈 : springboot+mybatis-plus+vue) 的前期准备

前期准备 ---- 项目创建和配置 一.创建springboot项目二.项目前期准备工作1. 修改springboot和jdk版本号2.Web请求处理(1) 添加web依赖(2) 测试是否能够成功访问(3) 修改端口号(4) 创建数据库 3. 连接数据库(1) 添加依赖(2)配置application.properties文件(3)添加包扫描 Mapper…

Validation校验

文章目录 Validation校验作用依赖坐标UserController接收客户端注册用户请求的方法请求参数封装实体User的结构校验分组 Validation校验 作用 服务端接收前端传递的请求从参数的时候&#xff0c;可以对请求参数进行自动校验。 场景&#xff1a;通过postman向服务端发送一个注…

《检索技术核心20讲》进阶篇之LSM树

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243&#xff0c;文档形式记录笔记。 内容 磁盘和内存数据读取特点 工业界中数据量往往很庞大&#xff0c;比如数据无法全部加载进内存&#xff0c;无法支持索引的高效实时更新&…

视频格式转换avi格式怎么弄?分享视频转换方法

视频格式转换avi格式怎么弄&#xff1f;AVI作为一种广泛支持的视频格式&#xff0c;能够在多种设备和播放器上顺畅播放&#xff0c;确保我们的视频内容能够无障碍地分享给朋友或上传至各大平台。其次&#xff0c;AVI格式通常具有较好的兼容性&#xff0c;能够避免格式转换过程中…

修改yarn、npm、pnpm为国内镜像源

国内由于网络的原因&#xff0c;使用官方的npm、yarn、pnpm访问下载依赖库会很慢&#xff0c;有时候还会出现无法访问的情况&#xff0c;这时候就需要我们给npm、yarn、pnpm换一个国内的镜像源的&#xff0c;一般的我们可以将镜像换成淘宝的源&#xff0c;由于平时比较常用到的…

用飞书写博客,并自动部署

feishu-vitepress 用飞书写博客,并自动部署 目前的静态博客如vitepress&#xff0c;主要是用markdown来写内容。markdown虽然可读性比较好&#xff0c;但是在文章中贴图片有点麻烦&#xff0c;需要先保存图片到asset目录下&#xff0c;再在markdown中写图片地址。 平时工作主要…

优化查询性能:DolphinDB 时间类型数据比较规则详解

在数据库中&#xff0c;时间是一种常见的数据类型。在处理时间数据时&#xff0c;比较操作是非常常见的需求。然而&#xff0c;在不同的场景下&#xff0c;对时间类型数据进行比较时应用的规则不同。本文将从 DolphinDB 支持的时间类型开始&#xff0c;由浅入深分别介绍时间类型…

47.PyCharm P版突然无法启动

目录 1.启动cmd.exe&#xff0c;进到pycharm\bin目录&#xff0c;启动.\pycharm.bat&#xff0c;如果正常&#xff0c;就像下面这个样子&#xff0c;如果不正常&#xff0c;则会报错&#xff0c; 2.用记事本打开pycharm.bat文件&#xff0c;加上以下代码后 今晨&#xff0c;无…

《C++ Primer》导学系列:第 3 章 - 字符串、向量和数组

3.1 命名空间的使用 概述 命名空间是C中的一种机制&#xff0c;用于组织代码并避免名字冲突。通过使用命名空间&#xff0c;可以将全局作用域中的标识符组织到逻辑分组中&#xff0c;从而提高代码的可读性和可维护性。命名空间在大型项目中尤为重要&#xff0c;因为它们可以防…

关于C#导出Word时报错“{00020970-0000-0000-C000-000000000046}加载类型库/DLL 时出错”的解决办法

之前还运行正常的程序&#xff0c;突然发现导出Word的时候会报错&#xff0c;报错内容&#xff1a; System.InvalidCastException:“Unable to cast COM object of type ‘Microsoft.Office.Interop.Word.ApplicationClass’ to interface type ‘Microsoft.Office.Interop.Wor…

ubuntu18.04 配置 mid360并测试fast_lio

1.在买到Mid360之后&#xff0c;我们可以看到mid360延伸出来了三组线。 第一组线是电源线&#xff0c;包含了红色线正极&#xff0c;和黑色线负极。一般可以用来接9-27v的电源&#xff0c;推荐接12v的电源转换器&#xff0c;或者接14.4v的电源转换器。 第二组线是信号线&#x…

CSS概述

CSS是一种样式表语言&#xff0c;用于为HTML文档控制外观&#xff0c;定义布局。例如&#xff0c; CSS涉及字体、颜色、边距、高度、宽度、背景图像、高级定位等方面 。 ● 可将页面的内容与表现形式分离&#xff0c;页面内容存放在HTML文档中&#xff0c;而用 于定义表现形式…

本学期嵌入式期末考试的综合项目,我是这么出题的

时间过得真快&#xff0c;临近期末&#xff0c;又到了老师出卷的时候。作为《嵌入式开发及应用》这门课的主讲教师&#xff0c;今年给学生出的题目有一点点难度&#xff0c;最后的综合项目要求如下所示&#xff0c;各位学生朋友和教师同行可以评论一下难度如何&#xff0c;单片…

【推荐算法】召回模型总结

文章目录 1、传统召回算法2、向量化召回统一建模架构2.1、如何定义正样本2.2、重点关注负样本2.3、召回生成Embedding&#xff1a;要求用户、物料解耦2.4、如何定义优化目标2.4.1、Softmax Loss、NCE Loss、NEG Loss2.4.2、Sampled Softmax Loss2.4.3、Pairwise Loss 3、Word2V…

量化交易入门——盘口

今天接着上一期讲解开盘定势的种类&#xff0c;在讲之前&#xff0c;科普一下“盘口五档”的成交知识。 每个炒股软件上&#xff0c;都会有某只个股的成交信息&#xff0c;在其中会出现一个五档的行情列表&#xff0c;里面列出了买家和卖家各五个价格及其对应的数量。这五档价…

Docker 基础使用(5)Compose

文章目录 Docker Compose 基础认识Docker Compose 基础语法Docker Compose 基础指令Docker Compose 使用实例 Docker 基础使用(0&#xff09;基础认识 Docker 基础使用(1&#xff09;使用流程概览 Docker 基础使用(2&#xff09;镜像与容器 Docker 基础使用(3&#xff09;存储卷…

【教程】使用立创EDA打开JSON格式的PCB及原理图

这里写目录标题 一、将PCB和原理图放同一文件夹二、打开嘉立创EDA并导入.zip文件三、选择.zip文件并选择 “导入文件并提取库” 一、将PCB和原理图放同一文件夹 并打包成.zip文件 二、打开嘉立创EDA并导入.zip文件 嘉立创 我这里用的网页端&#xff0c;客户端下载页面拉到…

FreeRTOS简单内核实现6 优先级

文章目录 0、思考与回答0.1、思考一 1、就绪链表1.1、创建1.2、初始化1.3、添加任务1.3.1、prvAddNewTaskToReadyList( )1.3.2、prvAddTaskToReadyList( ) 1.4、寻找最高优先级任务 2、修改内核程序2.1、TCB2.2、xTaskCreateStatic( )2.3、prvInitialiseNewTask( )2.4、vTaskSt…

[Qt的学习日常]--常用控件1

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、什么是控…