数据结构之线性表(2)

news2025/1/12 23:27:07

顺序表中的动态存储

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

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

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

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.coloradmin.cn/o/1819875.html

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

相关文章

基于jeecgboot-vue3的Flowable流程-流程处理(二)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 对应VForm3&#xff0c;原先的后端解析也要做调整 1、获取历史任务的表单信息 // 获取历史任务节点表单数据值List<HistoricVariableInstance> listHistoricVariableInstance his…

API工具--Apifox和Postman对比(区别)

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Web端在线/离线Stomp服务测试与WebSocket服务测试

Stomp服务测试 支持连接、发送、订阅、接收&#xff0c;可设置请求头、自动重连 低配置云服务器&#xff0c;首次加载速度较慢&#xff0c;请耐心等候 预览页面&#xff1a;http://www.daelui.com/#/tigerlair/saas/preview/lxbho9lkzvgc 演练页面&#xff1a;http://www.da…

Linux_应用篇(17) FrameBuffer 应用编程

本章学习 Linux 下的 Framebuffer 应用编程&#xff0c; 通过对本章内容的学习&#xff0c; 大家将会了解到 Framebuffer 设备究竟是什么&#xff1f;以及如何编写应用程序来操控 FrameBuffer 设备。 本章将会讨论如下主题。 ⚫ 什么是 Framebuffer 设备&#xff1f; ⚫ LCD 显…

vscode 连接 GitHub

文章目录 连接 GitHub一、通过 SSH 连接 github二、通过 HTTPS 连接 github 连接 GitHub 在 vscode 中首次使用 git push 命令时会要求输入 github 账户的 username 和 password&#xff0c;这种基本身份验证在 2021.8.13 以前还是可以的&#xff0c;之后的话&#xff0c;就会…

【太原理工大学】软件安全技术—书本重点梳理、带背

收回我上一篇的话&#xff0c;这科挂人还是挺狠的&#xff0c;去年好像挂了四十号人 ( 老师没有划重点&#xff0c;这篇是我自己根据之前的博主的和课本总结的一些重点&#xff0c;本篇为理解性带背。(&#xff61; _ &#xff61;) ### 第一章&#xff1a;软件安全基础 - **零…

大厂Java面试题:MyBatis是中如何将结果集映射到Java持久化对象?都有哪些方式?有什么区别?

大家好&#xff0c;我是王有志。今天给大家带来的是一道来自京东的 MyBatis 面试题&#xff1a;MyBatis是中如何将结果集映射到Java持久化对象&#xff1f;都有哪些方式&#xff1f;有什么区别&#xff1f; MyBatis 提供了两种实现结果集到 Java 持久化对象的映射方式&#xf…

springbot 界面美观的超市收银管理系统。

springbot 界面美观的超市收银管理系统。 功能&#xff1a;登录&#xff0c;用户管理&#xff0c;权限菜单管理&#xff0c;首页订单&#xff0c;收入&#xff0c;用户统计&#xff0c; 收银台&#xff0c;销售账单&#xff0c;库存管理&#xff0c;商品分类&#xff0c;供应…

一张图读懂天然气气源

一张图读懂天然气气源

Dev-C++安装及使用

起因&#xff1a;我写的游戏都是用DEV-C 写的&#xff1b; Dev的介绍&#xff1a; Dev-C&#xff08;或者叫做 Dev-Cpp&#xff09;是 Windows 环境下的一个轻量级 C/C 集成开发环境&#xff08;IDE&#xff09;。非常适合于C/C语言初学者使用。 它是一款自由软件&#xff0c;…

npm login 或者 npm adduser 之后 遇见 Public registration is not allowed

npm login 或者 npm adduser 之后 遇见 Public registration is not allowed 其实是因为npm镜像地址有问题 使用下方指令 将镜像切回即可正确完成登录操作 npm config set registry https://registry.npmjs.org/ 今天就总结到这里啦&#xff01; 后续会不定时更新哦&#xff…

Linux Debian12使用podman安装xss-labs靶场环境

一、xss-labs简介 xss-labs靶场是一个专门用于学习和练习跨站脚本攻击&#xff08;XSS&#xff09;技术的在线平台。它提供了一系列的实验场景和演示&#xff0c;帮助安全研究人员、开发人员和安全爱好者深入了解XSS攻击的原理和防御方法。 二、安装podman环境 Linux Debian…

计算机msvcp100.dll丢失怎么办,分享5种亲测有效的解决方法

电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们常常会遇到一些问题&#xff0c;其中之一就是电脑提示缺失msvcp100.dll。这个问题可能会让我们感到困惑和烦恼&#xff0c;但是只要我们了解其原因并采取相应的解决方法&#xff0…

FPGA+金融|硬件行情加速系统 打造极速交易场景

会议时间&#xff1a;2024年06月20日&#xff08;周四&#xff09;下午13:50 FPGA金融|硬件行情加速系统 打造极速交易场景_中科亿海微_芯有灵犀 智创未来

6.12ctf练习

[西湖论剑 2022]Node Magical Login 源码在这里&#xff1a;GitHub - CTF-Archives/2022-xhlj-web-node_magical_login: A web challenge in 2022 西湖论剑大赛打开 打开环境是个登录框&#xff0c;先进行了扫描和抓包都没有看见什么有价值的东西&#xff0c;看源码 大致连接…

因数与倍数 初级题目

最近又来更题了。这一次是《第三单元 因数与倍数第一部分》的初级题目。 参考答案见文尾 参考答案&#xff1a; CBDAABCBBACCCCCBCDCC

Airtest 使用指南

Airtest 介绍 准备工作 AirtestIDE 安装与启动: https://airtest.doc.io.netease.com/IDEdocs/getting_started/AirtestIDE_install/ 电脑端的准备工作完成后,对于手机端只需要打开允许USB调试,当首次运行时会提示安装PocoService,同意即可。 界面介绍

仲恺ZK——信计专业《软件体系结构》24年试卷回忆

以下是我在总结的复习内容&#xff0c;有需要可以参考借鉴一下。我的主页还有另外一篇复习总结《仲恺ZK——信计专业《软件体系结构》&#xff0c;两者结合起来复习&#xff0c;帮助你轻松过考试&#x1f60a;。总的来说&#xff0c;考试不会太难&#xff0c;只要你了解了各类设…

2024 Java 异常—面试常见问题

目录 一、异常的分类 二、throw和throws都是异常处理的关键字&#xff0c;二者区别。 三、try-catch-finally 中&#xff0c;如果 catch 中 return 了&#xff0c;finally 还会执行吗&#xff1f; 四、try-catch-finally 中哪个部分可以省略&#xff1f; 五、常见的 Runti…

如何基于Nginx配置代理服务器实现邮件告警

当代企业信息化系统建设中&#xff0c;将内网与公网进行隔离是一种非常常见的措施&#xff0c;它可以有效保护企业内部数据不被外泄&#xff0c;有助于企业构建一个更加安全的网络环境&#xff0c;保护企业资产和用户隐私。但另一方面&#xff0c;内网与公网隔离也会带来一些问…