初阶数据结构:顺序表

news2024/11/15 8:34:20

目录

  • 1. 引子:线性表
  • 2. 简单数据结构:顺序表
    • 2.1 顺序表简介与功能模块分析
    • 2.2 顺序表的实现
      • 2.2.1 顺序表:存储数据结构的构建
      • 2.2.2 顺序表:初始化与空间清理(动态)
      • 2.2.3 顺序表:插入与删除数据
      • 2.2.4 查找数据与修改

1. 引子:线性表

了解到学习数据结构与算法的重要性后,又学习了评判程序效率高低算法好坏的标准,时间空间复杂度。接下来,进行一些简单数据结构的初步学习。所有数据结构中存在着可以划分为一大类的简单结构,线性表,即在逻辑上都呈现线性关系的数据结构(物理结构上不一定是线性),诸如,顺序表,链表,栈,队列等。今天,进行其中顺序表的学习。

2. 简单数据结构:顺序表

2.1 顺序表简介与功能模块分析

简介:

顺序表为在物理地址上连续的一种简单线性结构,其存储的数据元素一个连着一个。一般使用数组来进行其的实现,根据其存储空间是否可以动态增长又进一步分为,静态(定长数组)与动态(使用动态内存管理函数实现malloc)的顺序表。

功能模块分析:

数据存储方式:

  1. 定长数组/malloc动态开辟空间
  2. 存储数据信息的记录变量,帮助数据的管理
    以上两部分构成的结构体。

数组管理方式:

  1. 增(头插,尾插,随机插入):push_front,push_back,insert
  2. 删(头删,尾删,随机删除):pop_front,pop_back,erase
  3. 改(指定数据的修改):modify
  4. 查(指定数据的查询):find

2.2 顺序表的实现

2.2.1 顺序表:存储数据结构的构建

静态顺序表:

//替换更改表中元素类型
typedef int STDatatype;
//定义能够存储的数据个数
#define N 100

//静态
typedef struct SeqList
{
	STDatatype data[N];
	int capacity;
	int size;
}SeqList;

动态顺序表:

typedef struct SeqList
{
	STDatatype* data;
	int capacity;
	int size;
}SeqList;

2.2.2 顺序表:初始化与空间清理(动态)

初始化:

void SLInit(SeqList* s)
{
	//不为NULL
	assert(s);
	//初始空间开辟4个数据大小
	s->data = (STDatatype*)malloc(4 * sizeof(STDatatype));
	if (s->data == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	s->capacity = 4;
	s->size = 0;
}

空间清理:

void SLDestroy(SeqList* s)
{
	assert(s);

	free(s->data);
	s->capacity = 0;
	s->size = 0;
}

2.2.3 顺序表:插入与删除数据

扩容函数:

void CheckCapacity(SeqList* s)
{
	assert(s);

	if (s->capacity == s->size)
	{
		//使用临时变量去接收新地址(可能会扩容失败返回NULL),增加程序的健壮性
		STDatatype* tmp = (STDatatype*)realloc(s->data, s->capacity * 2 * sizeof(STDatatype));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}

		s->data = tmp;
		s->capacity *= 2;
	}
}

尾插,尾删

尾插过程演示:

在这里插入图片描述

尾删过程演示:

在这里插入图片描述

//尾插
void SLPush_Back(SeqList* s, STDatatype val)
{
	assert(s);

	CheckCapacity(s);

	s->data[s->size] = val;
	s->size++;
}

//尾删
void SLPop_Back(SeqList* s)
{
	assert(s);
	assert(s->size > 0);

	s->size--;
}

头插,头删

头插过程演示:

在这里插入图片描述

头删过程演示:

在这里插入图片描述

//头插
void SLPush_Front(SeqList* s, STDatatype val)
{
	assert(s);

	CheckCapacity(s);

	int i = s->size;
	while (i > 0)
	{
		s->data[i] = s->data[i - 1];
		i--;
	}

	s->data[i] = val;
	s->size++;
}

//头删
void SLPop_Front(SeqList* s)
{
	assert(s);
	//暴力检查
	assert(s->size > 0);
	//警告
	/*if (s->size == 0)
	{
		printf("表内已无元素,删除失败\n");
		return;
	}*/

	int i = 0;
	while (i < s->size - 1)
	{
		s->data[i] = s->data[i + 1];
		i++;
	}

	s->size--;
}

随机插入与随机删除

随机插入:

随机插入演示过程:

在这里插入图片描述

注:当随机插入的下标pos为0 或者 size - 1就相当于头插与尾插,可以直接复用到头插,尾插部分。头删,尾删相同

//在pos位置插入元素
//pos为下标
void SLInsert(SeqList* s, int pos, STDatatype val)
{
	assert(s);
	assert(pos >= 0);
	assert(pos < s->size);

	CheckCapacity(s);

	int i = s->size;
	while (i > pos)
	{
		s->data[i] = s->data[i - 1];
		i--;
	}

	s->data[pos] = val;
	s->size++;
}

随机删除:

随机删除演示过程:

在这里插入图片描述

void SLErase(SeqList* s, int pos)
{
	assert(s);
	assert(s->size > 0);
	assert(pos >= 0);
	assert(pos < s->size);

	int i = pos;
	while (i < s->size - 1)
	{
		s->data[i] = s->data[i + 1];
		i++;
	}

	s->size--;
}

2.2.4 查找数据与修改

<1> 查找数据(查找顺序表中是否有指定数据,并返回下标):

//找到返回下标,未找到返回-1
int SLFind(SeqList* s, STDatatype val)
{
	assert(s);

	int i = 0;
	for (i = 0; i < s->size; i++)
	{
		if (s->data[i] == val)
		{
			return i;
		}
	}

	return -1;
}

<2> 修改指定下标的数据(不要直接访问数据,函数可以帮助检查数据合法)

//高内聚,低耦合f
void SLModify(SeqList* s, int pos, STDatatype val)
{
	assert(s);
	assert(pos > 0);
	assert(pos < s->size);

	s->data[pos] = val;
}

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

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

相关文章

总结网络中的一些基本概念

1. IP地址 描述一个设备在网络上的位置&#xff0c;而且计算机是通过数字来描述IP地址的。例如&#xff08;生活中的地址&#xff09; 2. 端口号 描述一个主机上的哪个应用程序&#xff0c;有了IP可以确定主机&#xff0c;但是一个主机上可能有很多程序在使用网络&#xff0c;…

基于SpringBoot Vue自习室管理系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

Elasticsearch各种高级文档操作3

本文来记录几种Elasticsearch的文档操作 文章目录 初始化文档数据聚合查询文档概述对某个字段取最大值 max 示例对某个字段取最小值 min 示例对某个字段求和 sum 示例对某个字段取平均值 avg 示例对某个字段的值进行去重之后再取总数 示例 本文小结 初始化文档数据 在进行各种文…

ASP.NET Core 对象池化技术

写在前面 Microsoft.Extensions.ObjectPool 是 ASP.NET Core 基础结构的一部分&#xff0c;当对象的初始化成本较高&#xff0c;并且可能被频繁使用时&#xff0c;才适合采用对象池技术&#xff1b;被ObjectPool管理的对象不会进入垃圾回收&#xff0c;使用时通过由实例对象实…

【迅搜19】扩展(二)TNTSearch和JiebaPHP方案

扩展&#xff08;二&#xff09;TNTSearch和JiebaPHP方案 搜索引擎系列的最后一篇了。既然是最后一篇&#xff0c;那么我们也轻松一点&#xff0c;直接来看一套非常有意思的纯 PHP 实现的搜索引擎及分词方案吧。这一套方案由两个组件组成&#xff0c;一个叫 TNTSearch &#xf…

【0到1的设计之路】从C语言到二进制程序

C程序如何从源代码生成指令序列(二进制可执行文件) 预处理 -> 编译 -> 汇编 -> 链接 -> 执行 预处理 预处理 文本粘贴 #include <stdio.h> #define MSG "Hello \ World!\n" int main() {printf(MSG /* "hi!\n" */); #ifdef __riscvpr…

PE解释器之PE文件结构(二)

接下来的内容是对IMAGE_OPTIONAL_HEADER32中的最后一个成员DataDirectory&#xff0c;虽然他只是一个结构体数组&#xff0c;每个结构体的大小也不过是个字节&#xff0c;但是它却是PE文件中最重要的成员。PE装载器通过查看它才能准确的找到某个函数或某个资源。 一&#xff1…

2种数控棋

目录 数控棋1 数控棋2 数控棋1 棋盘&#xff1a; 初始局面&#xff1a; 规则&#xff1a; 规则&#xff1a;双方轮流走棋&#xff0c;可走横格、竖格、可横竖转弯&#xff0c;不可走斜格。每一步均须按棋所在格的数字走步数&#xff0c;不可多不可少。 先无法走棋的一方为…

如何有效防爬虫?一文讲解反爬虫策略

企业拥抱数字化技术的过程中&#xff0c;网络犯罪分子的“战术”也更难以觉察&#xff0c;并且这些攻击越来越自动化和复杂&#xff0c;也更加难以觉察。在众多攻击手段中&#xff0c;网络爬虫是企业面临的主要安全挑战。恶意爬虫活动可能导致数据滥用、盗窃商业机密等问题&…

ctfshow php特性(web89-web101)

目录 web89 web90 web91 web92 web93 web94 web95 web96 web97 web98 web99 web100 web101 php特性(php基础知识) web89 <?php include("flag.php"); highlight_file(_FILE_);if(isset($_GET[num])){$num$_GET[num];if(preg_match("/[0-9]/&…

ffmpeg 常用命令行详解

概述 ffmpeg 是一个命令行音视频后期处理软件 1. 裁剪命令 参数说明 -i 文件&#xff0c;orgin.mp3 为待处理源文件-ss 裁剪时间&#xff0c;后跟裁剪开始时间&#xff0c;或者开始的秒数-t 裁剪时间output.mp3 为处理结果文件 ffmpeg -i organ.mp3 -ss 00:00:xx -t 120 o…

Oracle 隐式数据类型转换

目录 Oracle类型转换规则&#xff1a; 看如下实验&#xff1a; 1、创建一张表&#xff0c;字段id的类型为number&#xff0c;id字段创建索引&#xff0c;插入一条测试数据 2、我们做如下查询&#xff0c;id的值设置为字符型的1 3、查看执行计划&#xff1a; Oracle类型转换…

MySQL之索引结构

索引概述 索引是帮助MySQL高效获取数据的数据结构&#xff08;有序&#xff09;。 在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c;这样就可以在这些数据结构上实现…

JMeter实操入门之登录

JMeter实操入门之登录 前言初级-无变量的登录线程组取样器-HTTP请求 进阶-定义变量的登录用户定义的变量获取JSON返回的数据-tokentoken设置全局变量 前言 安装及环境配置教程可移步&#xff1a;JMeter安装与配置环境 本篇文章针对小白进一步的认识及运用JMeter&#xff0c;围绕…

从数据角度分析年龄与NBA球员赛场表现的关系【数据分析项目分享】

好久不见朋友们&#xff0c;今天给大家分享一个我自己很感兴趣的话题分析——NBA球员表现跟年龄关系到底大不大&#xff1f;数据来源于Kaggle&#xff0c;感兴趣的朋友可以点赞评论留言&#xff0c;我会将数据同代码一起发送给你。 目录 NBA球员表现的探索性数据分析导入Python…

ChatGPT与文心一言:AI助手之巅的对决

随着科技的飞速发展&#xff0c;人工智能助手已经渗透到我们的日常生活和工作中。 而在这个充满竞争的领域里&#xff0c;ChatGPT和文心一言无疑是最引人注目的两款产品。它们各自拥有独特的优势&#xff0c;但在智能回复、语言准确性、知识库丰富度等方面却存在差异。那么&am…

【设计模式】责任连模式怎么用?

我将通过一个贴近现实的故事——请假审批流程&#xff0c;带你了解和掌握责任链模式。 什么是责任链模式&#xff1f; 责任链模式是一种行为设计模式&#xff0c;它让你可以避免将请求的发送者与接收者耦合在一起&#xff0c;让多个对象都有处理请求的机会将这个对象连成一条…

RabbitMQ入门篇【图文并茂,超级详细】

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 前言 1.什么是MQ 2.理解MQ 3.生活…

探秘网络爬虫的基本原理与实例应用

1. 基本原理 网络爬虫是一种用于自动化获取互联网信息的程序&#xff0c;其基本原理包括URL获取、HTTP请求、HTML解析、数据提取和数据存储等步骤。 URL获取&#xff1a; 确定需要访问的目标网页&#xff0c;通过人工指定、站点地图或之前的抓取结果获取URL。 HTTP请求&#…

MySQL中SELECT字句的顺序以及具体使用

目录 1.SELECT字句及其顺序 2.使用方法举例 3.HAVING和WHERE 1.SELECT字句及其顺序 *下表来自于图灵程序设计丛书&#xff0c;数据库系列——《SQL必知必会》 2.使用方法举例 *题目来源于牛客网 题目描述 现在运营想要查看不同大学的用户平均发帖情况&#xff0c;并期望结…