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

news2025/4/8 22:11:27

目录

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

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

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

相关文章

北方经贸经济类知网收录月刊投稿发表论文

《北方经贸》期刊是由国家新闻出版总署批准&#xff0c;黑龙江省教育厅主管&#xff0c;黑龙江省经济管理干部学院主办的经济类综合期刊。期刊融理论性、知识性、实践性于一体&#xff0c;立足龙江&#xff0c;辐射全国&#xff0c;面向世界&#xff0c;注重研究解决重大现实理…

安泰电子 :电压放大器的技术指标有哪些

电压放大器是电子设备中常见的一种电路&#xff0c;它的作用是将输入信号的电压放大到所需的输出电压。电压放大器的技术指标描述了其性能和特征&#xff0c;涵盖了许多方面。下面西安安泰将详细介绍一些电压放大器的技术指标。 增益&#xff1a;增益是电压放大器最基本的指标之…

百卓Smart管理平台 importexport.php SQL注入漏洞复现(CVE-2024-27718)

0x01 产品简介 百卓Smart管理平台是北京百卓网络技术有限公司(以下简称百卓网络)的一款安全网关产品,是一家致力于构建下一代安全互联网的高科技企业。 0x02 漏洞概述 百卓Smart管理平台 importexport.php 接口处存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞获取数据…

简单了解波 Mono-repo Multi-repo(Poly-repo)

Mono-repo 和 Multi-repo 是软件开发中代码管理的两个不同策略。Mono-repo & Multi-repo 孰优孰劣是个老生常谈得话题了&#xff0c;这里就不 PK 了&#xff0c;“略微”看下两者区别。 当我们使用 Git 作为版本控制系统管理项目的代码时&#xff0c;那么 monorepo 与 mul…

【Java】Thread详解

&#x1f352;前言 本文将从以下几方面来展开对Thread的介绍。 1.线程创建 2.线程中断 3.线程等待 4.线程休眠 在前面的文章中&#xff0c;已经总结了关于Thread的一些理解。 在阅读本文之前&#xff0c;最好对其有一些基础的了解。 文章链接: 【JavaSE】进程是什么&#xff1f…

Webpack部署本地服务器

Webpack部署本地服务器 目录 Webpack部署本地服务器目的认识模块热替换&#xff08;HMR&#xff09;什么是 HMRHMR 通过如下几种方式, 来提高开发的速度如何使用 HMRhost 配置 目的 完成自动编译 常用方式: webpack-dev-server webpack-dev-server 是一个用于开发环境的 Web 服…

一文读懂!企业怎样才能选择适合自己的生产管理系统?

怎么选择适合所在企业的生产管理系统呢&#xff1f;该从哪些方面对生产管理系统进行评估&#xff1f;又怎样实现高效的生产管理呢&#xff1f; 本文我将和大家一起解决这些有关生产管理系统的问题&#xff1f; 生产管理系统模板&#xff0c;可直接查看和使用&#xff1a;https…

Rredis缓存常见面试题

文章目录 1.什么是缓存穿透&#xff0c;怎么解决2.什么是缓存击穿&#xff0c;怎么解决3.什么是缓存雪崩&#xff0c;怎么解决4.双写一致性问题5.redisson添加的排他锁是如何保证读写、读读互斥的6.为什么不使用延迟双删7.redis做为缓存&#xff0c;数据的持久化是怎么做的8.re…

【零基础C语言】编译和链接

1.翻译环境和运行环境 翻译环境&#xff1a;将源代码转化为可执行的机器指令 运行环境&#xff1a;用于执行机器指令 1.1 翻译环境 翻译环境由编译和链接两大过程构建&#xff0c;编译又可以分为三大过程&#xff1a; 【1】预处理(预编译) 【2】编译 【3】汇编 不同的.c文件经…

【数据处理包Pandas】多级索引的创建及使用

目录 一、元组作为一级索引&#xff08;一&#xff09;示例1&#xff08;二&#xff09;示例2 二、引入多级索引&#xff08;一&#xff09;多级索引的创建&#xff08;二&#xff09;多级索引中的数学选取 首先&#xff0c;导入 NumPy 库和 Pandas 库。 import numpy as np i…

MTU/TCPMSS/VLAN/ACCESS/TRUNK/HYBRID

MTU RFC标准定义以太网的默认MTU值为1500 最小64字节是为了保证最极端的冲突能被检测到&#xff0c;64字节是能被检测到的最小值&#xff1b;最大不超过1518字节是为了防止过长的帧传输时间过长而占用共享链路太长时间导致其他业务阻塞。所以规定以太网帧大小为64~1518字节&am…

Day17-【Java SE进阶】特殊文本文件、日志技术

一、特殊文本文件 为什么要用这些特殊文件&#xff1f; 存储多个用户的&#xff1a;用户名、密码 存储有关系的数据&#xff0c;做为系统的配置文件做为信息进行传输 日志技术 把程序运行的信息&#xff0c;记录到文件中&#xff0c;方便程序员定位bug、并了解程序的执行情…

代码块的理解

如果成员变量想要初始化的值不是一个硬编码的常量值&#xff0c;而是需要通过复杂的计算或读取文件、或读取运行环境信息等方式才能获取的一些值&#xff0c;该怎么办呢&#xff1f;此时&#xff0c;可以考虑代码块&#xff08;或初始化块&#xff09;。 代码块(或初始化块)的作…

Harmony创建Page省事小技巧

在创建Page页面时&#xff0c;选择ArkTS File时&#xff0c;创建的文件不会自动生成基础代码&#xff0c;也不会自动在main_page.json中自动进行注册&#xff0c;如何解决问题呢&#xff0c;其实很简单创建Page页面时选择Page项后就会创建Page文件&#xff0c;创建完的页面会自…

基于深度学习的铁轨缺陷检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5的铁轨缺陷检测系统。核心技术上&#xff0c;文章采用了最先进的YOLOv8&#xff0c;并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行了性能指标的对比分析。文中详细阐述了国内外铁轨缺陷检测的研究现状、数据集处理方法…

封装一个vue3的公共组件

在Vue 3中&#xff0c;封装公共组件的场景包括但不限于以下几种情况&#xff1a; 重复使用的组件&#xff1a;如果你发现某个组件在多个地方重复使用&#xff0c;那么将其封装成公共组件是很有意义的。比如&#xff0c;页面中的各种表单控件&#xff08;输入框、下拉框、日期选…

超级AI大脑产品架构图解析

一、概述 超级AI大脑是一个集成了先进的人工智能技术&#xff0c;为用户提供全方位、智能化的服务的产品。其产品架构图设计旨在清晰展现其技术层次、功能模块与业务流程&#xff0c;以确保用户能够高效、便捷地利用该产品。 二、技术层次 基础设施层&#xff1a; 服务器&…

大模型学习笔记八:手撕AutoGPT

文章目录 一、功能需求二、演示用例三、核心模块流程图四、代码分析1&#xff09;Agent类目录创建智能体对象2&#xff09;开始主流程3&#xff09;在prompt的main目录输入主prompt和最后prompt4&#xff09;增加实际的工具tools 一、功能需求 目的 设计一个 Agent&#xff0c…

yolov8姿态识别与绘制

YOLOv8姿态检测是一种基于深度学习的计算机视觉技术&#xff0c;用于识别图像或视频中人体的姿态。作为YOLO系列算法的最新版本&#xff0c;YOLOv8在姿态检测任务上展现出了卓越的性能和效率。以下将详细介绍YOLOv8姿态检测的原理、特点、应用以及训练过程。 一、YOLOv8姿态检…

快消企业数字化转型实战解析:探寻未来增长新动力

2024年&#xff0c;快消行业正站在数字化转型的风口浪尖。 “今年是过去十年最差的一年&#xff0c;但却可能是未来十年最好的一年。”这句话几乎成为了今年的流行语。 但是这句话是情绪&#xff0c;不是事实。未来十年&#xff0c;中国会成为全球最大的消费品市场&#xff0…