顺序表及其代码实现

news2024/11/27 22:41:35

目录

  • 前言
  • 1.顺序表
    • 1.1 顺序表介绍
    • 1.2 顺序表基本操作代码实现
  • 总结

前言

顺序表一般不会用来单独存储数据,但自身的优势,很多时候不得不使用顺序表。

1.顺序表

1.1 顺序表介绍

顺序表是物理结构连续的线性表,支持随机存取(底层是数组),存储密度大(只需存储数据元素,与链表相比,无需存储额外的指针)。缺点是,由于物理结构的连续,插入、删除要移动大量元素,时间复杂度为O(n),效率低下。
顺序表的组成如下,顺序表分为静态顺序表与动态顺序表。静态顺序表申请内存后不能更改,存在的问题是由于不确定需要的内存大小,如果开辟的内存块比较小,不够用;开辟过大,造成浪费。
动态顺序表可以在内存不够的时候调整顺序表的大小,注意,每次增加开辟的内存空间可以是原来内存的1~2倍,如果每次增加一个元素都要调整空间大小,效率太低。
在这里插入图片描述

1.2 顺序表基本操作代码实现

SeqList.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

//静态顺序表
//typedef int SLDataType;
//#define N 100000
//
//struct SeqList
//{
//	SLDataType a[N];
//	int size;
//};

//动态顺序表
typedef int SLDataType;
#define INIT_CAPACITY 4
typedef struct SeqList
{
	SLDataType* a;
	int size;
	int capacity;
}SL;

//增删查改
void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLPrint(SL* ps);
void SLPrint(SL* ps);
void SLPushBack(SL* ps, SLDataType x);
void SLPopBack(SL* ps);

void SLPushFront(SL* ps, SLDataType x);
void SLPopFront(SL* ps);
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
void SLCheckCapacity(SL* ps);
int SLFind(SL* ps,SLDataType x);

SeqList.c

#include "SeqList.h"
void SLInit(SL* ps)
{
	assert(ps);
	ps->a = (SLDataType*)malloc(sizeof(SLDataType) * INIT_CAPACITY);
	if (ps->a == NULL)
	{
		perror("malloc failed");
		return;
	}
	ps->size = 0;
	ps->capacity = INIT_CAPACITY;
}
void SLDestroy(SL* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->size = 0;
}
void SLPrint(SL* ps)
{
	assert(ps);
	for (int i = 0; i < ps->size; i++)
		printf("%d ", ps->a[i]);
	printf("\n");
}
void SLPushBack(SL* ps, SLDataType x)
{
	/*SLCheckCapacity(ps);
	ps->a[ps->size++] = x;*/
	SLInsert(ps, ps->size, x);
}
void SLPopBack(SL* ps)
{
	//assert(ps);
	//assert(ps->size > 0);
	//if (ps->size == 0)
		//return;
	ps->a[--ps->size] = 0;
	//ps->size--;
	SLErase(ps, ps->size - 1);
}
void SLCheckCapacity(SL* ps)
{
	assert(ps);
	if (ps->size == ps->capacity)
	{
		SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDataType));
		if (tmp == NULL)
		{
			perror("realloc failed");
			return;
		}
		ps->a = tmp;
		ps->capacity *= 2;
	}
}
void SLPushFront(SL* ps, SLDataType x)
{
	/*SLCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[0] = x;
	ps->size++;*/
	SLInsert(ps, 0, x);
}
void SLPopFront(SL* ps)
{
	/*assert(ps);
	assert(ps->size > 0);
	int begin = 1;
	while (begin < ps->size)
		ps->a[begin - 1] = ps->a[begin++];
	ps->size--;*/
	SLErase(ps, 0);
}
void SLInsert(SL* ps, int pos, SLDataType x)
{
	assert(pos >= 0 && pos <= ps->size);
	SLCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
		ps->a[end + 1] = ps->a[end--];
	ps->a[pos] = x;
	ps->size++;
}
void SLErase(SL* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	int begin = pos + 1;
	while (begin<ps->size)
		ps->a[begin-1] = ps->a[begin++];
	ps->size--;
}
int SLFind(SL* ps, SLDataType x)
{
	assert(ps);
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
			return i;
	}
	return -1;
}

Test.c

#include "SeqList.h"
void TestSeqList1()
{
	SL s;
	SLInit(&s);
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushBack(&s, 5);
	SLPushBack(&s, 6);
	SLPushBack(&s, 7);
	SLPushBack(&s, 8);
	SLPushBack(&s, 9);
	SLPrint(&s);

	SLPopBack(&s);
	SLPopBack(&s);
	SLPrint(&s);

	SLPopBack(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPrint(&s);

	SLPopBack(&s);

	SLPushBack(&s, 10);
	SLPushBack(&s, 20);
	SLPrint(&s);

	SLDestroy(&s);
}
void TestSeqList2()
{
	SL s;
	SLInit(&s);
	for (int i = 0; i < 10; i++)
		SLPushFront(&s, i);
	SLPrint(&s);

	SLPopFront(&s);
	SLPopFront(&s);
	SLPrint(&s);

	SLInsert(&s, 2, 40);
	SLPrint(&s);

	SLInsert(&s, 8, 30);
	SLPrint(&s);

	SLErase(&s, 4);
	SLPrint(&s);

	printf("%d\n", SLFind(&s, 40));
}
int main()
{
	TestSeqList2();
	/*void* ptr1 = malloc(5);
	printf("%p\n", ptr1);
	void* ptr2 = malloc(6);
	printf("%p\n", ptr2);*/
	return 0;
}

//顺序表可以结合菜单进行操作,但要保证函数代码实现没有问题,否则在菜单中难以调试
//void menu()
//{
//	printf("****************************************\n");
//	printf("******    1.尾插数据 2.尾删数据   ******\n");
//	printf("******    7.打印数据 0.退出程序   ******\n");
//	printf("****************************************\n");
//}
//int main()
//{
//	SL s;
//	SLInit(&s);
//	int option = -1;
//	while (option != 0)
//	{
//		menu();
//		scanf("%d", &option);
//		switch (option)
//		{
//		case 1:
//			printf("请依次输入要尾插的数据,以-1结束>:");
//			int x = 0;
//			while (x != -1)
//			{
//				scanf("%d", &x);
//				SLPushBack(&s, x);
//			}
//			break;
//		case 7:
//			SLPrint(&s);
//			break;
//		default:
//			break;
//		} 
//	}
//	return 0;
//}

总结

顺序表以及后续链表的学习都是对代码能力的锻炼,学习数据结构都是这个思路,逻辑结构、物理结构即基本操作实现。

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

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

相关文章

Leetcode—139. 单词拆分【中等】

2024每日刷题&#xff08;173&#xff09; Leetcode—139. 单词拆分 dp实现代码 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {int n s.size();unordered_set<string> ust(wordDict.begin(), wordDict.end());vector<b…

探索基于基于人工智能进行的漏洞评估的前景

根据2023年的一份报告 网络安全企业据估计&#xff0c;到 10.5 年&#xff0c;网络犯罪每年将给世界造成 2025 万亿美元的损失。每年记录在案的网络犯罪数量都会创下新高。这要求对传统的安全测试流程进行重大改变。这就是漏洞评估发挥作用的地方。 漏洞评估对于识别系统中的弱…

双指针_有效三角形个数三数之和四数之和

有效三角形个数 思路&#xff1a; 我们可以通过暴力枚举&#xff0c;三重for循环来算但&#xff0c;时间复杂度过高。 有没有效率更高的算法呢&#xff1f; 我们知道如果两条较短的边小于最长的一条边&#xff0c;那么就可以构成三角形。 如果这个数组是升序的&#xff0c;两…

负压DC-DC开关电源设计

负压DC-DC开关电源设计 与常见的正压输出BUCK电路对比&#xff0c;区别就在于将 原芯片接GND的网络接到了负压输出。 电感一接sW引脚&#xff0c;另外一接到了OV-GND。 注意几点如下: 芯片耐压选择 EN引脚耐压 输入滤波电容的选择 拓扑结构 BOOST模式&#xff1a;当NMO…

NXP i.MX8系列平台开发讲解 - 4.2.3 摄像头篇(三) - 摄像头MIPI 接口

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 文章目录 关注星号公众号&#xff0c;不容错过精彩 作者&#xff1a;HywelStar 1. 概述 MIPI是Mobile Industry Pr…

论文阅读:InternVL v1.5| How Far Are We to GPT-4V? 通过开源模型缩小与商业多模式模型的差距

论文地址&#xff1a;https://arxiv.org/abs/2404.16821 Demo&#xff1a; https://internvl.opengvlab.com Model&#xff1a;https://huggingface.co/OpenGVLab/InternVL-Chat-V1-5 公开时间&#xff1a;2024年4月29日 InternVL1.5&#xff0c;是一个开源的多模态大型语言模…

【无人机设计与控制】基于matlab的无人机FMCW(频率调制连续波)毫米波高度计雷达仿真

摘要 本文介绍了一种基于FMCW&#xff08;频率调制连续波&#xff09;雷达技术的无人机毫米波高度计的仿真。FMCW雷达通过测量发射信号与回波信号之间的频差来确定目标的距离和速度。在本项目中&#xff0c;我们使用MATLAB仿真无人机毫米波雷达的性能&#xff0c;展示其在不同…

TS1 order set分析

如下图&#xff0c;所示为TS1 order序列。该序列有16个symbol组成。 常见的symbol有&#xff0c;PAD和COM等。PAD是K symbol&#xff0c;还有D symbol。下文先给出COM symbol的解读。读协议文档可知COM常被称为K28.5。K是symbol的类型&#xff0c;注意symbol是编码过的数据。K…

六、Java 基础语法(下)

一、变量 1、变量的定义与使用 变量就是内存中的存储空间&#xff0c;空间中存储着经常发生改变的数据变量定义格式&#xff1a; 数据类型 变量名 数据值使用时根据变量名使用举例如下&#xff0c;上面是代码&#xff0c;下面是输出 2、变量的注意事项 变量名不允许重复…

Dyna-slam复现(保姆级详细图文版,百分百成功)

因最近论文要和这些算法做对比,故配置了一下,在此记录 因为是老的算法,cuda版本现在的显卡都不能使用,所以笔者找的电脑是华硕飞行堡垒17年的电脑,1080的显卡 深度学习及maskrcnn配置 先将dyna-slam git下来,终端执行 git clone https://github.com/BertaBescos/Dyna…

Arduino UNO R3自学笔记21 之 Arduino电机的闭环控制

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;上篇写了电机速度测定&#xff0c;这篇主要是讲测定出的速度用于反馈&#xff0c;使得实际速度快速响应到需要的速度。 1.控制系统介绍 分2大类&#x…

ECML PKDD 2024 | 时空数据(Spatial-Temporal)和时间序列(Time series)论文总结

ECML PKDD 2024于9月9号-9月13号在立陶宛维尔纽斯举行&#xff08;Vilnius&#xff09; 本文总结了ECML PKDD 2024有关时空数据&#xff08;spatial-temporal data&#xff09;的相关论文&#xff0c;主要包含交通预测&#xff0c;预训练&#xff0c;迁移学习等内容&#xff0…

latex本地运行(MiKTeX+VScode)-20241006

1、安装 LaTex 主流的分发版本应该就是 TeXLive 和 MikTeX 了,这里使用 MikTex(只有几百M)—— TeXLive 太大了、默认安装全部包,可选自选部分安装单实在有些许麻烦,MikTeX 则方便得多,需要的时候可以自动安装全部包 点击跳转到 MiKTeX 官网,直接下载即可:不用担心什…

jQuery——事件委托

1、事件委托(委派/代理): 将多个子元素的事件监听委托给父辈元素处理监听回调是加在了父辈元素上当操作任何一个子元素 时&#xff0c;事件会冒泡到父辈元素父辈元素不会直接处理事件&#xff0c;而是根据 event.target 得到发生事件的子元素&#xff0c;通过这个子元素调用事…

微信第三方开放平台接入本地消息事件接口报错问题java.security.InvalidKeyException: Illegal key size

先看报错&#xff1a; java.security.InvalidKeyException: Illegal key sizeat javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039)at javax.crypto.Cipher.implInit(Cipher.java:805)at javax.crypto.Cipher.chooseProvider(Cipher.java:864)at javax.crypto.Cipher.in…

Spring MVC__@RequestMapping注解、获取请求参数、域对象共享数据、视图、Restful

目录 一、RequestMapping注解1、RequestMapping注解的功能2、RequestMapping注解的位置3、RequestMapping注解的value属性4、RequestMapping注解的method属性5、RequestMapping注解的params属性&#xff08;了解&#xff09;6、RequestMapping注解的headers属性&#xff08;了解…

登 Nature 子刊!论文一作详解蛋白质语言模型的小样本学习方法,解决湿实验数据匮乏难题

在「Meet AI4S」系列直播第三期中&#xff0c;我们有幸邀请到了上海交通大学自然科学研究院 & 上海国家应用数学中心博士后周子宜&#xff0c; 他所在的上海交通大学洪亮课题组研究方向主要为 AI 蛋白和药物设计、分子生物物理。该课题组研究成果颇丰&#xff0c;截止目前共…

小程序图片资源等使用阿里服务链接更新问题

同名更换图片&#xff0c;小程序无需发版本更新&#xff0c;存在图片缓存问题解决方法 修改Cache-Control参数即可

一个真实可用的登录界面!

需要工具&#xff1a; MySQL数据库、vscode上的php插件PHP Server等 项目结构&#xff1a; login | --backend | --database.sql |--login.php |--welcome.php |--index.html |--script.js |--style.css 项目开展 index.html&#xff1a; 首先需要一个静态网页&#x…

双十一适合买什么东西?数码好物推荐指南!

​临近双十一&#xff0c;我猜很多朋友已经为双11做好了准备&#xff0c;打算开启买买买的节奏了&#xff01;都想着趁着双十一把平时因为价格太贵舍不得下单的东西彻底拿下&#xff01;作为一名数码博主&#xff0c;每年双11的时候都会疯狂囤很多物品&#xff0c;所以今天就跟…