【数据结构】顺序表(一)

                        ✨✨✨专栏:数据结构     

          🧑‍🎓个人主页:SWsunlight

 不怕别人看不起,就怕自己不争气。路是人走出来的,关键要靠自己闯。振作起来,生活的含义就是前进。

目录

 一、顺序表的概念:

二、运算:

三、实现:

1、创建顺序表:

2、初始化:

3、扩容:

 4、尾插:

5、尾删:

7、头删:

8、指定位置插:

9、指定位置删 :

10、查找:

11、打印:

12、销毁:

​编辑 四、代码

SeqList.h头文件

SeqList.c源文件

test.c测试文件


 一、顺序表的概念:

定义:  是一种线性表(某一类具有相同特性的数据的集合)的存储结构,它用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的两个元素在物理位置上也相邻;

特点:

  1. 顺序表具有动态分配空间、支持随机访问和顺序访问,逻辑顺序与物理顺序一致。
  2. 每个元素可以都有唯一的位置,可以通过索引直接访问元素。
  3. 元素可以是任意类型,包括基本数据类型、结构体等。

分类:

  1. 静态顺续表(空间有限)
  2. 动态顺序表(可以申请空间,空间是动态的,按需申请)

二、运算:

  1. 初始化和销毁
  2. 增添数据,删除数据,查找数据,修改数据
  3. 遍历

三、实现:

1、创建顺序表:

动态顺序表的成员包括:数组(动态的),有效数据个数以及空间容量

用指针来接受动态内存开辟的空间;

2、初始化:

初始情况下:

3、扩容:

在初始情况下:空间是没有申请的,在放入数据前要先申请空间:

 4、尾插:

进来判断是否需要扩容,若是需要,则先扩容在插入值

5、尾删:

将最后一个元素删掉,有效个数-1即可

6、头插:

步骤大差不差,但是要给数组里面的数据全部后移一位,才能插入

7、头删:

比起尾删,要麻烦点,要将头元素后面的元素全部前移一位,直接将头元素覆盖掉

8、指定位置插:

多传一个参数,将pos传过来,就是要删除第几个元素,需要将pos后面的全部元素后移一位,腾出一个位置个pos的元素

9、指定位置删 :

将pos之后的数据前挪一下

10、查找:

遍历,返回下标即可

11、打印:

又是遍历

12、销毁:

直接对指针销毁即可,因为在动数据时,我们没有改变指针的地址,所以可以直接free掉

 四、代码

SeqList.h头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int SLDataType;

typedef struct SeqList {
	SLDataType* arr;//存储的数据
	int size;//有效数据个数;
	int capacity;//空间容量(字节)

}SL;

//初始化结构表
void SLInit(SL* ps);
// 数据表的销毁
void SLDestroy(SL* ps);
//扩容:
void SLCheckCapacity(SL* ps);
//顺序表的打印: 
void SLPrint(SL ps);
//数据表的插入与删除;
//尾插:
void SLPushBack(SL* ps, SLDataType x);
//尾删
void SLPopBack(SL* ps);
//头插:
void SLPushFront(SL* ps, SLDataType x);
//头删:
void SLPopFront(SL* ps);
//指定位置插:
void SLInsert(SL* ps, int pos, SLDataType x);
//指定位置删:
void SLErase(SL* ps, int pos);
//查找:
int SLFind(SL* ps, SLDataType x);

SeqList.c源文件

#define _CRT_SECURE_NO_WARNINGS 3
#include"SeqLIst.h"
//初始化结构表
void SLInit(SL* ps)
{
	//空指针
	ps->arr = NULL;
	//数据和内容都为0
	ps->size = ps->capacity = 0;

}
//数据表的销毁:将申请的动态内存销毁掉;
void SLDestroy(SL* ps) 
{
	if (ps->arr)
	{
		free(ps->arr);
	}
	ps->arr = NULL;
}
//查找
int SLFind(SL* ps, SLDataType x)
{
	assert(ps);
	int i;
	for (i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x)
		{
			//返回找到的下标
			return i;
		}
	}
	return -1;
}
//打印:
void SLPrint(SL ps)
{
	int i;
	for (i = 0; i < ps.size; i++)
	{
		printf("%d\n", ps.arr[i]);
	}
	printf("数据个数:%d\n", ps.size);

}
//扩容:
void SLCheckCapacity(SL* ps)
{
	//断言,防止顺序表传空指针
	assert(ps);
	//若是没有则先给定义一个:没有则申请4个空间
	int newcapacity = (ps->capacity == 0 ? 4 : 2 * (ps->capacity));
	//查看空间够不够:当空间大小与有效数据个数相同时。说明空间不够
	if (ps->capacity == ps->size)
	{
		//要先申请空间:申请的内存为 容量*空间大小 
		SLDataType* pa = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));
		//判断申请是否成功:
		if (pa == NULL)
		{
			perror("realloc");
			return 1;
		}
		//成功了:
		//将空间给arr
		ps->arr = pa;
		//将改好的空间容量赋值给capacity;
		ps->capacity = newcapacity;
	}

}
//头插:
void SLPushFront(SL* ps, SLDataType x)
{
	//先确定是否需要扩容;
	SLCheckCapacity(ps);
	//先将数据整体后移
	int i;
	for (i = ps->size; i > 0; i--)
	{
		//前一个往后放置:
		ps->arr[i] = ps->arr[i - 1];
	}
	//尾插:
	ps->arr[0] = x;
	ps->size++;
}
//头删
void SLPopFront(SL* ps)
{
	assert(ps);
	assert(ps->arr);
	int i;
	for (i = 1; i < ps->size; i++)//(i=0;i<ps->size-1;i++)
	{
		ps->arr[i - 1] = ps->arr[i];//(ps->arr[i] = ps->arr[i+1]);
	}
	ps->size--;
}
//尾插:
void SLPushBack(SL* ps, SLDataType x)
{
	//先确定是否需要扩容;
	SLCheckCapacity(ps);
	//插入数据:
	ps->arr[ps->size++] = x;

}
//尾删:
void SLPopBack(SL* ps)
{
	//断言!防止传空指针!
	assert(ps);
	//防止数据为空!
	assert(ps->arr);
	//数据个数减一即可;
	ps->size--;
}
//指定位置插:pos为下标
void SLInsert(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	//下标必须在[0,size);
	assert(pos >= 0 && pos < ps->size);
	SLCheckCapacity(ps);
	int i;
	for (i = ps->size; i > pos; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[pos] = x;
	ps->size++;
}
//指定位置删:
void SLErase(SL* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	int i;
	for (i = pos; i < ps->size-1; i++)
	{
		//后往前摞
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

test.c测试文件

#define _CRT_SECURE_NO_WARNINGS 3
#include"SeqList.h"

//测试;
void SLest01()
{
	SL arr;
	//初始化:
	SLInit(&arr);
	//尾插:
	SLPushBack(&arr, 5);
	SLPushBack(&arr, 6);
	//头插:
	SLPushFront(&arr, 7);
	SLPushFront(&arr, 8);
	//打印,值传递即可!
	SLPrint(arr); 
	//指定插入:
	SLInsert(&arr, 0, 99);
	//指定位置删
	SLErase(&arr, 0);

	//尾删:
	//SLPopBack(&arr);
	//头删:
	//SLPopFront(&arr);
	SLPrint(arr);

	int FInd = SLFind(&arr, 99);
	if (FInd < 0)
	{
		printf("没找到");
	}
	else
	{
		printf("找到了!");
	}

	SLDestroy(&arr);


}



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

你的三连就是对博主最大的支持!

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

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

相关文章

安卓实现视频录制与显示和翻转摄像头

权限&#xff1a; <!-- 相机权限 --> <uses-featureandroid:name"android.hardware.camera"android:required"false" /> <uses-permission android:name"android.permission.CAMERA" /><!-- 录音权限&#xff08;包括麦克…

企业网站从传统服务器迁移到弹性云有什么优势呢?

现代企业对于网站和应用程序的可用性和性能要求越来越高&#xff0c;传统基础设施可能无法满足这些需求。弹性云作为一种新兴的云计算服务模式&#xff0c;对于企业网站的运行和管理带来了许多优势。下面是企业网站从传统服务器迁移到弹性云的五大优势&#xff1a; 灵活弹性&a…

数据结构(一)绪论

2024年5月11日 一稿 数据元素+数据项 逻辑结构 集合 线性结构 树形结构 </

水表智能抄表系统是什么?

水表智能抄表系统是一种现代化水资源保护专用工具&#xff0c;它利用先进的物联网、云计算和大数据剖析&#xff0c;完成了智能抄表、实时监控系统、数据分析等作用&#xff0c;大大提高了水务管理的效率和精确性。 1.功能特点 1.1远程控制自动抄表 传统水表抄水表方法采用人…

SAP-CentralFinance - 会计核算中的组织要素 - 学习心得1

1. 定义SAP组织架构和理解各组织架构含义 组织结构遍布SAP 系统的所有重要功能范围。FI 中最重要的组织要素是公司代码。它是“财务会计”中的最小组织单位,可以为其编制自主式完整科目集供外部报告使用。其他重要的组织要素是利润中心业务范围和段。您可以为各个利润中…

Linux系统编程——进程控制

目录 一&#xff0c;进程创建 1.1 fork回顾 1.2 写时拷贝 1.3 fork用处 1.4 fork调用失败原因 二&#xff0c;进程退出 2.1 进程退出场景 2.2 mainCRTStartup调用 2.3 进程退出码 2.3.1 main函数返回值 2.3.2 strerror ​编辑 2.3.3 命令的退出码 2.4 进程正常退…

LeetCode-258. 各位相加【数学 数论 模拟】

LeetCode-258. 各位相加【数学 数论 模拟】 题目描述&#xff1a;解题思路一&#xff1a;循环解题思路二&#xff1a;进阶 O(1)解题思路三&#xff1a; 题目描述&#xff1a; 给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。返回这个…

记录一次pods 导入 SocketRocket库的经历

折腾一上午&#xff0c;brew 安装成功了 cococapod 然后项目启动下载一个SocketRocket库 下载成功后总是报错&#xff1a; 睡了2个多小时&#xff0c;我在qq就交流群里求助&#xff1a; 终于把项目管理&#xff0c;在命令行里执行这句&#xff1a; open chat_app.xcworkspace…

企业破产重整:从“至暗时刻”到“涅槃重生”

今天我们不谈星辰大海&#xff0c;而是要潜入商业世界的深海区&#xff0c;探索那些濒临绝境的企业是如何借助“破产重整”的神秘力量&#xff0c;实现惊天大逆转的&#xff01; 一、破产重整&#xff0c;到底是个啥&#xff1f; 想象一下&#xff0c;企业像是一位远航的船长…

【Redis】Redis 事务

Redis 的事务的本质是一组命令的批处理。这组命令在执行过程中会被顺序地、一次性 全部执行完毕&#xff0c;只要没有出现语法错误&#xff0c;这组命令在执行期间不会被中断 1.事务特性 仅保证了数据的一致性 这组命令中的某些命令的执行失败不会影响其它命令的执行&#xff…

geoserver SQL注入、Think PHP5 SQL注入、spring命令注入

文章目录 一、geoserver SQL注入CVE-2023-25157二、Think PHP5 SQL注入三、Spring Cloud Function SpEL表达式命令注入&#xff08;CVE-2022-22963&#xff09; 一、geoserver SQL注入CVE-2023-25157 介绍&#xff1a;GeoServer是一个开源的地理信息系统&#xff08;GIS&#…

Java 开发 框架安全:Spring 漏洞序列.(CVE-2022-22965)

什么叫 Spring 框架. Spring 框架是一个用于构建企业级应用程序的开源框架。它提供了一种全面的编程和配置模型&#xff0c;可以简化应用程序的开发过程。Spring 框架的核心特性包括依赖注入&#xff08;Dependency Injection&#xff09;、面向切面编程&#xff08;Aspect-Or…

clang:在 Win10 上编译 MIDI 音乐程序(二)

先从 Microsoft C Build Tools - Visual Studio 下载 1.73GB 安装 "Microsoft C Build Tools“ 访问 Swift.org - Download Swift 找到 Windows 10&#xff1a;x86_64 下载 swift-5.10-RELEASE-windows10.exe 大约490MB 建议安装在 D:\Swift\ &#xff0c;安装后大约占…

VPN方案和特点

VPN方案和特点 VPN&#xff0c;或者称为虚拟专用网络&#xff0c;是一种保护你的在线安全和隐私的技术。它可以创建一个加密的连接&#xff0c;使你的在线活动对其他人不可见。以下是一些常见的VPN协议和它们的特点&#xff1a; 开放VPN (OpenVPN)&#xff1a;这是一种极为可…

【京东电商API接口】 | 京东某商品销量数据分析可视化

Python当打之年 当打之年&#xff0c;专注于各领域Python技术&#xff0c;量的积累&#xff0c;质的飞跃。后台回复&#xff1a;【可视化项目源码】可获取可视化系列文章源码和数据 本期将利用Python分析「京东商品数据接口」&#xff0c;希望对大家有所帮助&#xff0c;如有疑…

BGP第二篇(bgp邻居状态及影响邻居建立的因素)

1、bgp邻居状态 BGP对等体的交互过程中存在6种状态机&#xff1a; 空闲&#xff08;Idle&#xff09; 连接&#xff08;Connect&#xff09; 活跃 &#xff08;Active&#xff09; Open报文已发送&#xff08;OpenSent&#xff09; Open报文已确认&#xff08;OpenConfirm&…

autodl 上 使用 LLaMA-Factory 微调 中文版 llama3

autodl 上 使用 LLaMA-Factory 微调 中文版 llama3 环境准备创建虚拟环境下载微调工具 LLaMA-Factory下载 llama3-8B开始微调测试微调结果模型合并后导出vllm 加速推理 环境准备 autodl 服务器&#xff1a; https://www.autodl.com/console/homepage/personal 基本上充 5 块钱…

前端框架-echarts

Echarts 项目中要使用到echarts框架&#xff0c;从零开始在csdn上记笔记。 这是一个基础的代码&#xff0c;小白入门看一下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" co…

什么可以替代iframe?

网页嵌套中&#xff0c;iframe曾几何时不可一世&#xff0c;没有其他更好的选择&#xff01; iframe即内联框架&#xff0c;作为网页设计中的一种技术&#xff0c;允许在一个网页内部嵌套另一个独立的HTML文档。尽管它在某些场景下提供了便利&#xff0c;但也存在多方面的缺陷…

可视化实验三 Matplotlib库绘图及时变数据可视化

1.1 任务一 1.1.1 恢复默认配置 #绘图风格&#xff0c;恢复默认配置 plt.rcParams.update(plt.rcParamsDefault)#恢复默认配置 或者 plt.rcdefaults() 1.1.2 汉字和负号的设置 import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"]"SimH…