【顺序表】

news2025/1/18 16:50:39

顺序表和链表

  • 顺序表
    • 1. 函数声明部分
    • 2. 函数的实现部分
      • (1)初始化
      • (2)尾插
      • (3)头插
      • (4)尾删
      • (5)头删
      • (6)在pos位置插入x
      • (7)删除pos位置的元素
      • (8)修改数据
      • (9)查找
      • (10)打印
      • (11)归还空间
    • 3. 测试部分

顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存
储。在数组上完成数据的增删查改。

下面我们实现动态顺序表:

1. 函数声明部分

下面是顺序表结构体的定义和一些增删查改函数的声明;

		#pragma once
		#include <stdio.h>
		#include <stdlib.h>
		#include <assert.h>
		
		//将顺序表中的指针类型起别名
		typedef int SLDataType;
		
		//创建一个结构体顺序表,存放顺序表的头指针,顺序表的长度,顺序表的容量
		typedef struct SeqList
		{
			SLDataType *a;
			int size;
			int capacity;
		}SL;
		
		//初始化
		void SLInit(SL* psl);
		
		//尾插和头插
		void SLPushBack(SL* psl, SLDataType x);
		void SLPushFront(SL* psl, SLDataType x);
		
		//尾删和头删
		void SLPopBack(SL* psl);
		void SLPopFront(SL* psl);
		
		//在pos位置插入x
		void SLInsert(SL* psl, size_t pos, SLDataType x);
		
		//删除pos位置的元素
		void SLErase(SL* psl, size_t pos);
		
		//修改数据
		void SLModify(SL* psl, size_t pos ,SLDataType x);
		
		//查找,找到返回下标,找不到返回-1
		int SLFind(SL* psl, SLDataType x);
		
		//打印
		void SLPrint(SL* psl);
		
		//归还空间
		void SLDestroy(SL* psl);

2. 函数的实现部分

由于一些头插,尾插等函数需要判断容量的大小,所以我们将检查容量的函数放到外面;若当前长度等于容量,即满了,用realloc开辟成原来两倍的空间;

		//检查容量是否已满
		void CheakCapacity(SL* psl)
		{
			assert(psl);
		
			if (psl->size == psl->capacity)
			{
				SLDataType* tmp = (SLDataType*)realloc(psl->a, sizeof(SLDataType) * psl->capacity * 2);
				assert(tmp);
		
				psl->a = tmp;
				psl->capacity *= 2;
			}
		}

(1)初始化

先为顺序表开辟4个大小的空间,当前容量为4,当前长度为0;

		void SLInit(SL* psl)
		{
			assert(psl);
		
			psl->a = (SLDataType*)malloc(sizeof(SLDataType) * 4);
			assert(psl->a);
		
			psl->capacity = 4;
			psl->size = 0;
		}

(2)尾插

		void SLPushBack(SL* psl, SLDataType x)
		{
			assert(psl);
		
			CheakCapacity(psl);
		
			psl->a[psl->size++] = x;
		}

(3)头插

		void SLPushFront(SL* psl, SLDataType x)
		{
			assert(psl);
		
			CheakCapacity(psl);
		
			int i = psl->size - 1;
			for (i = psl->size - 1; i >= 0; i--)
			{
				psl->a[i + 1] = psl->a[i];
			}
		
			psl->a[i+1] = x;
			psl->size++;
		}

(4)尾删

		void SLPopBack(SL* psl)
		{
			assert(psl);
		
			assert(psl->size > 0);
		
			psl->size--;
		}

(5)头删

		void SLPopFront(SL* psl)
		{
			assert(psl);
		
			assert(psl->size > 0);
			for (int i = 1; i < psl->size; i++)
			{
				psl->a[i - 1] = psl->a[i];
			}
			psl->size--;
		}

(6)在pos位置插入x

		void SLInsert(SL* psl, size_t pos, SLDataType x)
		{
			assert(psl);
			assert(pos >= 0 && pos <= psl->size);
			CheakCapacity(psl);
		
			SLDataType right = psl->size - 1;
			SLDataType left = pos;
		
			while (left <= right)
			{
				psl->a[right + 1] = psl->a[right];
				right--;
			}
			psl->a[left] = x;
			psl->size++;
		}

(7)删除pos位置的元素

		void SLErase(SL* psl, size_t pos)
		{
			assert(psl);
			assert(pos >= 0 && pos < psl->size);
		
			while (pos < psl->size - 1)
			{
				psl->a[pos] = psl->a[pos + 1];
				pos++;
			}
			psl->size--;
		}

(8)修改数据

		void SLModify(SL* psl, size_t pos, SLDataType x)
		{
			assert(psl);
		
			psl->a[pos] = x;
		}

(9)查找

找到返回下标,找不到返回-1

		int SLFind(SL* psl, SLDataType x)
		{
			assert(psl);
			for (int i = 0; i < psl->size; i++)
			{
				if (psl->a[i] == x)
				{
					return i;
				}
			}
			return -1;
		}

(10)打印

		void SLPrint(SL* psl)
		{
			assert(psl);
			for (int i = 0; i < psl->size; i++)
			{
				printf("%d ", psl->a[i]);
			}
		}

(11)归还空间

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

3. 测试部分

		int main()
		{
			SL s;
			
			SLInit(&s);
		
			SLPushBack(&s, 1);
			SLPushBack(&s, 2);
			SLPushBack(&s, 3);
		
			SLPushFront(&s, 10);
		
			SLPopFront(&s);
		
			SLPopBack(&s);
		
		
			SLInsert(&s, 1, 10);
		
		
			SLErase(&s, 1);
		
			SLModify(&s, 1, 100);
		
			SLPrint(&s);
		
			printf("\n");
			int ret = SLFind(&s, 100);
			if (ret != -1)
			{
				printf("找到了,下标为:%d\n", ret);
			}
			else
			{
				printf("找不到\n");
			}
			
			SLDestroy(&s);
			return 0;
		}

以上代码的结果:

在这里插入图片描述

通过上面的实现我们可以看出,顺序表还是有缺陷的:

  1. 中间/头部的插入删除,时间复杂度为O(N)
  2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。
    例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

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

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

相关文章

【Python实战】入门级都能学懂的Python爬虫之仅需8行代码一键免费下载音乐,听歌自由真这么简单?

前言 据说互联网上 50%以上的流量都是爬虫创造的&#xff0c;也许你看到很多热门数据都是爬虫所创造的&#xff0c; 所以可以说无爬虫就无互联网的繁荣。 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即…

C语言的深度解析

C语言的深度解析 C语言概述C语言内存管理C语言标准库 C语言概述 C是一种通用的、过程式编程编程语言&#xff0c;支持结构化编程、词法作用域和递归&#xff0c;使用静态类型系统&#xff0c;并且广发用于系统软件与应用软件的开发。 C语言具有高效、灵活、功能丰富、表达力强…

EMQX vs NanoMQ | 2023 MQTT Broker 对比

引言 EMQX 和 NanoMQ 都是由全球领先的开源物联网数据基础设施软件供应商 EMQ 开发的开源 MQTT Broker。 EMQX 是一个高度可扩展的大规模分布式 MQTT Broker&#xff0c;能够将百万级的物联网设备连接到云端。NanoMQ 则是专为物联网边缘场景设计的轻量级 Broker。 本文中我们…

基于MATLAB语音信号的数字滤波

MATLAB语音信号的数字滤波 一、实验目的 掌握使用 FFT 进行信号谱分析的方法设计数字滤波器对指定的语音信号进行滤波处理 二、实验内容 导入音频信号&#xff0c;并绘制出时域波形和频域波形&#xff1a; 可以看到&#xff0c;频谱上有很多额外的噪音频率&#xff0c;在…

智加科技与舍弗勒签订商用车先进转向系统量产合作协议,将率先量产行业首个正向开发的智能重卡冗余转向

自动驾驶已经成为当前汽车行业的重要发展趋势之一。在此背景下&#xff0c;在2023上海国际汽车展期间&#xff0c;智加科技与舍弗勒集团签订量产合作协议&#xff0c;双方将在自动驾驶商用车先进转向系统领域展开合作&#xff0c;共同推动重卡自动驾驶的技术应用和创新发展。 图…

用TrackEval评测自己的数据集

TrackEval库虽然很专业&#xff0c;但是设置路径很麻烦&#xff0c;于是我自己基于TrackEval简单写了个对评测自己数据集更友好的&#xff0c;仅限2DMOT数据集&#xff0c;可以评测多类别。 项目地址&#xff08;欢迎star&#xff01;&#xff09;https://github.com/JackWoo0…

第三十天 Maven高级(分模块设计、继承、聚合、私服)

目录 Maven高级 1. 分模块设计与开发 1.1 介绍 1.2实践 1.3 总结 2. 继承与聚合 2.1 继承 2.2 聚合 2.3 继承与聚合对比 3. 私服 3.1 场景 3.2 介绍 3.3 资源上传与下载 Maven高级 Web开发讲解完毕之后&#xff0c;我们再来学习Maven高级。其实在前面的课程当中&am…

camunda如何处理流程待办任务

在 Camunda 中处理流程任务需要使用 Camunda 提供的 API 或者用户界面进行操作。以下是两种常用的处理流程任务的方式&#xff1a; 1、通过 Camunda 任务列表处理任务&#xff1a;在 Camunda 任务列表中&#xff0c;可以看到当前需要处理的任务&#xff0c;点击任务链接&#…

数据库基础篇 《2. MySQL环境搭建》

1. MySQL的卸载 步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止 MySQL8.0 的服务。按键盘上的 “Ctrl Alt Delete” 组合键&#xff0c;打开 “ 任务管理器 ” 对话框&#xff0c;可以在“ 服务 ” 列表找到 “MySQL8.0” 的服务&#xff0c;如果现在 “ 正…

SAP 生产订单自定义订单状态

1、生产订单通常系统有一整套订单状态&#xff0c;做PP的各位同学都应该知道。 CRTD状态 REL已下达 CNF已报工 DLV已入库 TECO技术性完成 等等状态这里就不在罗列了&#xff0c;可以自行在生产订单中看到 2、这篇文章主要是在生产订单系统外&#xff0c;在自定义一套状态。这个…

Win10系统下,蓝牙开关不见了怎么办

自从更新了Win10系统后&#xff0c;不少驱动人生的用户反馈&#xff0c;Win10系统中蓝牙开关突然不见了&#xff0c;无法连接蓝牙设备。驱动人生就为大家带来Win10系统下&#xff0c;蓝牙开关不见的解决方法。 方法一&#xff1a;检查蓝牙设备驱动程序 首先&#xff0c;检查蓝…

手把手教你 YOLOv8 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!

YOLOv8 添加注意力机制 ! 注意力机制介绍 注意力机制(Attention Mechanism)源于对人类视觉的研究。在认知科学中,由于信息处理的瓶颈,人类会选择性地关注所有信息的一部分,同时忽略其他可见的信息。为了合理利用有限的视觉信息处理资源,人类需要选择视觉区域中的特定部…

skyWalking自动建表-逻辑梳理

skyWalking自动建表-逻辑梳理 使用skyWalking后&#xff0c;发现我们不需要创建表&#xff0c;启动skywalking会自动创建表&#xff0c;遂研究官方源码&#xff0c;感觉oap-server设计的自动建表功能很强大&#xff0c;并进行逻辑梳理&#xff0c;仅供参考。 源码地址&#xff…

Guitar Pro8中文版如何下载?有哪些新功能

Guitar Pro是一款专业的吉他制谱软件&#xff0c;现在已更新至Guitar Pro8&#xff0c;新增了支持添加音频轨道、支持嵌套连音符、直观的效果器视图、让指法一目了然的音阶示意图等实用新功能。软件内有多种功能&#xff0c;方便用户使用乐谱&#xff0c;软件界面简洁&#xff…

Vue 模板语法

文章目录 Vue 模板语法插值文本Html属性表达式 指令参数修饰符 用户输入过滤器缩写v-bind 缩写v-on 缩写 Vue 实例构造器属性与方法 Vue 模板语法 Vue.js 使用了基于 HTML 的模版语法&#xff0c;允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。 Vue.js 的核心是一个允…

『OPEN3D』1.7 Ray Casting

1 ray casting ray casting(光线衍射) 和 ray tracing(光线追踪)都属于计算机图形学内的基础方法&#xff1b;用于对三维的实体建模和图片渲染&#xff1b;ray casting一词来自于General Motors Research Labs from 1978–1980&#xff1b;出自论文《Ray Casting for Modeling …

软件测试金融项目经验总结,面试题都问什么?接口加解密如何处理?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 加/解密接口的处理…

JAVA数据结构之顺序表、单向链表及双向链表的设计和API实现

一、顺序表 顺序表在内存中是数组的形式存储 类名SequenceList构造方法SequenceList(int capacity)&#xff1a;创建容量为capacity的SequenceList对象成员方法1. public void clear()&#xff1a;空置线性表 2. public boolean isEmpty()&#xff1a;判断线性表是否为空&…

浅谈java网络编程及RPC框架

目录 1.计算机网络 2.TCP/IP协议 3.UDP协议 4.RPC框架 1.计算机网络 从资源共享的角度上来说&#xff0c;计算机网络就是以能够相互共享资源的方式互连起来的自治计算机系统的集合。网络建立的主要目的是实现计算机资源的共享。 目前来说&#xff0c;计算机网络分为两大模…

JRE和JDK 及 常用DOS命令

JRE和JDK Java程序开发的三个步骤 ●编写代码 ●编译代码 ●运行代码 1.编写代码 A.txt JRE : JRE是Java Runtime Environment缩写&#xff0c;指Java运行环境&#xff0c;包含JVM虚拟机及Java核心类库。 类&#xff1a;java文件在代码中的集合体现( 类java文件&#xf…