数据结构之线性表(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,自定义token生成

1、使用的包PyJWT来实现token生成 安装&#xff1a;pip install PyJWT2.8.0 2、使用例子&#xff1a; import jwt import time pip install pyJWT2.8.0 SECRET_KEY %^ES*E&Ryurehuie9*7^%$#$EDFGHUYTRE#$%^&%$##$RTYGHIK DEFAULT_EXP 7 * 24 * 60def create_token(…

蓝桥杯十五届国赛模拟题1答案

1、bug缺陷报告 功能名称缺陷描述操作步骤预期结果实际结果缺陷级别销售订单列表

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

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

三生随记——茶叶的诅咒

在遥远的深山中&#xff0c;有一个被浓雾常年笼罩的古村落。这里的人们生活简朴&#xff0c;与外界几乎隔绝&#xff0c;他们唯一的财富&#xff0c;便是那满山遍野的奇特茶叶。这种茶叶的叶片深绿如玉&#xff0c;散发着诱人的香气&#xff0c;被称为“幽雾灵茶”。 然而&…

一. 做一个前后端分离的电商项目(技术栈 : 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;由于平时比较常用到的…

超级数据查看器 教程pdf 1-31集 百度网盘

百度网盘链接 提取码1234 通过百度网盘分享的文件&#xff1a;超级数据查看器 … 链接:https://pan.baidu.com/s/1s_2lbwZ2_Su83vDElv76ag?pwd1234 提取码:1234 复制这段内容打开「百度网盘APP 即可获取」

基于深度学习的物体材质预测

基于深度学习的物体材质预测 物体材质预测是计算机视觉中的一个重要任务&#xff0c;旨在通过分析图像或视频来识别和分类物体的材质类型&#xff08;如金属、木材、塑料、布料等&#xff09;。基于深度学习的方法在材质预测中取得了显著进展&#xff0c;能够高效地提取图像特…

[AI words] 突破瓶颈:如何将AI words网站构建时间缩短一半

在一个阳光明媚的早晨&#xff0c;我坐在电脑前&#xff0c;满怀期待地按下了“构建”按钮&#xff0c;准备生成我的新网站 AI words。这个网站的目标是为每个单词生成一个单独的页面&#xff0c;总共有5000个单词。可是&#xff0c;构建过程竟然需要整整14分钟&#xff01;我心…

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

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;而用 于定义表现形式…

Web前端行距代码:深入探索与实战应用

Web前端行距代码&#xff1a;深入探索与实战应用 在Web前端开发中&#xff0c;行距是一个至关重要的设计元素&#xff0c;它直接影响着网页的可读性和美观度。本文将围绕四个方面、五个方面、六个方面和七个方面&#xff0c;深入探讨Web前端行距代码的实现与应用。 一、四个方…