解析顺序表【数据结构】

news2025/1/11 19:27:55

1.线性表

线性表(linear list)是n个具有相同特性的数据元素的有线序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就是说是连续的一条线。但是在物理结构上并不一定是连续的,比如链表。
线性表在物理上存储时,通常以数组和链式结构的形式存储。

2.顺序表

顺序表

2.1 概念及结构

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可以分为静态顺序表和动态顺序表
静态顺序表
使用定长数组存储元素。

#define MAX 7
typedef int Datatype;//为了适用不同类型的顺序表
typedef struct SeqList
{
	Daratype a[MAX];
	int sz;//有效数据个数
}SL;

静态顺序表

动态顺序表
使用动态开辟的数组存储

typedef int Datatype;//为了适用不同类型的顺序表
typedef struct SeqList
{
	Daratype* a;
	int sz;//有效数据个数
	int capacity;//存储空间大小
}SL;

动态顺序表

3.模拟实现

静态顺序表只适合于确定知道要存储多少数据的场景下。在储存空间不确定的场景下,对于静态顺序表当MAX开大了就会造成浪费,当MAX开小了又不够。所以在实际的场景中基本都是使用动态顺序表,根据需要动态分配空间大小。
下面是模拟实现:

3.1 准备工作

定义一个结构体

typedef int Datatype;//为了适用不同类型的顺序表
typedef struct SeqList
{
	Datatype* a;
	int sz;//有效数据个数
	int capacity;//存储空间大小
}SL;

3.2 顺序表的初始化与销毁

对于顺序表的初始化,我的话会先给顺序表开好3个空间的大小.
注意:一定要传地址。

void InitSeqlist(SL* ps)
{
	ps->a = (Datatype*)malloc(sizeof(Datatype)*3);
	if(ps->a == NULL)//扩容失败,直接退出程序
	{
		perror("InitSeqlist");
		exit(-1);
	}
	ps->sz = 0;
	ps->capacity = 3;
}

销毁
销毁我们直接free就可以了,任何其他值赋0.

void DestorySeqlist(SL* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->sz = 0;
	ps->capacity = 0;	
}

3.3 顺序表的尾插

插入前我们一定要先检查一下ps是不是应该空指针。
检查完ps后,对于数据的插入会存在两种情况:
1.顺序表已满,需要扩容
2.顺序表未,满直接插入
因为后面的头插与在特定位置的数据插入都会用到检查顺序是否已满,满就扩容的功能,那么我们可以封装成应该函数。

void SeqlistCapacity(SL* ps)
{
	if(ps->capacity == ps->sz)//满了
	{
		Datatype* tmp = (Datatype*)realloc(ps->a, sizeof(Datatype) * 2*ps->capacity);
		if(tmp == NULL)//开辟失败
		{
			perror("realloc");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity *= 2;
	}
}



void PushBack(SL* ps,Datatype x)
{
	assert(ps);
	//检查空间是否已满
	SeqlistCapacity(ps);
	ps->a[ps->sz] = x;
	ps->sz+=1;
}

3.4 顺序表的尾删

删除前我们一定要先检查一下ps是不是应该空指针。
同时还要删除该顺序表中的数据也又两种情况:
1.顺序表中的数据已经删完了,无法再删。
2.顺序表中的数据足够删除。直接删

void PopBack(SL* ps)
{
	assert(ps);
	if(ps->sz>0)
	{
		ps->sz-=1;
	}
}

3.5顺序表的打印

void PrintSeqlist(SL* ps)
{
	for (int i = 0; i < ps->sz; ++i)
	{
		printf("%d ", ps->a[i]);
	}
}

3.6 顺序表的头插

void PushFront(SL* ps,Datatype x)
{
	assert(ps);
	SeqlistCapacity(ps);
	for(int i = ps->sz;i>=1;--i)
	{
		ps->a[i] = ps->a[i-1];
	}
	ps->a[0] = x;
	ps->sz += 1;
}

3.7 顺序表的头删

void PopFront(SL* ps)
{
	assert(ps);
	assert(ps->sz!=0);
	for(int i = 0;i<ps->sz-1;++i)
	{
		ps->a[i] = ps->a[i+1];
	}
	ps->sz -= 1; 
}

3.8 顺序表查找

int FindSeqlist(SL* ps,Datatype x)
{
	assert(ps);
	for(int i = 0;i<ps->sz;++i)
	{
		if(ps->a[i] == x)
			return i;
	}
	return -1;//没找到
}

3.9 顺序表在pos位置插入x

void InsertSeqlist(SL* ps,int pos,Datatype x)
{
	assert(ps);
	SeqlistCapacity(ps);
	for(int i = ps->sz;i>=pos+1;--i)
	{
		ps->a[i] = ps->a[i-1];
	}
	ps->a[pos] = x;	
	ps->sz+=1;
}

3.10 顺序表删除pos位置的值

void EraseSeqlist(SL* ps,int pos)
{
	assert(ps);
	assert(ps->sz!=0);
	for(int i = pos;i<ps->sz-1;++i)
	{
		ps->a[i] = ps->a[i+1];
	}
	ps->sz -= 1;
}

4.代码整合

//seqlist.h
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int Datatype;//为了适用不同类型的顺序表
typedef struct SeqList
{
	Datatype* a;
	int sz;//有效数据个数
	int capacity;//存储空间大小
}SL;


void InitSeqlist(SL* ps);

void DestorySeqlist(SL* ps);

void SeqlistCapacity(SL* ps);

void PopBack(SL* ps);

void PrintSeqlist(SL* ps);

void PushFront(SL* ps, Datatype x);

void PopFront(SL* ps);

int FindSeqlist(SL* ps, Datatype x);

void InsertSeqlist(SL* ps, int pos, Datatype x);

void EraseSeqlist(SL* ps, int pos);

void PushBack(SL* ps, Datatype x);
//seqlist.c
#include "seqlist.h"

void InitSeqlist(SL* ps)
{
	ps->a = (Datatype*)malloc(sizeof(Datatype) * 3);
	if (ps->a == NULL)//扩容失败,直接退出程序
	{
		perror("InitSeqlist");
		exit(-1);
	}
	ps->sz = 0;
	ps->capacity = 3;
}

void DestorySeqlist(SL* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->sz = 0;
	ps->capacity = 0;
}

void PushBack(SL* ps, Datatype x)
{
	assert(ps);
	//检查空间是否已满
	SeqlistCapacity(ps);
	ps->a[ps->sz] = x;
	ps->sz += 1;
}

void SeqlistCapacity(SL* ps)
{
	if (ps->capacity == ps->sz)//满了
	{
		Datatype* tmp = (Datatype*)realloc(ps->a, sizeof(Datatype) * 2*ps->capacity);
		if (tmp == NULL)//开辟失败
		{
			perror("realloc");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity *= 2;
	}
}

void PopBack(SL* ps)
{
	assert(ps);
	if (ps->sz > 0)
	{
		ps->sz -= 1;
	}
}


void PrintSeqlist(SL* ps)
{
	for (int i = 0; i < ps->sz; ++i)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

void PushFront(SL* ps, Datatype x)
{
	assert(ps);
	SeqlistCapacity(ps);
	for (int i = ps->sz; i >= 1; --i)
	{
		ps->a[i] = ps->a[i - 1];
	}
	ps->a[0] = x;
	ps->sz += 1;
}

void PopFront(SL* ps)
{
	assert(ps);
	assert(ps->sz != 0);
	for (int i = 0; i < ps->sz - 1; ++i)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->sz -= 1;
}

int FindSeqlist(SL* ps, Datatype x)
{
	assert(ps);
	for (int i = 0; i < ps->sz; ++i)
	{
		if (ps->a[i] == x)
			return i;
	}
	return -1;//没找到
}

void InsertSeqlist(SL* ps, int pos, Datatype x)
{
	assert(ps);
	SeqlistCapacity(ps);
	for (int i = ps->sz; i >= pos + 1; --i)
	{
		ps->a[i] = ps->a[i - 1];
	}
	ps->a[pos] = x;
	ps->sz += 1;
}

void EraseSeqlist(SL* ps, int pos)
{
	assert(ps);
	assert(ps->sz != 0);
	for (int i = pos; i < ps->sz - 1; ++i)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->sz -= 1;
}

//test.c
#include "seqlist.h"

int main()
{
	//测试
	/*SL sl;
	InitSeqlist(&sl);
	PushBack(&sl, 1);
	PushBack(&sl, 2);
	PushBack(&sl, 3);
	PushBack(&sl, 4);
	PushBack(&sl, 5);
	PushBack(&sl, 6);
	PrintSeqlist(&sl);

	PopBack(&sl);
	PopBack(&sl);
	PopBack(&sl);
	PopBack(&sl);
	PrintSeqlist(&sl);
	PopBack(&sl);
	PopBack(&sl);
	PopBack(&sl);
	PrintSeqlist(&sl);

	PushBack(&sl, 1);
	PushBack(&sl, 2);
	PushBack(&sl, 3);
	PushBack(&sl, 4);
	PushBack(&sl, 5);
	PushBack(&sl, 6);
	PushFront(&sl, 100);
	PushFront(&sl, 200);
	PrintSeqlist(&sl);
	InsertSeqlist(&sl, 0, 1000);
	PrintSeqlist(&sl);

	int pos = FindSeqlist(&sl, 100);
	PopFront(&sl);
	PopFront(&sl);
	PopFront(&sl);

	PopFront(&sl);
	PrintSeqlist(&sl);*/

	//printf("%d", pos);
	return 0;
}

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

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

相关文章

HTML 字符集详解及示例

文章目录 摘要引言从ASCII到UTF-8的演变ASCII 字符集ANSI字符集ISO-8859-1字符集UTF-8字符集 示例代码运行Demo小结表格总结未来展望参考资料 摘要 本文介绍了HTML中的字符集演变历史&#xff0c;从最初的ASCII到现代的UTF-8&#xff0c;并提供了设置字符集的示例代码。文中涵…

图形编辑器基于Paper.js教程10:导入导出svg,导入导出json数据

深入了解Paper.js&#xff1a;实现SVG和JSON的导入导出功能 Paper.js是一款强大的矢量绘图JavaScript库&#xff0c;非常适合用于复杂的图形处理和交互式网页应用。本文将详细介绍如何在Paper.js项目中实现SVG和JSON格式的导入导出功能&#xff0c;这对于开发动态图形编辑器等…

git reset --soft(回退commit,保留add)

参考博客&#xff1a;git reset --soft命令的使用-CSDN博客感觉博客中举的例子不是很好。读者自行判断。举的例子的场景适合使用revert&#xff0c;撤销就行了。另外建议看下边这篇博客&#xff0c;这篇详细介绍了reset和revert&#xff0c;带图。但是要注意这个reset是hard的&…

mysql 内存一直增长(memory/sql/thd::main_mem_root)

mysql版本 8.0.14 发现过程 查询总内存 SELECT t.EVENT_NAME, t.CURRENT_NUMBER_OF_BYTES_USED FROM performance_schema.memory_summary_global_by_event_name t ORDER BY t.CURRENT_NUMBER_OF_BYTES_USED DESC;前&#xff1a; memory/sql/thd::main_mem_root 1…

第十五天啦 2024.8.1 (Spring框架)

1.从宏观上看spring框架和springboot Spring框架解决了企业级的开发的复杂性&#xff0c;它是一个容器框架&#xff0c;用于装java对象&#xff08;Bean&#xff09;&#xff0c;使程序间的依赖关系交由容器统一管理&#xff0c;松耦合&#xff0c;提高了可测试性和维护效率&a…

网络原理的TCP/IP

TCP/IP协议 1)应用层 应用层和应用程序直接相关,与程序员息息相关的一层协议,应用层协议,里面描述的内容,就是写的程序,通过网络具体按照啥样的方式来进行传输,不同的应用程序,就可以用不同的应用层协议,在实际开发的过程中,需要程序员自制应用层协议 应用层协议本质上就是对…

主题巴巴WordPress主题合辑打包下载+主题巴巴SEO插件

主题巴巴WordPress主题合辑打包下载&#xff0c;包含博客一号、博客二号、博客X、门户一号、门户手机版、图片一号、杂志一号、自媒体一号、自媒体二号和主题巴巴SEO插件。

5行代码快速Git配置ssh

0 流程步骤 检查本地主机是否已经存在ssh key生成ssh key获取ssh key公钥内容&#xff08;id_rsa.pub&#xff09;复制该内容&#xff0c;到Github账号上添加公钥&#xff0c;进入Settings设置验证是否设置成功 1 代码 # 1.检查本地主机是否已经存在ssh key cd ~/.ssh ls # …

Notepad++ 安装 compare 插件

文章目录 文章介绍对比效果安装过程参考链接 文章介绍 compare 插件用于对比文本差异 对比效果 安装过程 搜索compare插件 参考链接 添加链接描述

权威认可!聚铭网络再度入选中国信通院《中国数据库产业图谱(2024年)》

7月16日&#xff0c;由中国信息通信研究院、中国通信标准化协会指导&#xff0c;中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;、InfoQ联合主办的“2024可信数据库发展大会”在京召开。会上&#xff0c;正式发布《中国数据库产业图谱&#xf…

《电子技术》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《电子技术》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《电子技术》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;上海科学技术协会 主办单位&#xff1a;上海…

基于N32L406+FlashDB(键值数据库 时序数据库)+mdk5 移植教程

这里首先感谢作者的开源&#xff1a; FlashDB: 一款支持 KV 数据和时序数据的超轻量级数据库 (gitee.com) 1.FlashDB简介 一款超轻量级的嵌入式数据库&#xff0c;专注于提供嵌入式产品的数据存储方案。FlashDB 不仅支持传统的基于文件系统的数据库模式&#xff0c;而且结合了…

【YOLOv8】一文全解+亮点介绍+训练教程+独家魔改优化技巧

前言 Hello&#xff0c;大家好&#xff0c;我是cv君&#xff0c;最近开始在空闲之余&#xff0c;经常更新文章啦&#xff01;除目标检测、分类、分隔、姿态估计等任务外&#xff0c;还会涵盖图像增强领域&#xff0c;如超分辨率、画质增强、降噪、夜视增强、去雾去雨、ISP、海…

o(∩_∩)o设置代理访问博客(五)o(∩_∩)o --使用BeeWare打包应用

背景&#xff1a; 最近了解了一个新的打包框架BeeWare&#xff0c;据说他支持的平台要比nuitka更多。利用之前访问博客的脚本&#xff0c;来尝试一下打包windows应用程序。 BeeWare 从零开始 环境&#xff1a;python -m pip install briefcase 使用pycharm新建了一个名为bee…

【HTML入门】第二十一课 - 【实战】做一个简单的数据表格

这一小节&#xff0c;我们继续练习纯HTML&#xff0c;开发一个简单的数据表格吧。就像这样&#xff1a; 目录 1 设计需求分析 2 用到的标签 3 实战代码 1 设计需求分析 做之前&#xff0c;我们仍然是分析一下这张图&#xff0c;以便更好的更快的开发出来。 分2个大部分第一个…

掌控板(为Python编程学习而生)文章目录+入门教程 简介

前言 文章目录 掌控入门系列教程目录 【Mind】掌控板入门教程01 “秀”出我创意 【Mind】掌控板入门教程02 趣味相框 【Mind】掌控板入门教程03 节日的祝福【Mind】掌控板入门教程04 迷你动画片【Mind】掌控板入门教程05 心情灯【Mind】掌控板入门教程06 多彩呼吸灯【Mind】掌…

word预览方式---iframe,Microsoft Office Online、xDoc、Google Docs

提示&#xff1a;word预览方式—iframe 文章目录 [TOC](文章目录) 前言一、Microsoft Office Online二、xDoc三、Google Docs四、预览组件总结 前言 使用vue/cli脚手架vue create创建 一、Microsoft Office Online https://view.officeapps.live.com/op/view.aspx?src二、xDo…

java的命令执行漏洞揭秘

0x01 前言 在Java中可用于执行系统命令常见的方式有两种&#xff0c;API为&#xff1a;java.lang.Runtime、java.lang.ProcessBuilder 0x02 java.lang.Runtime GetMapping("/runtime/exec")public String CommandExec(String cmd) {Runtime run Runtime.getRunti…

关于#define的使用方法总结

文章目录 #define 预处理指令一、#define宏定义二、查看预处理文件三、#define 的使用方法四、C语言宏中“#”和“##”的用法五、常见的宏定义总结六、常考题目 #define 预处理指令 #define 是 C 和 C 编程语言中的预处理指令&#xff0c;用于定义宏&#xff08;macro&#xf…

JVM系列 | 对象的消亡——HotSpot的设计细节

HotSpot 的细节实现 文章目录 HotSpot 的细节实现OopMap 与 根节点枚举根节点类型及说明HotSpot中的实现 OopMap 与 安全点安全点介绍如何保证程序在安全点上&#xff1f; 安全区域记忆集与卡表记忆集卡表 写屏障并发的可达性分析&#xff08;与用户线程&#xff09;并发可达性…