【数据结构】:顺序表专题

news2024/7/6 20:42:36

前言:今天我们开始介绍数据结构有关内容,那么数据结构是什么呢?

数据结构是计算机存储、组织数据的方式在工作中,我们通常会直接使用已经封装好的集合API(应用程序编程接口),这样可以更高效地完成任务。但是作为一名程序员,掌握数据结构是非常重要的,因为它可以帮助我们更好地理解和设计算法,从而提高程序的效率和可靠性。

一.🐶常见数据结构分类: 

二.顺序表概述: 

(一):何为顺序表?

本篇将介绍线性数据结构中的顺序表专题(Sequence List),其本质就是数组。 

一句话总结顺序表:顺序表就是经过封装后提供了许多现成方法的一种数据结构,其底层是数组。

那已经有了数组,为什么还需要顺序表呢?

当我们需要对数组中的某些数据进行处理(包括增删查改等),此时我们需要找到数组中有元素个数,再通过循环或其他方式插入,删除数据。这样以来就十分麻烦,而顺序表就方便解决了这些问题。

此外,顺序表是线性表的一种。

顺序表的特性:物理结构是连续的,逻辑结构一定是连续的 。

(物理结构:数据在内存上是连续存储的,是硬件层面上的;逻辑结构:数据按某种逻辑排序,有迹可循,是抽象意义上的)

(二)顺序表的分类:

试想我们如何写一个顺序表,我们知道顺序表本质是数组,那么对于数组我们有定长数组和动态内存开辟数组:

int arr[10]={0}:定长的数组

int* arr:动态内存开辟的数组,确定大小之后再去动态申请

那么对于顺序表也应该分为两种情况,分为静态顺序表动态顺序表: 

//静态顺序表定义:
struct Seqlist
{
	int arr[100];//定长的数组
	int size;//顺序表当前有效的数据个数
};

//动态顺序表:
struct SeqList
{
	int* arr;
	int size;//有效数据个数
	int capacity;//空间大小
};

那么哪一种方式更好呢?不难理解当然是动态顺序表更胜一筹,对于 静态顺序表,其中的数组是定长的,数组大小给小了,空间不够用;数组给大了,空间又浪费了。极不方便,而动态顺序表由于可以动态增容,因而我们选择这种实现方式。

三.顺序表的实现

接下来我们将就如何实现一个顺序表具体讲解,作为一个项目而言,代码量是庞大的,所以我们要创建多个文件,方便我们流畅地实现一个结构清晰的代码,我们需要创建三个文件:

test.c:主文件,也是测试文件;

Seqlist.c:顺序表主体,具体功能实现;

Seqlist.h:顺序表头文件,声明顺序表的结构,方法等。

 

1.Seqlist.h 

 

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

//我们选择动态顺序表

//存储的数据我们不能仅仅是int,还需要其他类型
typedef int SLDataType;
//当对应数据类型改变时,我们只需改变int,换成所需数据类型即可
//typedef struct Seqlist SL;

typedef struct Seqlist
{
	SLDataType* arr;
	int size;//有效数据个数
	int capacity;//空间大小
}SL;

//顺序表的初始化
void SLInit(SL* ps);

//容量检查
void SLCheckCapacity(SL* ps);

//头部插入删除/尾部插入删除
//尾插/头插
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);

//尾删/头删
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);

//顺序表的销毁
void SLDestroy(SL* ps);

//打印调试
void SLPrint(SL s);

Seqlist.h中包含着顺序表的结构以及顺序表中需要实现的函数的声明。

在实现顺序表的声明中我们的思路如下:1.选择合适的顺序表结构——动态顺序表;2.使用typedef拓展数据变量以及简化顺序表名称;3.依次声明实现不同功能的各部分函数。

2.Seqlist.c 

#include"Seqlist.h"
void SLInit(SL* ps)
{
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

void SLCheckCapacity(SL* ps)
{
	//插入之前先看空间够不够
	if (ps->capacity == ps->size)
	{
		//申请空间
		//malloc calloc realloc  int arr[100] --->增容:realloc
		//第一个问题:要申请多大的空间/一次增容多大? 答案:一般两倍增容
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(int));
		if (tmp == NULL)
		{
			perror("realloc fail!");
			exit(1);//直接退出,程序不再继续执行
		}
		//空间申请成功
		ps->arr = tmp;
		ps->capacity = newcapacity;
	}
}

void SLPushBack(SL* ps, SLDataType x)
{
	assert(ps);
	SLCheckCapacity(ps);
	/*ps->arr[ps->size] = x;
	++ps->size;*/
	ps->arr[ps->size++] = x;
}

void SLPushFront(SL* ps, SLDataType x)
{
	assert(ps);
	SLCheckCapacity(ps);
	for (int i = ps->size;i > 0;i--)
	{
		ps->arr[i] = ps->arr[i - 1];//arr[1]=arr[0]
	}
	ps->arr[0] = x;
	ps->size++;
}

void SLPopBack(SL* ps)
{
	assert(ps);
	assert(ps->size);
	--ps->size;
}

void SLPopFront(SL* ps)
{
	assert(ps);
	assert(ps->size);
	for (int i = 0;i <ps->size-1 ;i++)
	{
		ps->arr[i] = ps->arr[i + 1];//arr[size-2]=arr[size-1]
	}
	--ps->size;
}

void SLDestroy(SL* ps)
{
	if (ps->arr)
	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

void SLPrint(SL s)
{
	for (int i = 0;i <s.size;i++)
	{
		printf("%d ", s.arr[i]);
	}
	printf("\n");
}

Seqlist.c 中主要是具体实现Seqlist.h中声明的各函数,顺序最好按声明的顺序来,方便查找。

切记还要包含头文件"Seqlist,h”。

3.test.c

 

#include"Seqlist.h"

void SLTest01()
{
	SL sl;
	//SLInit(sl);
	//形参是实参的一份临时拷贝,都没有初始化,拷贝不过去
	SLInit(&sl);//传址
	//增删查找
	//尾插
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPrint(sl);
    //头插
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPrint(sl);
	SLPushFront(&sl, 5);
	SLPushFront(&sl, 6);
	SLPrint(sl);
    //头删
	SLPopFront(&sl);
	SLPopFront(&sl);
	SLPrint(sl);
    //尾删
	SLPopBack(&sl);
	SLPopBack(&sl);
	SLPrint(sl);
	SLDestroy(&sl);//销毁
}

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

test.c中主要是测试功能,检查顺序表是否能正常使用。

输出结果如下:

如图我们所实现的顺序表按照预期实现了对数据的增删查改。 

以上就是对数据结构中顺序表的概述以及基本实现方式,看一万遍不如手写一遍,其中有许多易错点和细节需要注意,大家最好是理解了后自己手写一遍,加深记忆,望屏幕前的你能有所收获!

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

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

相关文章

三角形最小路径和-java

题目描述: 给定一个三角形 triangle &#xff0c;找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 1 的两个结点。也就是说&#xff0c;如果正位于当前行的下标 i &#xff…

JavaScript教程:从基础到发展历程及语法规则的全面介绍

文章目录 一、JavaScript简介二、JavaScript发展历程三、JavaScript基础语法3.1、变量概念3.2、变量命名3.3、变量提升3.4、代码注释3.5、语句3.6、区块 四、总结 一、JavaScript简介 JavaScript 是一种高级的、解释型的编程语言&#xff0c;主要用于为网页添加交互性和动态效…

网络安全(防火墙,IDS,IPS概述)

问题一:什么是防火墙,IDS,IPS? 防火墙是对IP:port的访问进行限制,对访问端口进行制定的策略去允许开放的访问,将不放开的端口进行拒绝访问,从而达到充当防DDOS的设备。主要是拒绝网络流量,阻断所有不希望出现的流程,禁止数据流量流通,达到安全防护的作用。如将一些恶…

谷歌浏览器快捷键, VScode 快捷键

谷歌浏览器快捷键 谷歌浏览器跳转标签页的方式&#xff1a; control Tab 跳转下一个标签页 control shift tab 上一个标签页 command 1-8 跳转对应的标签页&#xff0c;而command 9 则是跳转最后一个标签页 Previous Tab 插件实现谷歌浏览器两个tab页来回切换。快捷键为…

JVM-结合MAT工具分析OOM问题

JVM-结合MAT工具分析OOM问题 启动项目前配置VM参数 -XX:UseParNewGC -XX:UseConcMarkSweepGC -Xms1m #初始化大小 -Xmx1m #最大值 -XX:PrintGCDetails -Xloggc:gc_dandan.log -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath./运行结果截图 使用MAT打开java_pid12164.hprof…

实时时钟模块RX8901CE具有数字温度补偿功能,助力工业设备实现精准控制

在工业控制领域&#xff0c;电子产品的工作温度范围较广&#xff0c;同样的产品将面对高温、低温等不同工况。对于时钟信号敏感的电路设计而言&#xff0c;温度变化将严重影响产品功能&#xff0c;因此需要高精度时钟来保证电路信号的稳定&#xff0c;这种情况下需要使用带数字…

Django实现的登录注册功能

1 前言 在Web开发中&#xff0c;用户登录和注册是最基本且必不可少的功能。Django&#xff0c;作为一个高级的Python Web框架&#xff0c;为我们提供了强大的工具和库来快速实现这些功能。下面&#xff0c;我将详细介绍如何使用Django来实现用户登录和注册功能。 2 功能介绍 …

使用Ollama在本地运行AI大模型gemma

1.下载&#xff1a; https://github.com/ollama/ollama/releases 2.配置环境变量 我的电脑-右键-属性-系统-高级系统设置-环境变量-【系统环境变量】新建 变量名&#xff1a;OLLAMA_MODELS &#xff08;固定变量名&#xff09; 变量值&#xff1a;E:\Ollama\Lib &#xff0…

【状态机dp】【 排序 】 2809使数组和小于等于 x 的最少时间

本文涉及知识点 【状态机dp】 排序 LeetCode 2809. 使数组和小于等于 x 的最少时间 给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒&#xff0c;对于所有下标 0 < i < nums1.length &#xff0c;nums1[i] 的值都增加 nums2[i] 。操作 完成后 &…

Vue.js高效前端开发(页面验证跳转,查)

效果图 代码&#xff1a; new.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><div id"app"><input type"text" name"" id"&…

SecureCRT通过私钥连接跳板机,再连接到目标服务器(图文教程)

文章目录 1. 配置第一个session&#xff08;跳板机&#xff09;2. 设置本地端口3. 设置全局firewall4. 配置第二个session&#xff08;目标服务器&#xff09; 服务器那边给了一个私钥&#xff0c;现在需要通过私钥连接跳板机&#xff0c;再连接到目标服务器上 &#x1f349; …

Softing WireXpert 4500线缆认证仪的独特之处——双控系统

Softing推出的WireXpert 4500线缆认证仪&#xff0c;可用于结构化布线认证&#xff0c;认证速率高达40Gb/s。该线缆认证仪专为实用性而设计&#xff0c;重量轻&#xff0c;手感舒适&#xff0c;主机与副机均配备6英寸工业LCD触摸屏&#xff0c;使其更适用于布线现场。 WireXper…

4.9总结

多线程 程序内部的执行路径就叫线程&#xff0c;为了满足需求同时执行多个任务&#xff0c;就有了多线程 多线程有两种应用方式&#xff1a; 第一种是并发&#xff1a;在同一时刻&#xff0c;有多个指令在单个CPU上交替运行 第二种是并行&#xff1a;在同一时刻&#xff0c…

网络网络层之(7)PPPOE协议

网络网络层之(7)PPPOE协议 Author: Once Day Date: 2024年4月7日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day…

搜维尔科技:Patchwork 3D工业仿真实时渲染,将CAD 数据转换成真实感的3D模型以用于工业用途

Patchwork 3D工业仿真 实时渲染点击跳转官网 从实时渲染到真实照片 根据工作阶段所需的逼真度&#xff0c;您可以使用三个渲染引擎&#xff0c;从最快的&#xff08;OpenGL&#xff0c;交互式&#xff09;到最逼真的&#xff08;光线跟踪&#xff0c;Iray物理逼真&#xff09;…

数据仓库的概念和作用?如何搭建数据仓库?

随着企业规模的扩大和数据量的爆炸性增长&#xff0c;有效管理和分析海量数据成为企业数字化转型的关键。而在互联网的普及过程中&#xff0c;信息技术已深入渗透各行业&#xff0c;逐渐融入企业的日常运营。然而&#xff0c;企业在信息化建设中面临了一系列困境和挑战&#xf…

皮灵顿靶机1

1 先在kali上扫描靶机ip地址 .1、.2、.254、.138都是kali自身的一些ip地址&#xff0c;所以在此确认要进行攻击的靶机的ip地址为&#xff1a;192.168.84.132 再查看端口&#xff0c;一个22端口一个80端口 我这里使用dirb&#xff0c;查看网站的信息 最特别的是robots.txt …

python如何去掉换行符

使用strip()函数去掉每行结束的\n。 strip()函数 声明&#xff1a;str为字符串&#xff0c;chars为要删除的字符序列。 str.strip(chars&#xff09;&#xff1a;删除s字符串中开头、结尾处&#xff0c;位于chars删除序列的字符。 str.lstrip(chars)&#xff1a;删除s字符串…

vue中使用axios获取不到响应头Content-Disposition的解决办法

项目中&#xff0c;后端返回的文件流; 前端需要拿到响应头里的Content-Disposition字段的值&#xff0c;从中获取文件名 在控制台Headers中可以看到相关的字段和文件名&#xff0c;但是在axios里面却获取不到 如果想要让客户端访问到相关信息&#xff0c;服务器不仅要在head…

maxpool long数据类型报错

报错&#xff1a; RuntimeError: “max_pool2d” not implemented for ‘Long’ 源码&#xff1a; import torch from torch import nn from torch.nn import MaxPool2dinput torch.tensor([[1, 2, 0, 3, 1],[0, 1, 2, 3, 1],[1, 2, 1, 0, 0],[5, 2, 3, 1, 1],[2, 1, 0, 1, 1…