【数据结构】顺序表

今天给大家带来的是顺序表相关知识的分享,喜欢的朋友可以三连一波!!!

顺序表

顺序表的基本结构:

在这里插入图片描述

顺序表的实现

我们将顺序表的实现分装成函数大概分为下面几类:

//初始化
void InitSL(SL* psl);
//打印数据
void SLPrint(SL* psl);
//销毁顺序表
void SLDestroy(SL* psl);
//尾插和尾删数据
void SLPushBack(SL* psl, SLDataType x);
void SLPopBack(SL* psl);
//头插和头删数据
void SLPushFront(SL* psl, SLDataType x);
void SLPopFront(SL* psl);
//任意位置插入删除数据
void SLInsert(SL* psl, int pos, SLDataType x);
void SLErase(SL* psl, int pos);

其中我们用一个结构体来实现数据的存放和计数,其中存放数据使用指针指向开辟的空间,而计数使用常数来实现:

typedef int SLDataType;//这里将int重定义为SLDataType,方便使用其它数据类型typedef struct SeqLis//自定义结构体书写时更加方便
{SLDataType* a;//指向一块动态开辟的空间,实现数据存储空间的动态变化int sz;//用来统计存储数据的个数int capacity;//动态空间的大小
}SL;

文章中的相关代码我会放在的最后。

初始化

在使用顺序表之前当然要对该结构体进行初始化方便后续的使用。

void InitSL(SL* psl)
{assert(psl);psl->a = NULL;psl->sz = 0;psl->capacity = 0;
}

尾插数据、打印数据和销毁顺序表

尾插数据:

void SLPushBack(SL* psl, SLDataType x)
{assert(psl);//检查容量SLCheckCapacity(psl);//这里要进行容量的检查,我们在这里将容量的检查部分分装成函数,方便后续的使用。//尾插数据psl->a[psl->sz] = x;psl->sz++;
}

容量检查函数:

static void SLCheckCapacity(SL* psl)//因为该函数仅在辅助其它函数实现时进行使用,因此加上static修饰,进行保护,防止暴露在外部
{assert(psl);if (psl->capacity == psl->sz){SLDataType newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(psl->a, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail");return;}psl->a = tmp;psl->capacity = newcapacity;}
}

注意:
在这里插入图片描述

打印数据
已经在表中存入数据当然要进行打印出来看一眼,不然都不知道自己写了半天的代码对不对你说是不是?下面就是打印部分的代码:

void SLPrint(SL* psl)
{assert(psl);if (psl->sz == 0){printf("表中没有数据!\n");return;}for (int i = 0; i < psl->sz; i++){printf("%d ", psl->a[i]);}printf("\n");
}

使用完顺序表后要适时的将申请的空间返回给操作系统,这是一个很好的习惯,这就是我们销毁顺序表函数的由来。

void SLDestroy(SL* psl)
{assert(psl);if (psl->a != NULL){free(psl->a);psl->a = NULL;psl->sz = 0;psl->capacity = 0;}
}

下面看一下这部分的一个整体效果:

void Test1()
{SL s1;InitSL(&s1);SLPushBack(&s1, 1);SLPrint(&s1);SLPushBack(&s1, 2);SLPushBack(&s1, 3);SLPushBack(&s1, 4);SLPushBack(&s1, 5);SLPrint(&s1);SLDestroy(&s1);
}

运行结果:在这里插入图片描述

尾删数据、头删、头插数据

现在表中已经存入数据,下面当然是进行数据的删除,我们先从尾部开始删除数据:

void SLPopBack(SL* psl)
{assert(psl);if (psl->sz == 0)//判断是否满足删除数据的前提{printf("表中无数据,无需删除!\n");return;}psl->sz--;
}

在这里插入图片描述
效果展示:

void Test1()
{SL s1;InitSL(&s1);SLPushBack(&s1, 1);SLPrint(&s1);SLPushBack(&s1, 2);SLPushBack(&s1, 3);SLPushBack(&s1, 4);SLPushBack(&s1, 5);SLPrint(&s1);SLPopBack(&s1);SLPrint(&s1);SLPopBack(&s1);SLPrint(&s1);SLPopBack(&s1);SLPrint(&s1);SLPopBack(&s1);SLPrint(&s1);SLDestroy(&s1);
}

在这里插入图片描述
学完了尾插和尾删,下面给到头插和头删的代码:

//头插
void SLPushFront(SL* psl, SLDataType x)
{assert(psl);SLCheckCapacity(psl);int end = psl->sz - 1;while (end >= 0){psl->a[end + 1] = psl->a[end];end--;}psl->a[0] = x;psl->sz++;
}//头删
void SLPopFront(SL* psl)
{assert(psl);int begin = 1;while (begin < psl->sz){psl->a[begin - 1] = psl->a[begin];begin++;}psl->sz--;
}

这里就不给大家进行展示了,想要看一下代码效果的小伙伴可以将代码拷贝过去自行进行调试运行。

任意位置插入、删除数据

我们下面利用数组的下标来进行数据的插入和删除:

//插入数据
void SLInsert(SL* psl, int pos, SLDataType x)
{assert(psl);assert(pos >= 0 && pos <= psl->sz);SLCheckCapacity(psl);int end = psl->sz - 1;while (end >= pos){psl->a[end + 1] = psl->a[end];end--;}psl->a[pos] = x;psl->sz++;
}
//删除数据
void SLErase(SL* psl, int pos)
{assert(psl);assert(pos >= 0 && pos <= psl->sz);int begin = pos+1;while (begin < psl->sz){psl->a[begin - 1] = psl->a[begin];begin++;}psl->sz--;
}

这里没有什么细节上的点需要注意,直接来看代码的实现:

void Test3()
{SL s1;InitSL(&s1);SLPushBack(&s1, 1);SLPrint(&s1);SLPushBack(&s1, 2);SLPushBack(&s1, 3);SLPushBack(&s1, 4);SLPushBack(&s1, 5);SLPrint(&s1);SLInsert(&s1, 1, 10);SLPrint(&s1);SLInsert(&s1, 1, 20);SLPrint(&s1);SLInsert(&s1, 1, 30);SLPrint(&s1);SLErase(&s1, 2);SLPrint(&s1);SLErase(&s1, 2);SLPrint(&s1);SLErase(&s1, 2);SLPrint(&s1);SLDestroy(&s1);
}

运行结果:
在这里插入图片描述

#pragma once#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <assert.h>
#include <stdlib.h>typedef int SLDataType;typedef struct SeqList
{SLDataType* a;int sz;int capacity;
}SL;//初始化
void InitSL(SL* psl);
//打印数据
void SLPrint(SL* psl);
//销毁顺序表
void SLDestroy(SL* psl);
//尾插和尾删数据
void SLPushBack(SL* psl, SLDataType x);
void SLPopBack(SL* psl);
//头插和头删数据
void SLPushFront(SL* psl, SLDataType x);
void SLPopFront(SL* psl);
//任意位置插入删除数据
void SLInsert(SL* psl, int pos, SLDataType x);
void SLErase(SL* psl, int pos);
#include "SeqList.h"void InitSL(SL* psl)
{assert(psl);psl->a = NULL;psl->sz = 0;psl->capacity = 0;
}void SLDestroy(SL* psl)
{assert(psl);if (psl->a != NULL){free(psl->a);psl->a = NULL;psl->sz = 0;psl->capacity = 0;}
}void SLPrint(SL* psl)
{assert(psl);if (psl->sz == 0){printf("表中没有数据!\n");return;}for (int i = 0; i < psl->sz; i++){printf("%d ", psl->a[i]);}printf("\n");
}static void SLCheckCapacity(SL* psl)
{assert(psl);if (psl->capacity == psl->sz){SLDataType newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(psl->a, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror("realloc fail");return;}psl->a = tmp;psl->capacity = newcapacity;}
}void SLPushBack(SL* psl, SLDataType x)
{assert(psl);//检查容量SLCheckCapacity(psl);//尾插数据psl->a[psl->sz] = x;psl->sz++;
}void SLPopBack(SL* psl)
{assert(psl);if (psl->sz == 0){printf("表中无数据,无需删除!\n");return;}psl->sz--;
}void SLPushFront(SL* psl, SLDataType x)
{assert(psl);SLCheckCapacity(psl);int end = psl->sz - 1;while (end >= 0){psl->a[end + 1] = psl->a[end];end--;}psl->a[0] = x;psl->sz++;
}void SLPopFront(SL* psl)
{assert(psl);int begin = 1;while (begin < psl->sz){psl->a[begin - 1] = psl->a[begin];begin++;}psl->sz--;
}void SLInsert(SL* psl, int pos, SLDataType x)
{assert(psl);assert(pos >= 0 && pos <= psl->sz);SLCheckCapacity(psl);int end = psl->sz - 1;while (end >= pos){psl->a[end + 1] = psl->a[end];end--;}psl->a[pos] = x;psl->sz++;
}void SLErase(SL* psl, int pos)
{assert(psl);assert(pos >= 0 && pos <= psl->sz);int begin = pos+1;while (begin < psl->sz){psl->a[begin - 1] = psl->a[begin];begin++;}psl->sz--;
}

下面是测试函数功能实现使用的代码:

#include "SeqList.h"//void Test1()
//{
//	SL s1;
//	InitSL(&s1);
//	SLPushBack(&s1, 1);
//	SLPrint(&s1);
//	SLPushBack(&s1, 2);
//	SLPushBack(&s1, 3);
//	SLPushBack(&s1, 4);
//	SLPushBack(&s1, 5);
//	SLPrint(&s1);
//
//	SLPopBack(&s1);
//	SLPrint(&s1);
//	SLPopBack(&s1);
//	SLPrint(&s1);
//	SLPopBack(&s1);
//	SLPrint(&s1);
//	SLPopBack(&s1);
//	SLPrint(&s1);
//
//	SLDestroy(&s1);
//}//void Test2()
//{
//	SL s1;
//	InitSL(&s1);
//	SLPushBack(&s1, 1);
//	SLPrint(&s1);
//	SLPushBack(&s1, 2);
//	SLPushBack(&s1, 3);
//	SLPushBack(&s1, 4);
//	SLPushBack(&s1, 5);
//	SLPrint(&s1);
//
//	SLPushFront(&s1, 10);
//	SLPrint(&s1);
//	SLPushFront(&s1, 20);
//	SLPrint(&s1);
//	SLPushFront(&s1, 30);
//	SLPrint(&s1);
//
//	SLPopFront(&s1);
//	SLPrint(&s1);
//	SLPopFront(&s1);
//	SLPrint(&s1);
//	SLPopFront(&s1);
//	SLPrint(&s1);
//
//	SLDestroy(&s1);
//}void Test3()
{SL s1;InitSL(&s1);SLPushBack(&s1, 1);SLPrint(&s1);SLPushBack(&s1, 2);SLPushBack(&s1, 3);SLPushBack(&s1, 4);SLPushBack(&s1, 5);SLPrint(&s1);SLInsert(&s1, 1, 10);SLPrint(&s1);SLInsert(&s1, 1, 20);SLPrint(&s1);SLInsert(&s1, 1, 30);SLPrint(&s1);SLErase(&s1, 2);SLPrint(&s1);SLErase(&s1, 2);SLPrint(&s1);SLErase(&s1, 2);SLPrint(&s1);SLDestroy(&s1);
}int main()
{//初始化顺序表,尾插数据//Test1();//头插数据,头删数据//Test2();//任意下标插入数据,删除数据Test3();return 0;
}

好了,今天的分享就到这里了,感谢大家的阅读,我们下次再见!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新waymo数据集 百度网盘

最新waymo数据集介绍 waymo数据集是有史以来最大&#xff0c;最多样化的自动驾驶数据集&#xff0c;包含 传感器数据边界框数据2D视频全景分割标签关键点标签3D语义分割标签2D和3D边界框的关联 是该领域质量最高、规模最大的数据集之一&#xff0c;用于帮助研究界在机器感知…

管理类联考——英语二——阅读篇——题材:心理

文章目录 2013年&#xff0c;Text 3——题材&#xff1a;心理细节题&#xff08;难&#xff09;细节题——排除法细节题细节题观点态度题 2015 年&#xff0c;Text 1——题材&#xff1a;心理细节题细节题推断题词义句意题细节题 2019 年&#xff0c;Text 1——题材&#xff1a…

c语言练习(9周)

输入样例11输出样例7.0980 #include<stdio.h> int main() {int n, i;double s 1,a1;scanf("%d", &n);for (i 2; i < n; i) {a 1 / (1a);s a;}printf("%.4lf", s);return 0; } 题干输入10个整数&#xff0c;分别按输入正序、逆序显示。输…

TSINGSEE青犀AI视频识别技术+危化安全生产智慧监管方案

一、背景分析 石油与化学工业生产过程复杂多样&#xff0c;涉及的物料易燃易爆、有毒有害&#xff0c;生产条件多高温高压、低温负压&#xff0c;现场危险化学品存储量大、危险源集中&#xff0c;重特大安全事故多发。打造基于工业互联网的安全生产新型能力&#xff0c;提高危…

SaaS 出海,如何搭建国际化服务体系?(一)

防噎指南&#xff1a;这可能是你看到的干货含量最高的 SaaS 出海经验分享&#xff0c;请准备好水杯&#xff0c;放肆食用&#xff08;XD。 当越来越多中国 SaaS 企业选择开启「国际化」副本&#xff0c;出海便俨然成为国内 SaaS 的新角斗场。 LigaAI 观察到&#xff0c;出海浪…

【Python 常用脚本及命令系列 9 -- 图片文字识别 EasyOCR使用】

文章目录 1.1 EasyOCR 介绍1.1.1 EasyOCR 安装1.1.2 EasyOCR 使用方法1.1.2.1 EasyOCR 支持的语言种类1.1.2.2 EasyOCR 支持的图像格式 EasyOCR 提高图片文字识别正确率1.3 问题总结 1.1 EasyOCR 介绍 Python中有一个不错的OCR库-EasyOCR&#xff0c;在GitHub已有9700 star。它…

Stable Diffusion系列(一):古早显卡上最新版 WebUI 安装及简单操作

文章目录 Stable Diffusion安装AnimateDiff插件适配sdxl模型适配 Stable Diffusion使用插件安装界面设置基础文生图加入lora的文生图 Stable Diffusion安装 我的情况比较特殊&#xff0c;显卡版本太老&#xff0c;最高也就支持cuda10.2&#xff0c;因此只能安装pytorch1.12.1&…

十八、模型构建器(ModelBuilder)快速提取城市建成区——批量掩膜提取夜光数据、夜光数据转面、面数据融合、要素转Excel(基于参考比较法)

一、前言 前文实现批量投影栅格、转为整型,接下来重点实现批量提取夜光数据,夜光数据转面、夜光数据面数据融合、要素转Excel。将相关结果转为Excel,接下来就是在Excel中进行阈值的确定,阈值确定无法通过批量操作,除非采用其他方式,但是那样的学习成本较高,对于参考比较…

virtual 关键字中 cv限定符的使用

对于如下定义&#xff1a; struct A { virtual int f( ) { return 1; } } a; struct B: A {int f( ) const { return 2; }int f( ) volatile { return 3; }int f( ) const volatile { return 4; } } c; int main(int argc, char *argv[ ]) { A *p&c; return p->f( ); } …

智慧矿山AI算法助力护帮板支护监测,提升安全与效率

在智慧矿山AI算法系列中&#xff0c;护帮板支护监测是保障矿山安全和提高生产效率的重要环节。护帮板作为矿山支护体系中的重要组成部分&#xff0c;在矿山生产中起到了关键的作用。那么&#xff0c;护帮板在哪种状态下是正常打开的呢&#xff1f;本文将对此进行介绍。 护帮板的…

腾讯云双11云服务器大促优惠活动:超多云服务器优惠惊喜不断!

腾讯云双11大促优惠活动已经拉开帷幕&#xff0c;为广大用户带来了一系列的超值优惠。活动时间从现在起一直延续到2023年11月30日23:59:59&#xff0c;让用户有足够的时间去选择和购买心仪的产品。活动入口链接为https://1111.mian100.cn&#xff0c;点击链接即可进入活动页面。…

多输入多输出 | Matlab实现k-means-LSTM(k均值聚类结合长短期记忆神经网络)多输入多输出组合预测

多输入多输出 | Matlab实现k-means-LSTM&#xff08;k均值聚类结合长短期记忆神经网络&#xff09;多输入多输出组合预测 目录 多输入多输出 | Matlab实现k-means-LSTM&#xff08;k均值聚类结合长短期记忆神经网络&#xff09;多输入多输出组合预测预测效果基本描述程序设计参…

smartLink HW-DP新版提供更多扩展功能——用于PROFIBUS和HART系统中物联网集成

Softing工业自动化的smartLink HW-DP网关可独立于控制器访问PROFIBUS DP网络&#xff0c;且新发布的1.30固件版本还提供了更多数据连接和传输的扩展功能。 smartLink HW-DP可无缝集成到PROFIBUS网络中&#xff0c;而不会影响现有设备的运行。该网关还可为新的和现有的PROFIBUS …

【网络安全 --- 任意文件上传漏洞靶场闯关 6-15关】任意文件上传漏洞靶场闯关,让你更深入了解文件上传漏洞以及绕过方式方法,思路技巧

一&#xff0c;工具资源下载 百度网盘资源下载链接地址&#xff1a; 百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan…

机器学习-基本知识

 任务类型 ◼ 有监督学习(Supervised Learning) 每个训练样本x有人为标注的目标t&#xff0c;学习的目标是发现x到t的映射&#xff0c;如分类、回归。 ◼ 无监督学习(Unsupervised Learning) 学习样本没有人为标注&#xff0c;学习的目的是发现数据x本身的分布规律&#xf…

Linux的开发环境安装配置与后端项目部署

目录 一.安装开发环境 1.准备阶段 1.1 创建新目录 1.2 解压文件 2.JDK的安装与配置环境变量 2.1 解压jdk压缩包 2.2 配置环境变量 2.3 设置环境变量生效 2.4 验证是否安装成功 3.Tomcat的安装与使用 3.1 解压安装 3.2 开启服务 3.3 开放端口 3.4 访问成功 4.MySQ…

Azure - 机器学习实战:快速训练、部署模型

本文将指导你探索 Azure 机器学习服务的主要功能。在这里&#xff0c;你将学习如何创建、注册并发布模型。此教程旨在让你深入了解 Azure 机器学习的基础知识和常用操作。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验…

scrapy-redis分布式爬虫(分布式爬虫简述+分布式爬虫实战)

一、分布式爬虫简述 &#xff08;一&#xff09;分布式爬虫优势 1.充分利用多台机器的带宽速度 2.充分利用多台机器的ip地址 &#xff08;二&#xff09;Redis数据库 1.Redis是一个高性能的nosql数据库 2.Redis的所有操作都是原子性的 3.Redis的数据类型都是基于基本数据…

超级搜索技术,普通人变强的唯一外挂

搜索效率&#xff1a;Google >微信公众号 >短视频 >百度 1、信息咨询搜索 在Google搜索栏前面加上 “” 限定关键词 intitle 限定标题 allintitle 限定标题多个关键词 intext 限定内容关键词 inurl 限定网址关键词 site 限定网址来源 imagesize 限定图片尺寸 filet…

函数总结

一、main函数 //argc 统计命令行传参的个数 //argv 保存命令行传的具体参数,每个参数当做字符串来存储&#xff0c;const是为了不让main函数修改argv数组里的内容 1.1值传递 此为值传递;形参的值改变不影响实参的值 1.2 地址传递 形参拿到的是实参的地址&#xff0c;实际操…