【C语言】从零开始:用C语言实现顺序表

欢迎来CILMY23的博客

本篇主题为 从零开始:用C语言实现顺序表

个人主页:CILMY23-CSDN博客

C语言专栏: http://t.csdnimg.cn/hQ5a9

Python系列专栏:http://t.csdnimg.cn/HqYo8

上一篇C语言博客: http://t.csdnimg.cn/I4Zgf

感谢观看,支持的可以给个一键三连,点赞关注+收藏。


目录

一、 什么是顺序表?

1.1 顺序表概念

1.2 顺序表结构及初始化

二、顺序表的功能实现

2.1 增 

2.1.1 头插

2.1.2 尾插

2.1.3 任意位置插入 

2.2 删

2.2.1 头删

2.2.2 尾删

2.2.3 任意位置删除 

2.3 查

2.4 改 

三、 顺序表其余功能

3.1 打印顺序表

3.2 销毁顺序表


本文前言

在学习完C语言后,我们扩展学习几种的数据结构,目的是为了最后的通讯录项目做铺垫

一、 什么是顺序表?

 如果不知道数据结构的概念可以看数据结构概念篇(http://t.csdnimg.cn/yPSMc)

1.1 顺序表概念

在讲顺序表之前得先讲讲线性表

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

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

顺序表又分为静态和动态,而静态的顺序表就是固定的空间,那本篇主要以动态顺序表的实现为主。 

1.2 顺序表结构及初始化

 顺序表的结构如下所示:

typedef int SLDataType;

typedef struct SeqList
{
	SLDataType* a;			 // 起始位置
	size_t data;			 // 有效数据个数
	size_t capacity;		 // 空间容量
}SQ;

那在使用之前我们肯定是要初始化的,这里我们直接给了一个capacity = 4,意思是这个顺序表一开始就有4个空间(但这个时候实际还未创建好)

//顺序表的初始化
void SLInit(SL* sl)
{
	assert(sl);

	sl->a = NULL;
	sl->data = 0;
	sl->capacity = 4;
}

二、顺序表的功能实现

顺序表功能主要围绕四个部分,“增删查改”这四个字,当然我们还可以增加其他功能,这些是最基本的实现。 

 

2.1 增 

在插入前我们做的第一件事就是要看空间

空间的几种情况如下: 

因为该过程较为常用,我们使用函数进行封装,这样在每次插入前都检查一遍空间。因为一次只插入一个数据,所以当有效数据和空间相等的时候,说明此时已经没有足够空间了,那要进行扩容,如果我们没在初始化给顺序表一个空间,就要使用newcapacity 对 capacity 进行判断,多一步去检查capacity。

//顺序表的空间检查
void SLCheckCapacity(SL*sl)
{	
	//如果空间不够,就要扩容
	if (sl->data == sl->capacity)
	{
		SLDataType* psl;
		psl = (SLDataType*)realloc(sl->a, sl->capacity * 2 * sizeof(SLDataType));
		if (psl == NULL)
		{
			perror("realloc fail");
			return 1;
		}
		sl->a = psl;
		sl->capacity = sl->capacity*2;
	}
}

2.1.1 头插

//顺序表的头插
void SLPushFront(SL* sl, SLDataType x)
{
	assert(sl);
	//检查空间
	SLCheckCapacity(sl);
	//插入数据,前要移动数据
	for (size_t i = sl->data; i > 0; i--)
	{
		//从末尾开始移动数据
		sl->a[i] = sl->a[i - 1];
	}
	//移动完数据开始插入数据
	sl->a[0] = x;
	sl->data++;
}

2.1.2 尾插

//顺序表的尾插
void SLPushBack(SL* sl, SLDataType x)
{
	assert(sl);
	//插入前,检查空间
	SLCheckCapacity(sl);
	//插入数据
	sl->a[sl->data] = x;
	sl->data++;
}

2.1.3 任意位置插入

我们这里说的是在任意位置之前插入数据

//任意位置插入
void SLInsert(SL* sl, int pos, SLDataType x)
{
	assert(sl);
	assert(pos >= 0 && pos <= sl->data);
	//检查空间
	SLCheckCapacity(sl);
	//数据移动
	for (int i = sl->data - 1; i >= pos; i--)
	{
		sl->a[i + 1] = sl->a[i];
	}

	sl->a[pos] = x;
	sl->data++;
}

2.2 删

在删除的时候要判断顺序表是否为空,所以我们使用一个布尔类型来判断顺序表是否为空

//判断顺序表是否为空
bool SLIsEmpty(SL* sl)
{
	assert(sl);
	//当有效数据为0就为空的顺序表
	return sl->data == 0;
}

2.2.1 头删

 在删除的时候一定要保证size大于0,当然我还是更喜欢在删除的时候选择这种柔和的方式,当然你也可以选择用assert方式。

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

2.2.2 尾删

 注意,我们删除的时候不能让有效数据小于0.

//顺序表的尾删
void SLPopBack(SL* sl)
{
	assert(sl);
	//保证有效数据大于0
	if(sl->data > 0)
	sl->data -= 1;
}

2.2.3 任意位置删除 

注意pos不能等于 sl->data ,因为这个位置没有数据啦 

//任意位置删除
void SLErase(SL* sl, int pos)
{
	assert(sl);
	assert(!SLIsEmpty(sl));

	//对pos进行检查
	assert(pos >= 0 && pos < sl->data);

	//数据移动
	for (int i = pos; i < sl->data - 1; i++)
	{
		sl->a[i] = sl->a[i + 1];
	}

	sl->data--;
}

2.3 查

在顺序表中查询数据,如果找到了则返回下标位置,如果找不到就返回-1

//顺序表查找数据
int SLFind(SL* sl, SLDataType x)
{
	assert(sl);
	assert(!SLIsEmpty(sl));
	int i = 0;
	for (i = 0; i < sl->data; i++)
	{
		if (sl->a[i] == x)
		{
			return i;
		}
	}
	if (i == sl->data)
		return -1;
}

2.4 改 

在顺序表中修改指定位置的数据

//顺序表修改数据
void SLChange(SL* sl, SLDataType x)
{
	assert(sl);
	assert(!SLIsEmpty(sl));
	int i = 0;
	for (i = 0; i < sl->data; i++)
	{
		if (sl->a[i] == x)
		{
			sl ->a a[i] = x;
		}
	}
}

三、 顺序表其余功能

3.1 打印顺序表

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

3.2 销毁顺序表 

有顺序表的初始化,那就有顺序表的销毁,因为是动态内存,所以我们就要用到free函数来释放空间

//顺序表的销毁
void SLDestroy(SL* sl)
{
	if (sl->a != NULL)
	{
		free(sl->a);
		sl->a = NULL;
		sl->capacity = 0;
		sl->data = 0;
	}
}

 感谢各位同伴的支持,本期顺序表就讲解到这啦,更详细的可以看,【数据结构和算法】4.超详细解析动态顺序表的实现(图文解析,附带源码)-CSDN博客

如果你觉得写的不错的话,可以给个一键三连,点赞,关注+收藏,若有不足,欢迎各位在评论区讨论。      

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

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

相关文章

pwn学习笔记(7)--堆相关源码

相关源码&#xff1a; 1. chunk 相关源码&#xff1a; ​ 对于用户来说&#xff0c;只需要确保malloc()函数返回的内存不会发生溢出&#xff0c;并且在不用的时候使用free() 函数将其释放&#xff0c;以后也不再做任何操作即可。而对于glibc来说’它要在用户第一次调用malloc…

C语言数据结构初阶-顺序表

什么是数据结构 数据结构是由数据和结构两个词结合而来&#xff0c; 那么数据由是什么 就比如我们日常生活中的1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;a,b,c,d,e文字信息图片等&#xff0c;这些就是数据 那么结构又是什么&#xff1f; 想像一下如…

Collection与数据结构 Stack与Queue(一): 栈与Stack

1. 栈 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&…

【029】基于ssm+小程序实现的理发店预约系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

Hadoop: word count,并将reduce结果写入ES

一、依赖&#xff0c;其中ES版本为7.6.2 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http…

[StartingPoint][Tier0]Mongod

Task 1 How many TCP ports are open on the machine? (机器上打开了多少个 TCP 端口&#xff1f;) Example: $ sudo nmap -sS -T4 10.129.222.112 -p 27017,22 2 Task 2 Which service is running on port 27017 of the remote host? (哪个服务正在远程主机的端口 270…

Hippo4j线程池实现技术

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容部署运行模式集成线程池监控配置参数默认配置 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家…

基于Java课程选课系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

KIl5:Stm32L071下载出现flash download faild “cortex-m0+“的解决方法

首先看看有没有芯片&#xff0c;没有芯片下载一下 下载并在device选择对应的芯片 选择调试器 选择flash

gpt4.0中文版

我愿把这个网站成为全球最强AI网站&#xff01;弄100多个AI伺候你&#xff1f;&#xff1f; 家人们&#xff0c;你们猜我发现了什么牛逼的AI网站&#xff1f;&#xff1f; 直接上图&#xff1a; 编辑 这个网站&#xff0c;聚合了国内外100多个顶尖的AI&#xff0c;包括了Op…

入门用Hive构建数据仓库

在当今数据爆炸的时代&#xff0c;构建高效的数据仓库是企业实现数据驱动决策的关键。Apache Hive 是一个基于 Hadoop 的数据仓库工具&#xff0c;可以轻松地进行数据存储、查询和分析。本文将介绍什么是 Hive、为什么选择 Hive 构建数据仓库、如何搭建 Hive 环境以及如何在 Hi…

我认识的Git-史上最强的版本控制系统

大家好&#xff01; 欢迎大家来一起交流Git使用心得&#xff0c;相信很多同事对Git都很熟悉了&#xff0c;如果下面说的有错误的“知识点”&#xff0c;欢迎批评指正。 初识Git 我认识Git已经很多年了&#xff08;我在有道云笔记里面“Git”文件夹的创建时间是&#xff1a; …

sky06笔记下

1.边沿检测 检测输入信号din的上升沿&#xff0c;并输出pulse module edge_check ( clk, rstn, din, pulse ); input wire clk,rstn; input wire din; output reg pulse;wire din_dly;always (posedge clk or negedge rstn)beginif(!rstn)din_dly < 1b0;elsedin_dly < d…

JS-11A/11时间继电器 板前接线 JOSEF约瑟

系列型号&#xff1a; JS-11A/11集成电路时间继电器&#xff1b;JS-11A/12集成电路时间继电器&#xff1b; JS-11A/13集成电路时间继电器&#xff1b;JS-11A/136集成电路时间继电器&#xff1b; JS-11A/137集成电路时间继电器&#xff1b;JS-11A/22集成电路时间继电器&#…

【C语言】_文件内容操作:随机读写

目录 1. fseek 1.1 随机读文件 1.2 随机写文件 2. ftell 3. rewind 当以读方式打开一个存在且存有内容的文件时&#xff0c;文件指针会默认指向第一个元素。以在test4.txt文件中存储abcdef为例&#xff1a; int main() {//打开文件FILE* pf fopen("E:\\C_文件操作…

数学知识--(质数,约数)

本文用于个人算法竞赛学习&#xff0c;仅供参考 目录 一.质数的判定 二.分解质因数 三.质数筛 1.朴素筛法 2.埃氏筛法 3.线性筛法 四.约数 1.求一个数的所有约数 2.约数个数和约数之和 3.欧几里得算法&#xff08;辗转相除法&#xff09;-- 求最大公约数 一.质数的判定 …

JWT--study

JWT 1、简介 2、结构 头部 载荷 签证 应用 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>Token 生成 解析token package com.wang.utils;import io.…

【QT+QGIS跨平台编译】056:【pdal_lepcc+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_lepcc介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_lepcc介绍 pdal_lepcc 是 PDAL(Point Data Abstraction Library)的一个插件,用于点云数据的压缩。它基于 EPCC(Entwine Point Cloud Compression)算法,提供了对点…

Linux-4 gcc和makefile

Linux编译器-gcc/g使用 1.设计样例 c语言&#xff1a;linux中用的stdc99版本--可能会出现其他问题 c&#xff1a;Linux中用的stdc11--使用c11版本 Linux没有文件格式的区分&#xff0c;但是编译器区分 gcc编译器的文件格式是filename.c g编译器的文件格式是filename.cc或者fil…

利用Spark将Kafka数据流写入HDFS

利用Spark将Kafka数据流写入HDFS 在当今的大数据时代&#xff0c;实时数据处理和分析变得越来越重要。Apache Kafka作为一个分布式流处理平台&#xff0c;已经成为处理实时数据的事实标准。而Apache Spark则是一个强大的大数据处理框架&#xff0c;它提供了对数据进行复杂处理…