顺序表(数据结构与算法)

news2024/12/26 16:56:55

请添加图片描述
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 无人扶我青云志 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 我自踏雪之山巅🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

🍋顺序表

  • 🍌顺序表的定义
  • 🍌顺序表的结构
    • 🍍静态顺序表
    • 🍍动态顺序表
  • 🍌顺序表接口的实现(增删查改)
    • 🍍其它接口
    • 🍍顺序表初始化
    • 🍍检查空间是否增容(空间满了就增容)
    • 🍍顺序表尾插
    • 🍍顺序表尾删
    • 🍍顺序表头插
    • 🍍顺序表头删
    • 🍍顺序表查找
    • 🍍顺序表在pos位置插入x
    • 🍍顺序表删除pos位置的值
    • 🍍顺序表修改pos位置的值
    • 🍍顺序表销毁
    • 🍍顺序表打印
  • 🍌顺序表整体代码的实现

🍌顺序表的定义

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

在这里插入图片描述

线性表:线性表是最基本、最简单、也是最常用的一种数据结构。大部分线性表除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。而又一些小部分,比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点

🍌顺序表的结构

🍍静态顺序表

静态顺序表就是以一定长度的数组来存储元素

//静态存储
#define  N  5
typedef int SLDetatype ;
typedef struct SeqList
{
	SLDetatype a[N] ;//有限空间的数组
	int size ;//有效的数据个数
}SeqList;

在这里插入图片描述

🍍动态顺序表

动态顺序表使用动态开辟的数组来存储元素

//动态存储
typedef  int SLDetatype ;
typedef struct SeqList
{
	SLDetatype *a ;   //指向动态开辟的数组
	int size ;       //有效的数据个数
	int capicity ;   //空间的容量
}SeqList;

在这里插入图片描述

🍌顺序表接口的实现(增删查改)

🍍其它接口

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

typedef int SLDatatype;
typedef struct SeqList
{
	SLDatatype* a;
	int capacity;
	int size;
}SeqList;

🍍顺序表初始化

void SeqListInit(SeqList* ps)
{
	ps->a = NULL;            
	//在初始情况我们可以直接置空
	//当然也可以创建空间,看自己习惯
	ps->capacity = ps->size = 0;
}

🍍检查空间是否增容(空间满了就增容)

void CheckCapacity(SeqList* ps)
{
	assert(ps);
	//在两个相等时,空间可能会满,还可能空间为0,这是因为我们在初始化没有创建空间导致
	if (ps->capacity == ps->size)
	{
		if (ps->capacity == 0)
			ps->capacity = 2;
		else
			ps->capacity *= 2;
		int newcapacity = ps->capacity;
		//在扩容时,我们都是利用realloc,创建空间利用malloc
		SLDatatype* cur = (SLDatatype*)realloc(ps->a, sizeof(SLDatatype) * newcapacity);
		if (cur == NULL)
		{
			perror("realloc   faild");
			exit(-1);
		}
		ps->a = cur;
		ps->capacity = newcapacity;
	}
}

大家如果对于malloc和realloc以及空间的创建的用法有些遗忘,可以看我这篇博客:动态内存管理(这是一个链接,有需要的朋友可以直接点进去)

🍍顺序表尾插

void SeqListPushBack(SeqList* ps, SLDatatype x)
{
	assert(ps);
	CheckCapacity(ps);  //需要检查空间是否满或者空
	ps->a[ps->size] = x;
	(ps->size)++;
}

在这里插入图片描述

🍍顺序表尾删

//顺序表尾删
void SeqListPopBack(SeqList* ps)
{
	assert(ps);
	assert(ps->size > 0);  //检查数据个数是否为0,如果为0就不执行,反之亦然
	(ps->size)--;
}

在这里插入图片描述

🍍顺序表头插

// 顺序表头插
void SeqListPushFront(SeqList* ps, SLDatatype x)
{
	assert(ps);
	CheckCapacity(ps);//判断空间是否满还是空
	//注意头插要分两种情况
	//第一种是数组里没有元素,此时头插就是相当于尾插
	//第二种是数组里有元素,这时就先把整体元素往后移动一位
	if (ps->size - 1 == 0)
	{
		ps->a[ps->size -1] = x;
		(ps->size)++;
	}
	else
	{
		int end = ps->size - 1;
		while (end >= 0)
		{
			ps->a[end + 1] = ps->a[end];
			end--;
		}
		ps->a[0] = x;
		(ps->size)++;
	}
}

注意
注意头插要分两种情况
(1)第一种是数组里没有元素,此时头插就是相当于尾插
(2)第二种是数组里有元素,这时就先把整体元素往后移动一位

在这里插入图片描述

🍍顺序表头删

// 顺序表头删
void SeqListPopFront(SeqList* ps)
{
	assert(ps);
	assert(ps->size > 0);
	//注意头删要分两种情况
	//第一种是数组里没有元素,此时头删就是相当于尾删
	//第二种是数组里有元素,这时就需要把除了第一个元素外的所有元素往前移动一位,把原来的第一位元素覆盖
	if (ps->size - 1 == 0)
	{
		(ps->size)--;
	}
	else
	{
		int end = 0;
		while (end < ps->size - 1)
		{
			ps->a[end] = ps->a[end + 1];
			end++;
		}
		(ps->size)--;
	}
}

注意:
注意头删要分两种情况
(1)第一种是数组里没有元素,此时头删就是相当于尾删
(2)第二种是数组里有元素,这时就需要把除了第一个元素外的所有元素往前移动一位,把原来的第一位元素覆盖

在这里插入图片描述

🍍顺序表查找

// 顺序表查找
int SeqListFind(SeqList* ps, SLDatatype x)
{
	assert(ps);
	int i = 0;
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
			return 1;
	}
	return -1;
}

🍍顺序表在pos位置插入x

// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLDatatype x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	CheckCapacity(ps);
	int i = 0;
	for (i = pos - 1; i < ps->size - 1; i++)
	{
		ps->a[i + 1] = ps->a[i];
	}
	ps->a[pos-1] = x;
	(ps->size)++;
}

注意:pos必须在0到ps->size之间

在这里插入图片描述

🍍顺序表删除pos位置的值

// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	int i = 0;
	for (i = pos - 1; i < ps->size - 1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	(ps->size)--;
}

注意:pos必须在0到ps->size之间

🍍顺序表修改pos位置的值

//顺序表修改pos位置的值
void SeqModify(SeqList* ps, int pos, SLDatatype x)
{
	assert(ps);

	assert(pos >= 0 && pos < ps->size);

	ps->a[pos - 1] = x;
}

🍍顺序表销毁

// 顺序表销毁
void SeqListDestory(SeqList* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}

🍍顺序表打印

// 顺序表打印
void SeqListPrint(SeqList* ps)
{
	assert(ps);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

🍌顺序表整体代码的实现

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

typedef int SLDatatype;
typedef struct SeqList
{
	SLDatatype* a;
	int capacity;
	int size;
}SeqList;

//顺序表初始化
void SeqListInit(SeqList* ps)
{
	ps->a = NULL;
	ps->capacity = ps->size = 0;
}

//检查空间,如果满了就增容
void CheckCapacity(SeqList* ps)
{
	assert(ps);
	if (ps->capacity == ps->size)
	{
		if (ps->capacity == 0)
			ps->capacity = 2;
		else
			ps->capacity *= 2;
		int newcapacity = ps->capacity;
		SLDatatype* cur = (SLDatatype*)realloc(ps->a, sizeof(SLDatatype) * newcapacity);
		if (cur == NULL)
		{
			perror("realloc   faild");
			exit(-1);
		}
		ps->a = cur;
		ps->capacity = newcapacity;
	}
}

//顺序表尾插
void SeqListPushBack(SeqList* ps, SLDatatype x)
{
	assert(ps);
	CheckCapacity(ps);
	ps->a[ps->size] = x;
	(ps->size)++;
}

//顺序表尾删
void SeqListPopBack(SeqList* ps)
{
	assert(ps);
	assert(ps->size > 0);
	(ps->size)--;
}

// 顺序表头插
void SeqListPushFront(SeqList* ps, SLDatatype x)
{
	assert(ps);
	CheckCapacity(ps);
	if (ps->size == 0)
	{
		ps->a[ps->size] = x;
		(ps->size)++;
	}
	else
	{
		int end = ps->size - 1;
		while (end >= 0)
		{
			ps->a[end + 1] = ps->a[end];
			end--;
		}
		ps->a[0] = x;
		(ps->size)++;
	}
}

// 顺序表头删
void SeqListPopFront(SeqList* ps)
{
	assert(ps);
	assert(ps->size > 0);
	if (ps->size - 1 == 0)
	{
		(ps->size)--;
	}
	else
	{
		int end = 0;
		while (end < ps->size - 1)
		{
			ps->a[end] = ps->a[end + 1];
			end++;
		}
		(ps->size)--;
	}
}

// 顺序表查找
int SeqListFind(SeqList* ps, SLDatatype x)
{
	assert(ps);
	int i = 0;
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
			return 1;
	}
	return -1;
}

// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLDatatype x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	CheckCapacity(ps);
	int i = 0;
	for (i = pos - 1; i < ps->size - 1; i++)
	{
		ps->a[i + 1] = ps->a[i];
	}
	ps->a[pos-1] = x;
	(ps->size)++;
}

// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	int i = 0;
	for (i = pos - 1; i < ps->size - 1; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	(ps->size)--;
}

// 顺序表销毁
void SeqListDestory(SeqList* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}

// 顺序表打印
void SeqListPrint(SeqList* ps)
{
	assert(ps);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}


//顺序表修改pos位置的值
void SeqModify(SeqList* ps, int pos, SLDatatype x)
{
	assert(ps);

	assert(pos >= 0 && pos < ps->size);

	ps->a[pos - 1] = x;
}

void test1()
{
	SeqList cur;
	SeqListInit(&cur);
	SeqListPushBack(&cur, 500);//尾插
	SeqListPushBack(&cur, 400);//尾插
	SeqListPushBack(&cur, 300);//尾插
	SeqListPrint(&cur);

	SeqListPopBack(&cur);//尾删
	SeqListPrint(&cur);

	SeqListPushFront(&cur, 100);//头插
	SeqListPushFront(&cur, 200);//头插
	SeqListPushFront(&cur, 600);//头插
	SeqListPrint(&cur);

	SeqListPopFront(&cur); //头删
	SeqListPrint(&cur);

	if (SeqListFind(&cur,200) == 1)//元素查找
		printf("找到了\n");
	else
	{
		printf("没有找到\n");
	}

	SeqListInsert(&cur, 3, 999);//在pos位置插入x
	SeqListPrint(&cur);

	SeqListErase(&cur, 3);//删除pos位置的值
	SeqListPrint(&cur);

	SeqModify(&cur, 3, 666); //修改pos位置的值
	SeqListPrint(&cur);
}

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

请添加图片描述

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

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

相关文章

【Spring】AOP进阶-JoinPoint和ProceedingJoinPoint详解

文章目录 1. 前言2. JoinPoint简介3. 获取被增强方法的相关信息4. ProceedingJoinPoint简介5. 获取环绕通知方法的相关信息6. 总结 1. 前言 在Spring AOP中&#xff0c;JoinPoint和ProceedingJoinPoint都是关键的接口&#xff0c;用于在切面中获取方法的相关信息以及控制方法的…

国科大数据挖掘期末复习——聚类分析

聚类分析 将物理或抽象对象的集合分组成为由类似的对象组成的多个类的过程被称为聚类。由聚类所生 成的簇是一组数据对象的集合&#xff0c;这些对象与同一个簇中的对象彼此相似&#xff0c;与其他簇中的对象相异。 聚类属于无监督学习&#xff08;unsupervised learning&…

整形数据和浮点型数据在内存中的存储差别

愿所有美好如期而遇 我们先来看代码&#xff0c;猜猜结果是什么呢&#xff1f; int main() {//以整型数据的方式存储int n 10;float* m (float*)&n;//以整型数据的方式读取printf("%d\n", n);//以浮点型数据的方式2读取printf("%f\n", *m);printf(&…

揭秘“ChatGPT之父”突遭罢免内幕:从开发者大会起,几件事已有征兆

腾讯新闻《潜望》 纪振宇 发自硅谷 美国时间11月17日午间&#xff0c;OpenAI首席执行官&#xff0c;被称为“ChatGPT之父”的山姆奥特曼突遭董事会罢免。 OpenAI在当天发布的官方声明称&#xff0c;董事会启动了一项特别的调查&#xff0c;结论是奥特曼在与董事会沟通过程中没…

基于JAYA算法优化概率神经网络PNN的分类预测 - 附代码

基于JAYA算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于JAYA算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于JAYA优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

深度学习乳腺癌分类 计算机竞赛

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

嵌入式中一篇搞定Cmake使用教程

今天分享一篇关于 cmake 的相关文章&#xff0c;通过这个工具可以生成本地的Makefile。让我们不用去编写复杂的Makefile。 引言 CMake是开源、跨平台的构建工具&#xff0c;可以让我们通过编写简单的配置文件去生成本地的Makefile&#xff0c;这个配置文件是独立于运行平台和…

数学才是顶级码农的核心修养,码农怎样搞好数学?来看看这些网友强推的数学神作!文末评论区进行评论参与送书哟

文章目录 导读 一&#xff1a;基础篇 1&#xff1a;优美的数学思维&#xff1a;问题求解与证明 2&#xff1a;数学分析 3&#xff1a;线性代数 4&#xff1a;线性代数及其应用 5&#xff1a;代数 二&#xff1a;进阶篇 1&#xff1a;初等数论及其应用 2&#xff1a;数…

【Linux网络】从原理到实操,感受PXE无人值守自动化高效批量网络安装系统

一、PXE网络批量装机的介绍 1、常见的三种系统安装方式 2、回顾系统安装的过程&#xff0c;了解系统安装的必要条件 3、什么是pxe 4、搭建pxe的原理 5、Linux的光盘镜像中的isolinux中的相关文件学习 二、关于实现PXE无人值守装机的四大文件与五个软件的对应关系详解 5个…

基于Python实现大型家用电器和电子产品在线商店购买数据分析【500010098】

导入模块 import pandas as pd import numpy as np import matplotlib.pyplot as plt获取数据 df pd.read_csv( r"./data/kz.csv",sep,)数据描述 该数据包含2020年4月至2020年11月从大型家用电器和电子产品在线商店购买的数据。 数据说明 event_time&#xff1a…

嵌入式中一文搞懂ARM处理器架构

1、嵌入式处理器基础 典型的微处理器由控制单元、程序计数器&#xff08;PC&#xff09;、指令寄存器&#xff08;IR&#xff09;、数据通道、存储器等组成 。 指令执行过程一般分为&#xff1a; 取指&#xff1a; 从存储器中获得下一条执行的指令读入指令寄存器&#xff1b;…

Redis篇---第六篇

系列文章目录 文章目录 系列文章目录前言一、Redis 为什么设计成单线程的?二、什么是 bigkey?会存在什么影响?三、熟悉哪些 Redis 集群模式?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,…

从0开始学习JavaScript--JavaScript 流程控制

JavaScript中的流程控制结构是编写结构化、可读性强的代码的关键。本文将深入研究JavaScript中的流程控制&#xff0c;包括条件语句、循环结构、跳转语句等&#xff0c;并通过丰富的示例代码来更全面地了解和运用这些概念。 条件语句 条件语句用于基于不同的条件执行不同的代…

基于PLC的污水厌氧处理控制系统(论文+源码)

1. 系统设计 污水厌氧由进水系统通过粗格栅和清污机进行初步排除大块杂质物体以及漂浮物等&#xff0c;到达除砂池中。在除砂池系统中细格栅进一步净化污水厌氧中的细小颗粒物体&#xff0c;将污水厌氧中的细小沙粒滤除后进入氧化沟反应池。在该氧化沟系统中进行生化处理&…

抖音直播间涨粉助手,其开发流程与需要的技术和代码分享

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、直播间涨人气的15种方法 直播间的人气就像水池中的水&#xff0c;想要有源源不断的流量&#xff0c;就要想办法把水龙头的水流开到最大&#xff0c;也就是要增加直播间曝光率&…

使用maven命令打包依赖

1、maven仓库地址 阿里云地址&#xff1a;https://developer.aliyun.com/mvn/search 中央仓库地址&#xff1a;https://mvnrepository.com/ 2、下载方式 在地址栏中输入要搜索的依赖 选择需要的版本 &#xff08;1&#xff09;直接复制 &#xff08;2&#xff09;pom下载 …

如何使用Gitlab搭建属于自己的代码管理平台

大家好&#xff0c;我是Mandy。今天分享的主题内容是如何使用GitLab搭建属于自己的代码管理平台。 为什么会单独分享这篇文章呢&#xff0c;相信在很多的开发同学任职的公司中&#xff0c;都用到了gitlab来做代码管理平台&#xff0c;同时结合GitLab的一些自动化功能&#xff…

均匀光源积分球的应用领域有哪些

均匀光源积分球的主要作用是收集光线&#xff0c;并将其用作一个散射光源或用于测量。它可以将光线经过积分球内部的均匀分布后射出&#xff0c;因此积分球也可以当作一个光强衰减器。同时&#xff0c;积分球可以实现均匀的朗伯体漫散射光源输出&#xff0c;整个输出口表面的亮…

基于算术优化算法优化概率神经网络PNN的分类预测 - 附代码

基于算术优化算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于算术优化算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于算术优化优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

【踩坑笔记】国科GK7202V300芯片开发常见问题解决办法

国科Linux芯片开发常见问题&解决办法 0.读前须知 不管什么时候&#xff0c;下载程序还是啥&#xff0c;一定要检查路径&#xff01;&#xff01;&#xff01;别问我为什么&#xff0c;呜呜呜~ tips&#xff1a;该芯片是仿造海思的产品&#xff0c;所以&#xff0c;有些不…