初阶数据结构:顺序表

目录

  • 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.mzph.cn/news/635766.shtml

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

相关文章

爬虫笔记(一):实战登录古诗文网站

需求&#xff1a;登录古诗文网站&#xff0c;账号&#xff0b;密码&#xff0b;图形验证码 第一&#xff1a;自己注册一个账号&#xff0b;密码哈 第二&#xff1a;图形验证码&#xff0c;需要一个打码平台&#xff08;充钱&#xff0c;超能力power&#xff01;&#xff09;或…

信息登记小程序怎么做_重塑用户互动,开启全新营销篇章

信息登记小程序&#xff1a;重塑用户互动&#xff0c;开启全新营销篇章 在数字化浪潮中&#xff0c;小程序以其便捷、高效的特点&#xff0c;逐渐成为企业与用户之间沟通的桥梁。其中&#xff0c;信息登记小程序更是凭借其独特的定位&#xff0c;在众多小程序中脱颖而出。本文…

[C#]winform部署openvino调用padleocr模型

【官方框架地址】 https://github.com/PaddlePaddle/PaddleOCR 【算法介绍】 OpenVINO和PaddleOCR都是用于计算机视觉应用的工具&#xff0c;但它们有不同的特点和用途。OpenVINO是一个由Intel开发的开源工具套件&#xff0c;主要用于加速深度学习推理&#xff0c;而PaddleOC…

LNMP环境下综合部署动态网站

目录 LNMP部署--nginx 搭建mysql数据库 安装mysql的过程&#xff1a; 部署PHP&#xff1a; ​编辑​编辑php的配置文件在哪 wordpress程序安装 LNMP部署--nginx 纯净--联网状态 环境变量中没有nginx 安装形式的选择&#xff1a; yum安装&#xff1a;自动下载安装包及…

贪心算法 ——硬币兑换、区间调度、

硬币兑换&#xff1a; from book&#xff1a;挑战程序设计竞赛 思路&#xff1a;优先使用大面额兑换即可 package mainimport "fmt"func main() {results : []int{}//记录每一种数额的张数A : 620B : A//备份cnts : 0 //记录至少需要多少张nums : []int{1, 5, 10, 5…

大数据质量管制规范示例

大数据质量管制规范示例 一、前提概要二、相关概念三、管理原则四、治理委员五、应用管理六、查验方式七、考核比率八、扣分标准九、责任划分十、追责范围十一、其它条例十二、总结 一、前提概要 在当今大数据信息时代&#xff0c;大数据平台&#xff08;大数据平台开发规范示…

关于大模型学习中遇到的3

来源&#xff1a;网络 Embedding模型 随着大型语言模型的发展&#xff0c;以ChatGPT为首&#xff0c;涌现了诸如ChatPDF、BingGPT、NotionAI等多种多样的应用。公众大量地将目光聚焦于生成模型的进展之快&#xff0c;却少有关注支撑许多大型语言模型应用落地的必不可少的Embed…

中仕教育:社会人员可以报名三支一扶吗?

三支一扶是针对高校应届毕业生的一种考试&#xff0c;社会人员并不满足报考条件&#xff0c;所以不能报考。 三支一扶报考条件&#xff1a; 1.应届毕业生或者毕业两年内未就业的往届毕业生。 2.专科以上学历 3.遵纪守法&#xff0c;作风良好。 不同地区的考试要求不同&…

【AJAX框架】AJAX入门与axios的使用

文章目录 前言一、AJAX是干什么的&#xff1f;二、AJAX的安装2.1 CDN引入2.2 npm安装 三、基础使用3.1 CDN方式3.2 node方式 总结 前言 在现代Web开发中&#xff0c;异步JavaScript和XML&#xff08;AJAX&#xff09;已经成为不可或缺的技术之一。AJAX使得网页能够在不刷新整个…

【C++】std::string 转换成非const类型 char* 的三种方法记录

std::string 有两个方法&#xff1a;data() 和 c_str()&#xff0c;都是返回该字符串的const char类型&#xff0c;那如何转换成非const的char呢&#xff1f; 下面展示三种方法&#xff1a; 强转&#xff1a;char* char_test (char*)test.c_str();使用string的地址&#xff…

LeetCode 热题 100 | 双指针(下)

目录 42. 接雨水 1 方法一&#xff1a;我的方法 2 方法二&#xff1a;动态规划 3 方法三&#xff1a;双指针 菜鸟做题第一周&#xff0c;语言是 C 42. 接雨水 1 方法一&#xff1a;我的方法 Warning&#xff1a;这是我的智障做法&#xff0c;请勿模仿 我只能说它教会…

用Go plan9汇编实现斐波那契数列计算

斐波那契数列是一个满足递推关系的数列&#xff0c;如&#xff1a;1 1 2 3 5 8 ... 其前两项为1&#xff0c;第3项开始&#xff0c;每一项都是其前两项之和。 用Go实现一个简单的斐波那契计算逻辑 func fib(n int) int {if n 1 || n 2 {return 1}return fib(n-1) fib(n-2) …

MySQL---视图索引

表定义&#xff1a; 学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;S…

Redis设置开机自启动

1.新建一个系统服务文件 首先输入命令&#xff1a;vi /etc/systemd/system/redis.service 进入vim后粘贴下方代码&#xff0c;注意查看地址是否一致。 ExecStart后面接的是你的redis-server的安装位置和redis配置文件的目录 [Unit] Descriptionredis-server Afternetwork.ta…

Pycharm无法刷新远程解释器的框架: Can‘t get remote credentials for deployment server

在Pycharm上部署项目到远程服务器&#xff0c;有时候需要启动SSH会话&#xff0c;启动的时候发现没反应&#xff0c;且事件日志显示&#xff1a;无法刷新远程解释器的框架: Can’t get remote credentials for deployment server 观察pycharm界面最下边&#xff0c;发现“无默…

2024最新最全:【CISP系列考试大纲】零基础入门到精通

CISP&#xff08;Certified Information Security Professional&#xff09;中文全称注册信息安全专业人员认证&#xff0c;是经中国信息安全测评中心依据中编办批准开展“信息安全人员培训与资质认证”的职能&#xff0c;推出的代表国家对信息安全专业人员能力认可的证书。 C…

数据结构——排序

前言&#xff1a;哈喽小伙伴们好久不见&#xff0c;也是顺利的考完试迎来了寒假。众所周知&#xff0c;不怕同学是学霸&#xff0c;就怕学霸放寒假&#xff0c;假期身为弯道超车的最佳时间&#xff0c;我们定然是不能懒散的度过。 今天我们就一起来学习数据结构初阶的终章——…

仰暮计划|“学校四周无围墙,教室通风望天窗”

一九七二年高中毕业&#xff0c;我成了回乡青年。玉米地里抡过锄&#xff0c;当阳峪村烧白干&#xff0c;化肥厂内装卸车&#xff0c;深山修渠扛石块。一九七四年十月&#xff0c;村革委会主任找我谈话&#xff0c;“回乡二年来&#xff0c;你无论是政治思想改造&#xff0c;还…

Python爬虫从入门到入狱系列合集

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

ES框架详解

ES框架详解 1、全文检索的介绍 ​ 那么对于一般的公司&#xff0c;初期是没有那么多数据的&#xff0c;所以很多公司更倾向于使用传统的数据库&#xff1a;mysql&#xff1b;比如我们要查找关键字”传智播客“&#xff0c;那么查询的方式大概就是:select * from table where …