【零基础学数据结构】顺序表

目录

1.了解数据结构

什么是数据结构? 

为什么要进行数据管理? 

2.顺序表 

顺序表概要解析: 

​编辑顺序表的分类: 

差别和使用优先度: 

1.创建顺序表

1.1顺序表分为静态顺序表和动态顺序表

 1.2顺序表的初始化

 1.3顺序表的销毁

 1.4顺序表的打印

 1.5顺序表的扩容

1.6顺序表的头插,尾插

 1.6.1头插

1.6.2尾插

 1.7顺序表的头删,尾删

 1.7.1头删

1.7.2尾删

 1.8顺序表在指定位置之前插入,删除数据

 1.8.1 插入数据

1.8.2 删除数据

 1.9顺序表数据的查找

 测试代码:


 

1.了解数据结构

什么是数据结构? 

为什么要进行数据管理? 

 

2.顺序表 

顺序表概要解析: 

顺序表的分类: 

  • 静态顺序表
  • 动态顺序表 

差别和使用优先度: 

1.创建顺序表

1.1顺序表分为静态顺序表和动态顺序表


// 设定类型为一个全新名字,方便后续更改
typedef int SLDataType;

// 静态顺序表
 #define N 100
typedef struct SeqList
{
	SLDataType arr[N];//创建数组储存数据
	int size;			//有效数据的数量
}SL;


// 动态顺序表
typedef struct SeqList
{
	SLDataType* arr;//动态的空间,创建指针变量
	int size;		//有效数据的数量
	int capacity;   //空间的大小容量
}SL;

 1.2顺序表的初始化

void SLInit(SL* ps);
// 顺序表的初始化
void SLInit(SL* ps)
{
	ps->arr = NULL;				//将顺序表指针置为NULL
	ps->size = ps->capacity = 0;//将其他数据置为0
}

// 顺序表的销毁
void SLDestroy(SL* ps)
{
	if (ps->arr)   //判断ps->arr是否为NULL,如果不为NULL,说明空间需要释放
	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

 1.3顺序表的销毁

void SLDestroy(SL* ps);
// 顺序表的销毁
void SLDestroy(SL* ps)
{
	if (ps->arr)   //判断ps->arr是否为NULL,如果不为NULL,说明空间需要释放
	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

 1.4顺序表的打印

void SLPrint(SL* ps);
// 顺序表的打印
void SLPrint(SL* ps)
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}

 1.5顺序表的扩容

void SLCheckCapacity(SL* ps);
// 顺序表的扩容
void SLCheckCapacity(SL* ps)
{
	// 判断容量是否够用
	if (ps->capacity == ps->size)
	{
		//执行扩容
		
		//检验原先的容量,如果有在原先容量*2,没有的话就先分配4。
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;

		// 为了防止空间申请失败返回NULL,先用临时变量tmp接收
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));

		//申请失败提前返回
		if (tmp == NULL)
		{
			printf("perror realloc!");
			return;
		}

		//申请成功
		ps->arr = tmp;
		ps->capacity = newCapacity;
	}
}

1.6顺序表的头插,尾插

 1.6.1头插

void SLPushFront(SL* ps, SLDataType x);
//头插
void SLPushFront(SL* ps, SLDataType x)
{
	assert(ps);//断言防止传入空指针

	// 插入之前判断空间容量是否够
	SLCheckCapacity(ps);

	//进行头插
	for (int i = ps->size; i > 0; i--)
	{
		ps->arr[i] = ps->arr[i - 1];//ps->arr[1]=ps->arr[2]
	}
	ps->arr[0] = x;
	ps->size++;
}

 

1.6.2尾插

void SLPushBack(SL* ps, SLDataType x);
void SLPushBack(SL* ps, SLDataType x)
{
	assert(ps);//断言防止传入空指针

	// 插入之前判断空间容量是否够
	SLCheckCapacity(ps);

	//进行尾插
	ps->arr[ps->size++] = x;
}

 

 1.7顺序表的头删,尾删

 1.7.1头删

void SLPopFront(SL* ps);
//头删
void SLPopFront(SL* ps)
{
	assert(ps);//断言防止传入空指针

	//防止顺序表没有数据可以删除
	assert(ps->size);

	//进行头删操作
	for (int i = 0; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];//ps->arr[size-2]=ps->arr[size-1]
	}
	ps->size--;
}

 

1.7.2尾删

void SLPopBack(SL* ps);
//尾删
void SLPopBack(SL* ps)
{
	assert(ps);//断言防止传入空指针

	//防止顺序表没有数据可以删除
	assert(ps->size);

	//进行尾删操作
	ps->size--;
}

 

 1.8顺序表在指定位置之前插入,删除数据

 1.8.1 插入数据

void SLInsert(SL* ps, int pos, SLDataType x);
//在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{
	assert(ps);//断言防止传入空指针

	//判断插入的数据是否合法
	if (pos >= 0 && pos <= ps->size)
	{
		// 插入之前判断空间容量是否够
		SLCheckCapacity(ps);

		//插入数据
		for (int i = ps->size; i > pos; i--)
		{
			ps->arr[i] = ps->arr[i - 1];//ps->arr[pos+1]=ps->arr[pos];
		}
		ps->arr[pos] = x;
		ps->size++;
	}

}

 

1.8.2 删除数据

void SLErase(SL* ps, int pos);
//在指定位置之前删除数据
void SLErase(SL* ps, int pos)
{
	assert(ps);//断言防止传入空指针

	//判断删除的数据是否合法
	if (pos >= 0 && pos < ps->size)
	{
		// 删除数据
		for (int i = pos; i < ps->size - 1; i++)
		{
			ps->arr[i] = ps->arr[i + 1];//ps->[size-2]=ps->arr[size-1]
		}
		ps->size--;
	}
}

 

 1.9顺序表数据的查找

int SLFind(SL* ps, SLDataType x); 
// 1.9顺序表数据的查找
int SLFind(SL* ps, SLDataType x)
{
	assert(ps);//断言防止传入空指针

	//遍历顺序表
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x)
		{
			return i;//返回下标
		}
	}
	// 没有找到
	return -1;//返回一个不存在的下标
}

 测试代码:

#include "SeqList.h"

void SLText01()
{
	SL sl;
	//初始化
	SLInit(&sl);
	
	//打印
	//SLPrint(&sl);
	
	//增删查改
	
	//头插
	//SLPushFront(&sl, 1);
	//SLPushFront(&sl, 2);
	//SLPushFront(&sl, 3);
	//SLPushFront(&sl, 4);
	//SLPrint(&sl);// 4 3 2 1

	//头删
	/*SLPopFront(&sl);
	SLPopFront(&sl);
	SLPopFront(&sl);
	SLPrint(&sl);*/

	//尾插
	//SLPushBack(&sl, 1);
	//SLPushBack(&sl, 2);
	//SLPushBack(&sl, 3);
	//SLPushBack(&sl, 4);
	//SLPrint(&sl);// 1 2 3 4

	//尾删
	//SLPopBack(&sl);
	//SLPopBack(&sl);
	//SLPopBack(&sl);
	//SLPopBack(&sl);
	//SLPrint(&sl);

	在指定位置之前插入数据
	//SLPushFront(&sl, 1);
	//SLPushFront(&sl, 2);
	//SLPushFront(&sl, 3);
	//SLPushFront(&sl, 4);
	//SLPrint(&sl);// 4 3 2 1
	//SLInsert(&sl, 4, 6);
	//SLPrint(&sl);// 4 3 2 6 1

	//在指定位置之前删除数据
	//SLPushFront(&sl, 1);
	//SLPushFront(&sl, 2);
	//SLPushFront(&sl, 3);
	//SLPushFront(&sl, 4);
	//SLPrint(&sl);// 4 3 2 1
	//SLErase(&sl, 2);
	//SLPrint(&sl);// 4 3  1

	// 1.9顺序表数据的查找
	//SLPushFront(&sl, 1);
	//SLPushFront(&sl, 2);
	//SLPushFront(&sl, 3);
	//SLPushFront(&sl, 4);
	//printf("顺序表中有:");
	//SLPrint(&sl);// 4 3 2 1
	//int find = SLFind(&sl, 6);
	//if (find > 0)
	//{
	//	printf("找到了!下标是:%d\n", find);
	//}
	//else
	//{
	//	printf("没有找到!\n");
	//}

	//销毁
	SLDestroy(&sl);

}

int main()
{
	SLText01();
	return 0;
}

 源代码文件:SeqList_2024_4_3 · 14c5b99 · 阳区欠/C语言学习路程 - Gitee.com

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

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

相关文章

【考研数学】打基础,张宇《30讲》还是武忠祥《基础篇》?

如果基础不好&#xff0c;并且已经听过了汤家凤老师的零基础课程&#xff0c;我建议再去听一听张宇30讲 因为张宇30讲讲的要比汤家凤的零基础更加进阶&#xff0c;主要是引导学生思考&#xff0c;主要是讲题比较多。武忠祥老师的课程其实也不错&#xff0c;张宇和武忠祥的主要…

Java入门学习Day04

本篇文章主要介绍了&#xff1a;如何输入数据、字符串拼接、自增自减运算符、类型转换&#xff08;int&#xff0c;double等&#xff09; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 一、键盘输入练习 Scanner是Java中的一个类&#xff0c;用于从控制台或文件中读…

如何搭建自动化测试平台

“自动化测试”有何优势&#xff1f; 具有一致性和重复性的特点&#xff0c;而且测试更客观&#xff0c;提高了软件测试的准确度、精确度和可信任度。 可将任务自动化&#xff0c;能够解放人力去做更重要的工作。 自动化测试只需要部署好相应的场景&#xff0c;如高度复杂的使…

【CKA模拟题】StorageClass实战案例分析

Useful Resources: Storage Classes , Persistent Volumes Claim , Pods 题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetes Create a Storage Class named fast-storage with a provis…

用于无人机小型化设计的高精度温补晶振

用于无人机小型化设计的高精度温补晶振:TG2016SMN和TG2520SMN。无人机的发展可以说是非常的迅速&#xff0c;在安防&#xff0c;农业&#xff0c;交通&#xff0c;电力&#xff0c;直播等领域经常能看到无人机大显身手。无人机的应用场最是非常的广泛&#xff0c;功能更强&…

EVM Layer2 主流解决方案

深度解析主流 EVM Layer 2 解决方案&#xff1a;zk Rollups 和 Optimistic Rollups 随着以太坊网络的不断演进和 DeFi 生态系统的迅速增长&#xff0c;以太坊 Layer 2 解决方案日益受到关注。 其中&#xff0c;zk Rollups 和 Optimistic Rollups 作为两种备受瞩目的主流 EVM&…

【学习】成为优秀的软件测试工程师需要学哪些知识

成为软件测试工程师&#xff0c;需要学习的内容非常的多&#xff0c;但是无非是这几大类&#xff0c;今天就和小编一起来看看这些知识&#xff0c;你是否都已经掌握。 01、测试环境的搭建 本部分主要是学习从操作系统开始&#xff0c;有关的计算机基础知识、软件和硬件知识、…

Python基于深度学习的人脸识别项目源码+演示视频,利用OpenCV进行人脸检测与识别 preview

​ 一、原理介绍 该人脸识别实例是一个基于深度学习和计算机视觉技术的应用&#xff0c;主要利用OpenCV和Python作为开发工具。系统采用了一系列算法和技术&#xff0c;其中包括以下几个关键步骤&#xff1a; 图像预处理&#xff1a;首先&#xff0c;对输入图像进行预处理&am…

[Leetcode笔记] 动态规划相关

前言 写题目写到了一些和动态规划相关的内容&#xff0c;所以在这里记录一下 LCR 089 题解思路 总的来说&#xff0c;就是用一个数组去存储当前的最优解&#xff0c;然后从0开始一路向上顺推过去&#xff0c;求得最后一位的最优解。 class Solution { public:int rob(vect…

CAD绘制A1图框的技巧

CAD如何绘制A1图框&#xff1f;这里给大家介绍下&#xff1a; 输入REC&#xff0c;绘制矩形第一点 输入D并输入841,594 文章源自四五设计网-https://www.45te.com/44546.html 输入O&#xff0c;框选图框&#xff0c;将其偏移10文章源自四五设计网-https://www.45te.com/44546…

mysql 判断一张表是否存在的方法

查询表是否存在 使用 SHOW TABLES SHOW TABLES LIKE %tbl_tabl%;结果: 查询 INFORMATION_SCHEMA // like 匹配 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA test AND TABLE_NAME like %tbl%; // 完全匹配 SELECT TABLE_NAME FROM INFORMATION_SC…

OSPF实验1

1,配置IP地址 [R1]dis ip interface brief Interface IP Address/Mask Physical Protocol GigabitEthernet0/0/0 200.1.1.1/24 up up GigabitEthernet0/0/1 10.1.1.1/24 up …

车载通信与DDS标准解读系列(4):DDSI-RTPS协议

▎什么是RTPS 在DDS协议中&#xff0c;主要描述了实现数据分发服务的DCPS模型和QoS策略&#xff0c;但是我们还不清楚数据怎样在网络中传输&#xff0c;想要了解这些内容&#xff0c;就需要请出咱们的数据搬运工——RTPS。 RTPS全称是Real-Time Publish-Subscribe Protocol&a…

8.java openCV4.x 入门-Mat之多维元组(Tuple)

专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天建议把本文当作笔记来看&#xff0c;据说专栏目录里面有相应视频&#x1f92b; &#x1f9ed;文…

【原创教程】EPLAN中伺服的制图方法

首先在EPLAN里制作伺服之前,需要有伺服的手册,根据手册里的各个引脚号的说明来制图,这里我们讲解西门子和三菱这两种品牌型号的。 1、下图是西门子的伺服,型号为:6SL3040-1LA01-0AA0 2、第一步我们需要绘制出黑盒来表示伺服的整体外框 选择插入—盒子—黑盒 3、在图纸…

ansible-自动化工具

一、ansible概述 不是C/S架构&#xff0c;就是一种工具 1&#xff1a;linux自动化运维 编写程序实现运维自动化&#xff1a;shell python 工具模式自动化&#xff1a; ①OS Provisioning&#xff1a; RedHat satellite&#xff1b;PXE&#xff08;可实现dhcp和tftp&#…

cache/TLB里分别都有什么?

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; cache cache里都有什么&#xff1f; 或者问cache line&#xff08;即每个entry&#xff09;里都有什么&#xff1f; 答案是 : TAG DATA invalid bit dirty bit 那么TAG里又都…

归并排序和分治

归并排序 归并排序是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治策略&#xff08;分治法将问题分成一些小的问题然后递归求解&#xff0c;而治的阶段则将分的阶段得到的各答案"修补"在一起&#xff0c;即分而治之)。 分而治之 可以看到这种结构…

LeetCode-142. 环形链表 II【哈希表 链表 双指针】

LeetCode-142. 环形链表 II【哈希表 链表 双指针】 题目描述&#xff1a;解题思路一&#xff1a;快慢指针 判断是否有环见解题思路二&#xff1a;set()解题思路三&#xff1a;0 题目描述&#xff1a; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如…

The Sandbox 与 Otherworld 合作推出元宇宙网络漫画中心

​ The Sandbox 将与韩国初创公司 Otherworld 合作&#xff0c;建立一个元宇宙网络动漫中心&#xff0c;为用户提供基于 KakaoPage 热门 IP 的各种体验。 Solo Leveling 是此次合作的第一个 IP。这部网络动画将深入主人公Sung Jinwoo的生活&#xff0c;并与 NFT 进行整合。随后…