初阶数据结构:顺序表

目录

  • 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)
{//不为NULLassert(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.hqwc.cn/news/416375.html

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

相关文章

Spring Boot程序的打包与运行:构建高效部署流程

引言 在现代应用开发中&#xff0c;高效的打包和部署流程对于项目的开发、测试和上线至关重要。Spring Boot作为一种快速开发框架&#xff0c;提供了方便的打包工具和内嵌式的Web服务器&#xff0c;使得打包和运行变得更加简单。本文将研究在Spring Boot应用中如何进行打包&am…

Vue四个阶段,八个钩子函数

- 创造阶段&#xff1a;创建Vue实例和初始化数据事件&#xff0c;数据代理&#xff0c;监测watch - beforeCreate&#xff0c;只是创建实例&#xff0c;不能this.$el,this.msg,this.方法名&#xff08;&#xff09; - created&#xff0c;数据代理了&#xff0c;能v…

Python 面向对象绘图(Matplotlib篇-16)

Python 面向对象绘图(Matplotlib篇-16)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

ffmpeg 常用命令行详解

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

4个值得使用的免费爬虫工具

在信息时代&#xff0c;数据的获取对于各行业都至关重要。而在数据采集的众多工具中&#xff0c;免费的爬虫软件成为许多用户的首选。本文将专心分享四款免费爬虫工具&#xff0c;突出介绍其中之一——147采集软件&#xff0c;为您揭示这些工具的优势和应用&#xff0c;助您在数…

了解Vue中日历插件Fullcalendar

实现效果如下图&#xff1a; 月视图 周视图 日视图 官方文档地址&#xff1a;Vue Component - Docs | FullCalendar 1、安装与FullCalendar相关的依赖项 npm install --save fullcalendar/vue fullcalendar/core fullcalendar/daygrid fullcalendar/timegrid fullcalend…

算法笔记(动态规划入门题)

1.找零钱 int coinChange(int* coins, int coinsSize, int amount) {int dp[amount 1];memset(dp,-1,sizeof(dp));dp[0] 0;for (int i 1; i < amount; i)for (int j 0; j < coinsSize; j)if (coins[j] < i && dp[i - coins[j]] ! -1)if (dp[i] -1 || dp[…

springCloud使用apache的http类和RestTemplate以及Eureka

使用apache的&#xff1a; package com.csgholding.pvgpsp.eqp.util;import com.esotericsoftware.minlog.Log; import org.apache.commons.collections4.MapUtils; import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apac…

计算机毕业设计-----SSH超市便利店综合管理系统

项目介绍 便利店管理系统共分为两个角色&#xff1a;管理员和销售人员 销售员角色包含以下功能&#xff1a; 销售员登录,管理销售记录等功能。 管理员角色包含以下功能&#xff1a; 管理员角色登录,销售员管理,商品管理,采购管理,库存管理,销售记录管理,成本报表统计,收入报…

全面了解网络性能监测:从哪些方面进行监测?

目录 摘要 引言 CPU内存监控 磁盘监控 网络监控 GPU监控 帧率监控 总结 摘要 本文介绍了网络性能监测的重要性&#xff0c;并详细介绍了一款名为克魔助手的应用开发工具&#xff0c;该工具提供了丰富的性能监控功能&#xff0c;包括CPU、内存、磁盘、网络等指标的实时…

Pytest插件pytest-django让Django测试更高效

在Django应用开发中&#xff0c;测试是确保应用质量的关键环节。然而&#xff0c;Django自带的测试框架并非总能满足开发者的需求&#xff0c;而Pytest插件 pytest-django 则为我们提供了更为灵活、强大的测试工具。本文将深入介绍 pytest-django 插件的基本用法和实际案例&…

《WebKit 技术内幕》之四(3): 资源加载和网络栈

3. 网络栈 3.1 WebKit的网络设施 WebKit的资源加载其实是交由各个移植来实现的&#xff0c;所以WebCore其实并没有什么特别的基础设施&#xff0c;每个移植的网络实现是非常不一样的。 从WebKit的代码结构中可以看出&#xff0c;网络部分代码的确比较少的&#xff0c;它们都在…