顺序表 —— 初始化、销毁、打印、增加、删除、查找、修改

news2024/11/14 9:00:12

1.何为线性表

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

2.顺序表

2.1概念及结构

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

顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储元素。
    在这里插入图片描述

  2. 动态顺序表:使用动态开辟的数组存储
    在这里插入图片描述

2.2 接口实现

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。

#pragma once
#include<stdio.h>
#include <stdlib.h>
#include <assert.h>
//静态的顺序表结构
//#define N 1000
//typedef int SQDataType;
//
//typedef struct SeqList
//{
//	SQDataType a[N];
//	int size;
//
//}SLT;
//typedef struct SeqList SLT;

//动态的顺序表结构
typedef int SQDataType;

typedef struct SeqList
{
SQDataType* a;//声明了一个指向顺序表的指针,姑且称它为“顺序表指针”
int size;//有效数据的个数
int capacity;//容量空间大小
}SLT;

// 增删查改
void SeqListInit(SLT* psl);//初始化
void SeqListDestory(SLT* psl);//释放

void SeqListPrint(SLT* psl);//打印数组内容

void SeqListPushBack(SLT* psl, SQDataType x);//尾插   O(1)
void SeqListPushFront(SLT* psl, SQDataType x);//头插  O(n)
void SeqListPopBack(SLT* psl);//尾删  O(1 )
void SeqListPopFront(SLT* psl);//头删

int ListFind(SLT* psl, SQDataType x);//判断存在某一元素
void SqwListInsert(SLT* psl, size_t pos, SQDataType x);//查找某一元素
void SqeListErase(SLT* psl, size_t pos);//删除某一元素

size_t SqeListSize(SLT* psl);//查看数据内容
int SqeListAt(SLT* psl, size_t pos, SQDataType x);//修改元素内容

初始化

void SeqListInit(SLT* psl)
{
	assert(psl);
	psl->a = NULL;//刚开始时顺序表为空,顺序表指针为NULL
	psl->size = psl->capacity = 0;//起始时元素个数为0,容量为0
}

销毁顺序表

因为顺序表所用的内存空间是动态开辟在堆区的,所以我们在使用完后需要及时对其进行释放,避免造成内存泄漏。

void SeqListDestory(SLT* psl)
{
	assert(psl);

	if (psl->a)
	{
		free(psl->a);//释放顺序表指针指向的空间
		psl->a=NULL;
	}
	psl->size = psl->capacity = 0;
}

打印顺序表

void SeqListPrint(SLT* psl)
{
	assert(psl);
	for (int i = 0; i < psl->size; ++i)
	{
		printf("%d ", psl->a[i]);
	}
	printf("\n");
}

查看数据容量,设置增容

我们每次需要增加数据的时候,首先都应该先检查顺序表内元素个数是否已达顺序表容量上限。若已达上限,那么我们就需要先对顺序表进行扩容,然后才能增加数据。

void SeqListCheckCapcity(SLT* psl)
{
	assert(psl);

	// 是否满了,满了就要增容
	if (psl->size == psl->capacity)
	{
		//判断顺序表容量是否为0,若为0,则先开辟用于存放4个元素的空间大小,若不为0,则扩容为原来容量的两倍
		size_t newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
		psl->a = realloc(psl->a, newcapacity * sizeof(SQDataType));//开辟成功,将顺序表指针更新
		psl->capacity = newcapacity;
	}
}

注意:若传入realloc的指针为空指针(NULL),则realloc函数的作用相当于malloc函数。

尾插

直接在表尾插入数据即可。

void SeqListPushBack(SLT* psl, SQDataType x)//尾插
{
	assert(psl);
    SeqListCheckCapcity(psl);

	psl->a[psl->size] = x;
	psl->size++;
}

头插

要想在顺序表的表头插入数据,那么就需要先将顺序表原有的数据从后往前依次向后挪动一位,最后再将数据插入表头。

void SeqListPushFront(SLT* psl, SQDataType x)//头插
{
	assert(psl);

	SeqListCheckCapcity(psl);
	//挪动数据
	int end = psl->size - 1;
	while (end >= 0)
	{
		psl->a[end + 1] = psl->a[end];
		end--;
	}
	psl->a[0] = x;
	psl->size++;
}

指定下标位置插入

要做到在指定下标位置插入数据,首先我们需要得到一个下标位置,然后从该下标位置开始(包括该位置),其后的数据从后往前依次向后挪动一位,最后将数据插入到该下标位置。

void SqwListInsert(SLT* psl, size_t pos, SQDataType x)//插入某一元素
{
	assert(psl);
	assert(pos<=psl->size&&pos>=0);

	SeqListCheckCapcity(psl);

    size_t end = psl->size;
	while (end > pos)
	{
		psl->a[end] = psl->a[end-1];
		end--;
	}
	psl->a[pos] = x;
	psl->size++;

}

头插和尾插实际上就是在下标为0的位置和下标为ps->size的位置插入数据,我们也可以使用该函数来实现头插和尾插。

尾删

直接将顺序表的元素个数减一即可。

void SeqListPopBack(SLT* psl)//尾删
{
	assert(psl->size>0);//尾删>0断言
	psl->size--;
}

头删

要删除表头的数据,我们可以从下标为1的位置开始,依次将数据向前覆盖即可。

void SeqListPopFront(SLT* psl)//头删
{
	assert(psl->size>0);//尾删>0断言
	psl->a[0] = 0;
	for (int i = 0; i < psl->size; i++)
	{
		psl->a[i]=psl->a[i + 1];

	}
	psl->size--;
}

指定下标位置删除

要删除指定下标位置的数据,我们只需要从下标位置开始,其后的数据从前向后依次覆盖即可。

void SqeListErase(SLT* psl, size_t pos)//删除某一元素
{
	assert(psl);
	assert(pos < psl->size);

	size_t begin = pos + 1;
	while (begin < psl->size)
	{
		psl->a[begin-1] = psl->a[begin];
		begin++;
	}
	psl->size--;
}

头删和尾删实际上也就是删除下标为0的位置和下标为ps->size - 1的位置的数据,也就意味着我们可以统一使用该函数来实现头删和尾删。

查找数据

直接遍历一次顺序表即可,若找到了目标数据,则停止遍历,并返回该数据的下标,否则返回-1。

int ListFind(SLT* psl, SQDataType x)//判断存在某一元素
{
	assert(psl);
	for (int i = 0; i < psl->size; ++i)
	{
		if (psl->a[i] == x)
			printf("查找元素位置在:%d\n",i+1);
		
	}
	return -1;
}

修改数据

修改数据,就直接对该位置的数据进行再次赋值即可。

int SqeListAt(SLT* psl,size_t pos, SQDataType x)//修改元素内容
{
	assert(psl);
	assert(pos >= 0 && pos < psl->size);
	psl->a[pos] = x;
}

The end

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

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

相关文章

zotero导出pdf

今天老师给我改论文的时候布置了一个任务&#xff0c;让我把所有论文的pdf按格式打包发给她。可是之前我用zotero的时候都是在线保存的&#xff0c;有些是没有pdf的&#xff0c;怎么办&#xff1f;而且就算有pdf&#xff0c;他们的命名格式也五花八门&#xff0c;难道一个个手改…

kafka 消息日志原理 指定偏移量消费 指定时间戳消费

Kafka 日志详解 Apache Kafka日志存储在物理磁盘上各种数据的集合&#xff0c;日志按照topic分区进行文件组织&#xff0c;每一个分区日志由一个或者多个文件组成。生产者发送的消息被顺序追加到日志文件的末尾。 如上图所述&#xff0c;Kafka主题被划分为3个分区。在Kafka中&…

vscode使用跳板机(密钥)进入内网并连接内网中其它机器(密码)

经过简单测试 1、不能像xshell一样选择服务器的密钥登陆&#xff0c;只能通过将本机的公钥传到服务器上 2、不能使用本地socket5做代理登录 3、不能使用系统代理登录 一、使用密钥连接到跳板机 1、内网穿透 2、将本机公钥上传到服务器上 1&#xff09;建立密钥对 无论是win…

redis集群 mac安装

1.安装redis mac环境用brew install安装 brew install redis 安装好后默认配置启动单点服务 redis-server 注&#xff1a;brew默认程序安装在/usr/local/Cellar目录下 /usr/local/Cellar/redis 默认配置文件在 /usr/local/etc/redis.conf 2.创建配置文件 准备创建6个节…

谣言检测数据集

1 PHEME-R 这是一个在PHEME FP7项目的新闻学用例中收集和注释的数据集。这些谣言与9个不同的突发新闻相关。它是为分析社交媒体谣言而创建的&#xff0c;包含由谣言推文发起的推特对话&#xff1b;对话包括对这些谣言推文的回应推文。这些推文已经被注解为支持度、确定性和证…

VS2012安装教程

我要学只有我们两个人懂得C语言。 安装包&#xff1a;https://pan.baidu.com/s/1YR7Xk9Zlv7zQWCsERdVgIQ [提取码]&#xff1a;stvi 1、右键以管理员身份运行 “vs_ultimate.exe” 2、编辑软件安装位置&#xff0c;然后点击同意许可&#xff0c;之后点下一步即可&#xff01; 3…

mongoDB聚合查询

管道 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。 聚合管道操作 可参考菜鸟文档&#xff1a;菜鸟文档 命令 功能描述 $project指定输出…

shell第四天作业——流程控制之循环

题目 一、for创建20个用户&#xff0c;用户前缀由用户输入&#xff0c;用户初始密码由用户输入。 二、for循环ping测试指定网段的主机&#xff0c;网段由用户输入。 三、使用for/while实现批量主机root密码的修改 一、for创建20个用户&#xff0c;用户前缀由用户输入&#x…

2022年已然要结束了,一起来分享下你的故事吧!2023年的接力棒已经递到手里,千言万语不如一句Fighting!

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

c++语法欠缺地方

sizeof是用来计算变量占多大内存的&#xff0c;单位是字节&#xff08;byte&#xff09;&#xff1b;sizeof 后面跟类型时&#xff0c;必须加上括号&#xff0c;例如sizeof(double);后面跟变量可以不用加括号&#xff0c;例如&#xff1a;sizeof d%d是以十进制形式输出有符号整…

CDP集群卸载过程

CDP集群卸载过程 1. 登录到Cloudera Manager&#xff0c;并停止整个集群服务。 2. 停用并移除所有Parcel 3. “停用”CDH7的Parcel。 4. 从主机删除”CDH6的Parcel 5. 删除集群 6. 登录server机器&#xff0c;停止CM Server服务 systemctl stop cloudera-scm-server 7. 移除…

如何实现高性能点赞(三)

数据库设计 数据库表中至少要包含三个字段&#xff1a;被点赞用户id&#xff0c;点赞用户id&#xff0c;点赞状态。再加上主键id&#xff0c;创建时间&#xff0c;修改时间就行了。 建表语句 对应的对象 UserLike 数据库操作 操作数据库同样封装在接口中 LikedService L…

【2.2】服务拆分--服务远程调用

服务拆分--服务远程调用1 案例--根据订单id查询订单功能2 远程调用方式分析2.1 注册RestTemplate2.2 发http请求3 总结1 案例–根据订单id查询订单功能 需求&#xff1a;根据订单id查询订单的同时&#xff0c;把订单所属的用户信息一起返回。 由上一节的测试结果可以看出&…

opencv-python常用函数解析及参数介绍(五)——腐蚀与膨胀

腐蚀与膨胀前言膨胀腐蚀开运算与闭运算礼帽与黑帽运用膨胀和腐蚀获得图像轮廓前言 有些时候图片上会有一些划痕或者污渍&#xff0c;会影响图片的质量&#xff0c;假设我有一张写有“艾醒”的图片&#xff0c;但是有花花绿绿的划痕和污渍&#xff0c;这时我们就可以运用腐蚀与…

五、Web自动化测试

Web自动化测试5.1 Selenium Web 自动化5.1.1 Selenium 和 Robot Framework SeleniumLibrary 库介绍安装 robotframework-seleniumlibrary导入 SeleniumLibrary5.1.2 Open Browser 和 Close Browser5.1.3 Input Text5.1.4 Click Button5.1.5 Click Element5.1.6 Click Link5.1.7…

2022CTF培训(十)IOT 相关 CVE 漏洞分析

附件下载链接 这里选择的设备是一款家用路由器&#xff0c;型号为 D-Link DIR-850L(EOL) 。由于该款路由器已停产&#xff0c;官网无法下载到固件&#xff0c;不过目前这个网站还能下载到相关的固件&#xff0c;当然附件中也会提供需要分析的固件。 固件解密 以 DIR850LB1_FW…

归一化 (Normalization)、标准化 (Standardization)和中心化/零均值化 (Zero-centered)

目录 一、概念 1、归一化&#xff08;Normalization&#xff09;&#xff1a; 2、标准化&#xff08;Standardization&#xff09;&#xff1a; 3、中心化/零均值化&#xff08;zero-centered&#xff09;&#xff1a; 二、联系和差异&#xff1a; 三、标准化和归一化的多种…

Faster RCNN网络源码解读(Ⅵ) --- RPN网络代码解析(上)RPNHead类与AnchorsGenerator类解析

目录 一、代码作用&#xff08;rpn_function.py&#xff09; 二、代码解析 2.1 RPNHead类 2.2 AnchorsGenerator类 2.2.1 初始化函数__init__ 2.2.2 正向传播过程 forward 2.2.3 set_cell_anchors生成anchors模板 2.2.4 generate_anchors生成anchors 2.2.5 cached_g…

【Linux】vim 中批量添加注释

本期主题&#xff1a;vim 中批量添加注释博客主页&#xff1a;小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限&#xff0c;出现错误希望大家不吝赐 此文主要介绍两种方法&#xff1a;方法一 &#xff1a;块选择模式&#xff1b;方法二: 替换命令 &#x…

Java基础随手记

数组 数组的使用 数组可以存放多个同一类型的数据&#xff0c;数组也是一种数据类型&#xff0c;是引用类型。即&#xff1a;数组就是一组数据 问题引入 传统的解决方式 使用数组来解决 可以看到&#xff0c;我们创建了一个double类型元素的数组&#xff0c;将我们要计算…