顺序表之初

在这里插入图片描述

欢迎来到我的:世界

希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 !


目录

  • 线性表简介
    • 顺序表定义
    • 动态顺序表的初始化
    • 尾插
    • 头插
    • Cheak 判断是否增容
    • 尾删:
    • 头删:
    • 打印
    • 在pos位置前插入x
    • 删除pos位置的值
    • 查找
    • 修改
    • 销毁

线性表简介

百度:线性表最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

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

![在这里插入图片描述](https://img-blog.csdnimg.cn/407892b043c9486db9b64ff8f8d330a0.png


顺序表定义

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

顺序表可以分为:
1.静态顺序表:使用固定长数组存储元素;

#define N 100
typedef int SLDateType;
//定义静态顺序表
typedef struct SeqList
{
	SLDateType a[N]; //固定数组大小,N的值无法改变
	int size;        //数组有效的个数
	
}SeqList;

2.动态顺序表:使用动态开辟的数组储存;

typedef int SLDateType;
//定动态义顺序表
typedef struct SeqList
{
	SLDateType* a;//指向动态数组的指针
	int size;     //数组的有效数据
	int capacity; //空间大小
}SeqList;

动态顺序表的初始化

初始化顺序表是使用动态分配数组空间方式构造一个空的线性表。

//初始化
void SeqListInit(SeqList* ps)
{
	//用 malloc申请一块空间
	ps->a = (SLDateType*)malloc(sizeof(SLDateType) * 4);
	if (ps->a== NULL)//判断是否申请空间成功
	{
		perror("malloc");
		exit(-1);
	}
	
	ps->capacity = 4;//将顺序表的最大长度设为 4
	ps->size = 0; //将顺序表的当前长度设为 0

}

有关malloc函数申请动态内存空间,可以看我的另一篇博客动态内存空间管理,有详细解释;

尾插

尾插就是在最后一个元素的后面插入一个元素

  • 尾插有三种情况:
    第一种:情况是顺序表压根就没有空间,用assert解决;
    第二种:情况就是我们创建的 capacity 空间满了,需要增容再往后插入;
    第三种:情况是空间足够,直接插入数据即可;
void SeqListPushBack(SeqList* ps, SLDateType x)
{
	//每次进来判断依次满了要扩容
	if (ps->size  == ps->capacity)
	{
		//realloc函数是专门用来增容的,以两倍的增容
		SLDateType* tem = (SLDateType*)realloc(ps->a, ps->capacity * 2  * sizeof(SLDateType));
		if (tem == NULL)//判断是否增容成功
		{
			perror("realloc");
			exit(-1);
		}
		ps->a = tem;
		ps->capacity *= 2;//空间大小以两倍增容
	}

	ps->a[ps->size] = x;//运用下标存储要插入的值
	ps->size++;//尾插成功则有效数据就加 1
}

有关realloc函数调整动态申请的内存空间,详解也再我的另一篇博客中:动态内存空间管理,其详细解释,一定要看懂!很重要!!

头插

顺序表要求数据是连续存储的,且必须是从头开始存储。所以,对于顺序表而言如果要实现头插,就需要把数据往后挪动。不能从前往后挪,如果从前往后挪就挪就会把后面的数据覆盖掉。
在这里插入图片描述

void SeqListPushFront(SeqList* ps, SLDateType x) {

	//每次进来判断依次满了要扩容
	if (ps->size == ps->capacity)
	{
		//realloc函数是专门用来增容的,以两倍的增容
		SLDateType* tem = (SLDateType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDateType));
		if (tem == NULL)//判断是否增容成功
		{
			perror("realloc");
			exit(-1);
		}
		ps->a = tem;
		ps->capacity *= 2;//空间大小以两倍增容
	}
	//从后往前式的往后移动一个元素
	int end = ps->size - 1;
	while (end>=0)
	{
		ps->a[end+1] = ps->a[end];
		--end;
	}

	ps->a[0] = x;//插入首元素
	ps->size++;//头插成功有效元素加1
}

这个时候你回头会发现,如果要增容的时的代码几乎一致,我们可以为要增容单独写一个函数,判断是否要增容:

Cheak 判断是否增容

void Cheak(SeqList*ps)
{
	//每次进来判断依次满了要扩容
	if (ps->size == ps->capacity)
	{
		//realloc函数是专门用来增容的,以两倍的增容
		SLDateType* tem = (SLDateType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDateType));
		if (tem == NULL)//判断是否增容成功
		{
			perror("realloc");
			exit(-1);
		}
		ps->a = tem;
		ps->capacity *= 2;//空间大小以两倍增容
	}
}

而这个时候的尾插、头插这样写:

头插:

void SeqListPushFront(SeqList* ps, SLDateType x) {
	Cheak(ps);//判断增容
	//从后往前式的往后移动一个元素
	int end = ps->size - 1;
	while (end>=0)
	{
		ps->a[end+1] = ps->a[end];
		--end;
	}

	ps->a[0] = x;//插入首元素
	ps->size++;//头插成功有效元素加1
}

尾插:

void SeqListPushBack(SeqList* ps, SLDateType x)
{
	Cheak(ps);//判断增容

	ps->a[ps->size] = x;//运用下标存储要插入的值
	ps->size++;//尾插成功则有效数据就加 1
}

尾删:

顺序表的尾删比较简单,直接让size–就可以;

void SeqListPopBack(SeqList* ps)
{
	//当顺序表中无元素,不会进行尾删
	if (ps->size == 0)
	{
		printf("size越界访问");
		exit(-1);
	}

	ps->size--;
}

头删:

头删可以理解为:直接将从第二元素从前往后的覆盖上去;

//头删
void SeqListPopFront(SeqList* ps)
{
	
	assert(ps->size > 0);

	//删减
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

打印

打印出顺序表中的元素;

void SeqListPrint(SeqList* ps) {

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

在pos位置前插入x

需要知道pos为元素下标,找到pos位后,然后将其后面的所有元素向后移动一个元素,再将要插入的x插入pos位置;

void SeqListInsert(SeqList* ps, int pos, SLDateType x)
{
	//检查pos位置是否在顺序表里面
	assert(pos >= 0 && pos <= ps->size);
	Cheak(ps);//判断是否增容
	//找到有效数据元素的下标
	int end = ps->size - 1;
	//往后移
	while (end>=pos)
	{
		ps->a[end+1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;//空出pos位后插入
	ps->size++;
}

注意:SeqListInsert这个函数可以代替尾插或头插;

删除pos位置的值

删除指定位置的数据,我们仍然要限制 pos 的位置。限制条件部分和 SeqListInsert 不同的是,因为 psl->size 这个位置没有效数据,所以删除的位置不能是 psl->size!

void SeqListErase(SeqList* ps, int pos) {
	//检查pos位置是否在顺序表里面
	assert(pos >= 0&&pos< ps->size);
	//找到pos位置的下一个
	int begain = pos + 1;
	
	while (begain < ps->size)
	{
		ps->a[begain - 1] = ps->a[begain];
		begain++;
	}
	ps->size--;

}

注意:SeqListErase这个函数可以代替尾删或头删;

查找

//查找返回其下标,否则返回-1;
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;
 
}

修改

修改pos位置的值

//修改pos位置的值,pos是其下标
void SLModify(SL* ps, int pos, SLDatatype x)  
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
 
	ps->a[pos] = x;
 
}

看代码运行结果:
在这里插入图片描述
最后的是:

销毁

如果进行了动态内存的内存空间申请,一定要记得销毁,因为动态内存空间是不会主动释放的,除非程序结束,否则可能会存在内存泄漏的风险;

//销毁
void SeqListDestroy(SeqList* ps)
{
	//释放
	free(ps);
	ps->a = NULL;
	ps->capacity = 0;
	ps->size = 0;

}

到了最后:感谢支持

我还想告诉你的是:
------------对过程全力以赴,对结果淡然处之
也是对我自己讲的

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

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

相关文章

centos7搭建apache作为文件站后,其他人无法访问解决办法

在公司内网的一个虚拟机上搭建了httpsd服务&#xff0c;准备作为内部小伙伴们的文件站&#xff0c;但是搭建好之后发现别的小伙伴是无法访问我机器的。 于是寻找一下原因&#xff0c;排查步骤如下&#xff1a; 1.netstat -lnp 和 ps aux 先看下端口和 服务情况 发现均正常 2.…

Linux(基础篇一)

Linux基础篇 Linux基础篇一1. Linux文件系统与目录结构1.1 Linux文件系统1.2 Linux目录结构 2. VI/VIM编辑器2.1 vi/vim是什么2.2 模式间的转换2.3 一般模式2.4 插入模式2.4.1 进入编辑模式2.4.2 退出编辑模式 2.5 命令模式 3. 网络配置3.1 网络连接模式3.2 修改静态ip3.3 配置…

python中的matplotlib画直方图(数据分析与可视化)

python中的matplotlib画直方图&#xff08;数据分析与可视化&#xff09; import numpy as np import pandas as pd import matplotlib.pyplot as pltpd.set_option("max_columns",None) plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]Fa…

Linux TCP协议——三次握手,四次挥手

一、TCP协议介绍 TCP协议是可靠的、面向连接的、基于字节流的传输层通信协议。 TCP的头部结构&#xff1a; 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;&#xff08;tcp是传输层的协议&#xff0c;端与端之间的数据传输&#xff0c;在TCP和UDP协议当中不会体现出I…

[Linux]命令行参数和进程优先级

[Linux]命令行参数和进程优先级 文章目录 [Linux]命令行参数和进程优先级命令行参数命令行参数的概念命令函参数的接收编写代码验证 进程优先级进程优先级的概念PRI and NI使用top指令修改nice值 命令行参数 命令行参数的概念 命令行参数是指用于运行程序时在命令行输入的参数…

软件设计师学习笔记3-CPU组成

目录 1.计算机结构 1.1计算机的外设与主机 1.2计算机各部分之间的联系(了解一下即可) 2.CPU结构 1.计算机结构 1.1计算机的外设与主机 1.2计算机各部分之间的联系(了解一下即可) 该图片来自希赛软考 注&#xff1a;黄色的是传递数据的数据总线&#xff0c;白色的是传递控…

AI新时代,英特尔如何加强产学研融合?

人工智能作为当前数字经济发展的核心驱动力&#xff0c;我们在关注AI技术发展之际&#xff0c;为发挥AI强大助力&#xff0c;更需进一步思考AI的科研、产业应用与人才培育的工作&#xff0c;推动产学研融合创新。 正如英特尔公司高级副总裁、英特尔中国区董事长王锐在刚结束的…

【C++】C/C++内存管理-new、delete

文章目录 一、C/C内存分布二、C/C中动态内存管理方式2.1 C语言中动态内存管理方式2.2 C内存管理方式 三、operator new和operator delete函数3.1 operator new和operator delete函数3.2 operator new与operator delete的类专属重载&#xff08;了解&#xff09; 四、new和delet…

算法与数据结构(九)--并查集

并查集是一种树型的数据结构&#xff0c;并查集可以高校地进行如下操作&#xff1a; *查询元素p和元素q是否在同一组 *合并元素p和元素q所在的组 一.并查集结构 并查集也是一种树型结构&#xff0c;这种树的要求比较简单&#xff1a;1.每个元素都唯一的对应一个结点&#xff…

基于SSM的小说网站的设计与实现(论文+源码)_kaic

目 录 1 绪论................................................................................................... 1 1.1 项目背景................................................................................................................ 1 1.2 发展历程..…

Java学数据结构(2)——树Tree 二叉树binary tree 二叉查找树 AVL树 树的遍历

目录 引出什么是树Tree&#xff1f;树的实现二叉树binary tree查找树ADT——二叉查找树Binary Search Tree1.contains方法2.findMax和findMin方法3.insert方法4.remove方法&#xff08;复杂&#xff09;二叉查找树的深度 AVL(Adelson-Velskii和Landis)树——**平衡条件(balance…

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【三】

&#x1f600;前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【三】的分享&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我…

【Jenkins】持续集成部署学习

【Jenkins】持续集成部署学习 【一】安装部署【1】Jenkins所处位置【2】Docker安装Gitlab&#xff08;1&#xff09;首先准备一台空的虚拟机服务器&#xff08;2&#xff09;安装服务器所需的依赖&#xff08;3&#xff09;Docker的安装&#xff08;4&#xff09;阿里云镜像加速…

VUE笔记(十)Echarts

一、Echarts简介 1、什么是echarts ECharts是一款基个基于 JavaScript 的开源可视化图表库 官网地址&#xff1a;Apache ECharts 国内镜像&#xff1a;ISQQW.COM x ECharts 文档&#xff08;国内同步镜像&#xff09; - 配置项 示例&#xff1a;echarts图表集 2、第一个E…

大语言模型之五 谷歌Gemini

近十年来谷歌引领着人工智能方向的发展&#xff0c;从TensorFlow到TPU再到Transformer&#xff0c;都是谷歌在引领着&#xff0c;然而&#xff0c;在大语言模型上&#xff0c;却被ChatGPT&#xff08;OpenAI&#xff09;抢了风头&#xff0c;并且知道GPT-4&#xff08;OpenAI&a…

红蓝攻防:浅谈削弱WindowsDefender的各种方式

前言 随着数字技术的日益进步&#xff0c;我们的生活、工作和娱乐越来越依赖于计算机和网络系统。然而&#xff0c;与此同时&#xff0c;恶意软件也日趋猖獗&#xff0c;寻求窃取信息、破坏系统或仅仅为了展现其能力。微软Windows&#xff0c;作为世界上最流行的操作系统&…

2023年03月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:和数 给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。 时间限制:10000 内存限制:65536 输入 共两行,第一行是数列中数的个数n ( 1 <= n <= 100),第二行是由n个…

商品搜索网:连接您与各类商品的桥梁

导语&#xff1a;在如今信息爆炸的时代&#xff0c;购物已经不再是传统的实体店购买&#xff0c;而是通过互联网实现的线上购物方式。而要实现高效的线上购物&#xff0c;商品搜索引擎则成为我们的得力助手。作为国内垂直的商品搜索之一&#xff0c;为中国用户提供全面的数码电…

咸鱼之王俱乐部网站开发

我的俱乐部 最新兑换码 *注意区分大小写&#xff0c;中间不能有空格&#xff01; APP666 HAPPY666 QQ888 QQXY888 vip666 VIP666 XY888 app666 bdvip666 douyin666 douyin777 douyin888 happy666 huhushengwei888 taptap666 周活动 宝箱周 宝箱说明 1.木质宝箱开启1个…

缺页异常与copy-on-write fork

缺页异常需要什么 当发生缺页异常时&#xff0c;内核需要以下信息才能响应这个异常&#xff1a; 出错的虚拟地址&#xff08;引发缺页异常的源&#xff09; 当一个用户程序触发了缺页异常&#xff0c;会切换到内核空间&#xff0c;将出错的地址放到STVAL寄存器中&#xff0c;…