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

news2024/12/25 1:08:57

                        ✨✨✨专栏:数据结构     

          🧑‍🎓个人主页: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;
}

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

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

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

相关文章

东南亚服务器租用托管的优势

东南亚地区在国际贸易领域展现出了巨大的潜力和吸引力&#xff0c;其未来的外贸发展前景被认为是广阔且充满了无限商机。这一地区以其人口众多、经济快速发展的特点&#xff0c;结合独特的地理优势和丰富的自然资源&#xff0c;正在吸引全球企业的目光。今天我们一起来看看东南…

YOLOv8火焰与烟雾智能检测系统

项目概述&#xff1a; 本项目旨在开发一款高效、实时的火焰与烟雾检测系统&#xff0c;利用先进的深度学习技术——YOLOv8&#xff0c;为安全监控领域提供智能化解决方案。系统不仅能够准确识别视频流或静态图像中的火焰与烟雾&#xff0c;还配备了用户友好的图形界面&#xff…

C++ | Leetcode C++题解之第79题单词搜索

题目&#xff1a; 题解&#xff1a; class Solution { public:bool exist(vector<vector<char>>& board, string word) {rows board.size();cols board[0].size();for(int i 0; i < rows; i) {for(int j 0; j < cols; j) {if (dfs(board, word, i, …

答辩PPT制作太费时?AI工具帮你节省时间

在我原本的认知里面&#xff0c;答辩PPT是要包含论文各个章节的&#xff0c;在答辩时需要方方面面都讲到的&#xff0c;什么摘要、文献综述、实证分析、研究结果样样不落。但是&#xff0c;这大错特错&#xff01; 答辩PPT环节时长一般不超过5分钟&#xff0c;老师想要的答辩P…

精益数字化是什么

在传统的生产过程中&#xff0c;存在很多工作是重复且无价值的&#xff0c;这些工作通常需要花费大量的时间和人力&#xff0c;而且容易出现错误。例如人工测量和记录、纸质文档管理、手工排序和分类等&#xff0c;为了解决这个问题。通过引入精益生产和数字化解决方案&#xf…

springboot基本使用九(redis和springcache缓存)

为什么使用缓存: 减少数据库访问次数,从而提高应用程序的性能 redis可以缓存为啥要和spring cache一起使用? redis缓存:是内存级的缓存。它是使用单纯的内存来进行缓存 spring cache缓存:使用JVM的内存来缓存对象的,这势必会造成大量的内存消耗。但好处是显然的:使用方…

Git详解之五:分布式Git

为了便于项目中的所有开发者分享代码&#xff0c;我们准备好了一台服务器存放远程 Git 仓库。经过前面几章的学习&#xff0c;我们已经学会了一些基本的本地工作流程中所需用到的命令。接下来&#xff0c;我们要学习下如何利用 Git 来组织和完成分布式工作流程。 特别是&#…

UML之用例图

1.用例图 用例图指参与者&#xff0c;用例&#xff0c;边界以及它们之间的关系构成的用于描述系统功能的视图。说明是谁要使用系统&#xff0c;以及可以使用该系统可以做些什么。展示了一个外部用户能够观察到的系统功能模型图 2.用例图的元素 &#xff08;1&#xff09;参与…

使用Postman来调用Salesforce Bulk API 2.0的方法

简介 Bulk API 2.0 可以支持大量数据增删改查&#xff0c; 用新版的Dataloader也可以进行访问&#xff0c;但Dataloader会把CSV里的数据先转成Bean对象&#xff0c;这样会耗费大量的时间&#xff0c;而且数据量过大会卡死&#xff0c;所以直接上传CSV会节省大量时间和避免卡死风…

【Matlab】Matlab之美,抓紧来膜拜大神的创星之作(附2024Matlab教程+代码)

软件介绍 MATLAB是一款商业数学软件&#xff0c;用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境&#xff0c;主要包括MATLAB和Simulink两大部分&#xff0c;可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序…

目标检测算法YOLOv8简介

YOLOv8论文尚未发布&#xff0c;YOLOv8由Ultralytics公司推出并维护&#xff0c;源码见&#xff1a;https://github.com/ultralytics/ultralytics &#xff0c;于2024年1月发布v8.1.0版本&#xff0c;最新发布版本为v8.2.0&#xff0c;License为AGPL-3.0。 以下内容主要来自&am…

ArkTS开发原生鸿蒙HarmonyOS短视频应用

HarmonyOS实战课程“2024鸿蒙零基础快速实战-仿抖音App开发&#xff08;ArkTS版&#xff09;”已经于今日上线至慕课网&#xff08;https://coding.imooc.com/class/843.html&#xff09;&#xff0c;有致力于鸿蒙生态开发的同学们可以关注一下。 课程简介 本课程以原生鸿蒙Ha…

css案例 tab上下滚动,左右滚动

效果图&#xff1a; 完整代码&#xff1a; <template><view class"content"><view class"content-item"><view class"content-title"><h4>美食热搜</h4><ul><li>火鸡面</li><li>糖…

【数据结构】第五讲:栈和队列

个人主页&#xff1a;深情秋刀鱼-CSDN博客 数据结构专栏&#xff1a;数据结构与算法 源码获取&#xff1a;数据结构: 上传我写的关于数据结构的代码 (gitee.com) 目录 一、栈 1.栈的定义 2.栈的实现 a.栈结构的定义 b.初始化 c.扩容 d.入栈 e.出栈 f.打印 g.取栈顶元素…

【详细教程】基于pyEchart的封装(附代码)

目 录 一、项目结构 二、文件封装 2.1echart.py 2.2pyechartMock.py 三、结果 3.1柱状图 3.2折线图 3.3饼状图 最近在学习pyechart&#xff0c;老师要我们画几个简单的图&#xff0c;比如折线图&#xff0c;柱状图&#xff0c;饼状图&#xff0c;我这里在参考pyechart…

c++ 获取机器码

看到网上代码代码都没什么好的&#xff0c;自己备用一个 #include <iostream> #include <string> #include <sstream> #include <iomanip> #include <Windows.h> #include <iphlpapi.h> // 包含这个头文件以获取 PIP_ADAPTER_INFO #inclu…

NSSCTF | [SWPUCTF 2021 新生赛]easyrce

这是一道很简单的RCE&#xff08;远程命令执行&#xff09;&#xff0c;打开题目后可以看到一个php脚本。 <?php error_reporting(0); highlight_file(__FILE__); if(isset($_GET[url])) { eval($_GET[url]); } ?> 直接传入url参数就可以执行相应的命令&#xff0c;先…

求职网络安全:这个领域的就业机会正在增长

随着大安全时代的到来&#xff0c;网络安全已经从虚拟空间延伸到现实空间。当今网络战愈演愈烈&#xff0c;网络军备赛即将来临。网络空间领域的战争归根到底还是人才的竞争。面对新形势,建立高效的网络安全人才培养体系对中国信息安全产业发展和保证国家安全来讲都至关重要! 目…

AnythingLLM+Ollama构建本地知识库

前言 这是一个全栈应用程序&#xff0c;可以将任何文档、资源&#xff08;如网址链接、音频、视频&#xff09;或内容片段转换为上下文&#xff0c;以便任何大语言模型&#xff08;LLM&#xff09;在聊天期间作为参考使用。此应用程序允许您选择使用哪个LLM或向量数据库&#…

【MySQL 数据宝典】【事务锁】- 002 事务控制的演进

一、事务处理思路 1.1 排队 排队处理是事务管理最简单的方法&#xff0c;就是完全顺序执行所有事务的数据库操作&#xff0c;不需要加锁&#xff0c;简单的说就是全局排队。序列化执行所有的事务单元&#xff0c;数据库某个时刻只处理一个事务操作&#xff0c;特点是强一致性…