数据结构之线性表(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;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用【R语言】揭示大学生恋爱心理:【机器学习】与【深度学习】的案例深度解析

目录 第一部分&#xff1a;数据收集与预处理 1.1 数据来源 1.2 数据清洗 1.3 数据探索性分析 第二部分&#xff1a;特征工程与数据准备 2.1 特征选择 2.2 特征提取 第三部分&#xff1a;机器学习模型 3.1 逻辑回归模型 3.2 决策树模型 第四部分&#xff1a;深度学习…

~$开头的临时文件是什么?可以删除吗?

&#xff08;2023.12.4&#xff09; 在进行Word文档编辑的时候&#xff0c;都会产生一个以~$开头的临时文件&#xff0c;它会自动备份文档编辑内容&#xff0c;若是正常关闭程序&#xff0c;这个文档就会自动消失&#xff1b;而在非正常情况下关闭word文档&#xff0c;如断电&…

单片机使用循环来实现延时和定时器延时的区别是什么?

单片机&#xff0c;可以用循环延迟也可以用定时器。很多人说&#xff0c;唯一的区别浪费多少算力&#xff0c;话没毛病但不符合场景。只有追求实时性好&#xff0c;成本低的项目才会使用单片机。否则&#xff0c;我为什么不上一个资源更好&#xff0c;单位周期更快&#xff0c;…

被封号后,我终于明白免费代理的危害

在数字时代&#xff0c;网络已经成为人们日常生活和商业活动中不可或缺的一部分。为了实现更广阔的业务拓展和更畅通的网络体验&#xff0c;许多人开始考虑使用代理服务器。然而&#xff0c;虽然免费代理可能听起来像是个经济实惠的选择&#xff0c;但事实上&#xff0c;它可能…

考研计组chap2数据的表示和运算(补充)

一、进位计数制 1.r进制 第i位表示r进制的权为i 2.进制转换 &#xff08;1&#xff09;r->10 对应位置数*权值 &#xff08;2&#xff09;2 -> 16 or 8 每三位2进制数可表示1位16进制 每四位2进制数可表示1位16进制 so 分开之后转为16进制即可 eg&#xff1a;11…

qt仿制qq登录界面

#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {// 设置窗口大小this->resize(window_width, window_heigth);// 固定窗口大小this->setFixedSize(window_width, window_heigth);// 设置窗口图标this->se…

Hot Sale | 澳鹏精品数据集火热来袭!

在人工智能项目需要快速启动时&#xff0c;成品数据集&#xff08;OTS / off-the-shelf datasets&#xff09;往往是许多AI团队的首选。 采用高质量、合规的成品数据集进行部署&#xff0c;不仅能够在速度至关重要的今天快人一步进入市场&#xff0c;更可以在预算有限的情况下…

【秋招突围】2024届秋招笔试-阿里系列笔试题-第一套-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

如何通过Outlook大附件插件,加强外发附件的安全性和管控力度?

因邮件的便捷性和普遍性&#xff0c;企业间业务往来通常会采取邮箱业务&#xff0c;沟通使用成本也比较低&#xff0c;但容易出现附件太大无法上传的问题。Outlook大附件插件是为解决邮件系统中附件大小限制问题而开发的一系列工具。 使用邮件发送附件时&#xff0c;可能会遇到…

PR插件-图层抖动弹跳缩放旋转模糊闪烁缩放抖动动作效果预设

在PR软件中制作动画的便捷工具&#xff0c;直接点击脚本窗口的预设即可加载到时间线&#xff0c;拥有如旋转、模糊、闪烁、毛刺、弹跳、缩放、抖动等预设。脚本动画可视化预览&#xff0c;一键使用。A handy tool to make animations in Premiere Pro. 支持Win/Mac系统&#x…

【MySQL】MySQL45讲-读书笔记

1、基础架构&#xff1a;一条SQL查询语句是如何执行的&#xff1f; 1.1 连接器 连接器负责跟客户端建立连接、获取权限、维持和管理连接。 mysql -h$ip -P$port -u$user -p输完命令之后&#xff0c;输入密码。 1.2 查询缓存 MySQL 拿到一个查询请求后&#xff0c;会先到查询缓…

代码随想录算法训练营第37天|● 56.合并区间● 738.单调递增的数字

合并区间 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 按照左边界从小到大排序之后&#xff0c;如果 intervals[i][0] < intervals[i - 1][1] 即intervals[i]的左边界 < intervals[i - 1]的右边界&#xff0c;则一定有重叠。&#xff08;本题相邻区间也算重贴…

高考志愿填报秘籍:大学篇

选择适合自己的大学和专业&#xff0c;对广大考生来说至关重要。从某种程度上来说&#xff0c;决定了考生未来所从事的行业和发展前景。为了帮助广大考生更加科学、合理地填报志愿&#xff0c;选择适合自己的大学和专业&#xff0c;本公众号将推出如何用AI填报高考志愿专栏文章…

免费代理为什么不安全?

在数字时代&#xff0c;网络已经成为人们日常生活和商业活动中不可或缺的一部分。为了实现更广阔的业务拓展和更畅通的网络体验&#xff0c;许多人开始考虑使用代理服务器。然而&#xff0c;虽然免费代理可能听起来像是个经济实惠的选择&#xff0c;但事实上&#xff0c;它可能…

Sui Bridge在测试网上线并推出10万SUI激励计划

是一种为Sui设计的原生桥接协议&#xff0c;专门用于在Sui与其他网络之间桥接资产和数据。今天&#xff0c;Sui Bridge宣布在测试网上线。作为一种原生协议&#xff0c;Sui Bridge能够在Ethereum和Sui之间轻松且安全地转移ETH、wBTC、USDC和USDT&#xff0c;使其成为Sui基础设施…

LeNet-5训练神经网络训练

LeNet-5训练 导包 import tensorflow as tf from tensorflow.keras import layers, models, datasets, optimizers 加载Fashion-MNIST数据集 (train_images, train_labels), (test_images, test_labels) datasets.fashion_mnist.load_data() 归一化像素值到[0, 1]区间…

服务器防漏扫,主机加固方案来解决

什么是漏扫&#xff1f; 漏扫是漏洞扫描的简称。漏洞扫描是一种安全测试方法&#xff0c;用于发现计算机系统、网络或应用程序中的潜在漏洞和安全弱点。通过使用自动化工具或软件&#xff0c;漏洞扫描可以检测系统中存在的已知漏洞&#xff0c;并提供相关的报告和建议&#xf…

Matlab|基于主从博弈的智能小区代理商定价策略及电动汽车充电管理

目录 一、主要内容 二、部分代码 三、程序结果 四、下载链接 一、主要内容 主要做的是一个电动汽车充电管理和智能小区代理商动态定价的问题&#xff0c;将代理商和车主各自追求利益最大化建模为主从博弈&#xff0c;上层以代理商的充电电价作为优化变量&#xff0c;下层以…

linux配置用户

一&#xff0c;安装sudo与确保在管理员用户下 apt update apt install sudo -y 切换用户&#xff1a;密码不会显示&#xff0c;一个个输入然后回车。//图中是zfxt-->Stable用户切换 su root //root为用户名 以其他用户执行命令&#xff1a; su root ping baidu.com //su…

安装好IDEA后,就能够直接开始跑代码了吗?

我实习的第一天&#xff0c;睿哥叫我安装了IDEA&#xff0c;然后我就照做了。 之后&#xff0c;我把gitlab的代码拉下来后&#xff0c;发现好像没有编译运行的按钮&#xff0c;所以我就跑去问睿哥。睿哥当时看了看后&#xff0c;发现原来我没有安装JDK&#xff0c;他就叫我安装…