【数据结构初阶】--顺序表(一)

🔥个人主页:@草莓熊Lotso

🎬作者简介:C++研发方向学习者

📖个人专栏: 《C语言》 《数据结构与算法》

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。

前言:在上篇博客中我们学习了算法复杂度 ,明确了如何计算时间复杂度,能对写出来的代码进行一个评估,那么我们这篇博客将会给大家分享数据结构中顺序表的相关知识点。


目录

一.初识顺序表

1.1--线性表

1.2--顺序表的概念与结构

二.顺序表的分类

2.1--静态顺序表

2.2--动态顺序表 

三.动态顺序表的实现 --初始化

 seqlist.h:

 seqlist.c:

 test.c:

静态顺序表部分代码实现演示:(只包含.c文件和.h文件,测试文件这里就不写了)


一.初识顺序表

--在正式学习顺序表之前,我们先明确一下线性表这个概念

1.1--线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列,线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列,字符串……

线性表在逻辑上是线性结构,也就是说连续的一条直线。但是在物理结构上并不一定是连续的。线性表在物理上存储时,通常以数组和链式结构的形式存储。

1.2--顺序表的概念与结构

--概念:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况采用数组存储。

  • 逻辑结构:线性   
  • 物理结构:线性

顺序表和数组的区别:

  • 顺序表的底层结构是数组,对数组的封装,实现了常用的增删查改等结构 

 我们来举个例子对比一下数组和顺序表:(苍蝇馆子和米其林餐厅的对比)


二.顺序表的分类

2.1--静态顺序表

--使用定长数组存储元素

静态顺序表缺陷:空间给少了不够用,给少了造成空间浪费

//静态顺序表
typedef int SLDataType;
#define N 6
typedef struct Seqlist {
    SLDataType a[N];//定长数组
    int size;//有效数据个数
}SL;

 

2.2--动态顺序表 

--使用动态开辟的数组存储

//动态顺序表--按需申请

typedef struct Seqlist {
    SLDataType a[N];//定长数组
    int size;//有效数据个数

    int capacity;//空间容量
}SL;


三.动态顺序表的实现 --初始化

--我们这里就分三个文件来实现一下动态顺序表,静态顺序表就不在这里演示了,但是博主会把静态顺序表的部分实现代码放在最后,大家可以自己看看。

 seqlist.h:

#pragma once
#include<stdio.h>
#include<stdlib.h>//定义顺序表的结构
typedef int SLTDataType;
typedef struct Seqlist
{SLTDataType* arr;//存储数据int size;//有效数据个数int capacity;//空间容量
}SL;//顺序表初始化
void SLInit(SL* ps);

重要提示:

 

这里分别对int类型和顺序表进行了重名命,给int重命名是为了方便后续的修改,比如我想把一些用了SLTDataType的变量从int类型修改成char,只用在重命名这个地方修改就可以了。

然后是顺序表的重命名,这里将顺序表重命名为SL,后续使用起来更加方便,看起来也会更加清晰。重名命这一块知识点之前在结构体的博客中博主有更详细的讲述过,大家感兴趣的话可以点击下面的链接去看一看,结构体相关的知识点对于我们后续数据结构的学习来说还是蛮重要的。

【自定义类型-结构体】--结构体类型,结构体变量的创建和初始化,结构体内存对齐,结构体传参,结构体实现位段

 seqlist.c:

#define _CRT_SECURE_NO_WARNINGS
#include"seqlist.h"void SLInit(SL* ps)
{ps->arr = NULL;ps->size = 0;ps->capacity = 0;
}

重点提示: 

在这里先看看初始化就好了,至于尾插,头插等接口的实现会在后续的文章中讲解。这里的初始化很简单,也没有啥需要特别注意的。大家应该都可以看懂,就不展开来详细讲述了,补充一下这里对arr初始化的话大家可以直接malloc申请一块空间,但是我个人还是更喜欢这样写的,这样写之后该如何使用在下篇博客中会讲到的。

 test.c:

#define _CRT_SECURE_NO_WARNINGS#include"seqlist.h"void test1()
{SL s1;SLInit(&s1);
}int main()
{test1();return 0;
}

重点提示:

我们这里传参数,一定要采用传址调用的形式,否则会出现一些错误(在这里会报未初始化的局部变量s1这个错误),因为传值调用修改形参并不影响实参,它们的地址终究还是不同的,而传址调用,形参的修改会影响实参,这里也可以参考之前我们在--指针超详解2中举的swap函数的例子,在那篇博客中我们对传址调用和传值调用讲述的更加详细。

【C语言指针超详解(二)】--const修饰指针变量,野指针的辩析,assert断言,指针的使用和传址调用

注意:除了部分情况外(数组名),有取地址操作符才叫做变量传地址。

我们编写代码最好勤测试,避免写出大量代码后再测试而导致出现问题,无法定位问题。大家可以想想,如果不经常性进行测试的话,等到后续程序写完后发现有问题,很难入手去解决,就算找到了错误,修改起来的工作量也还是蛮大的哈。而我们写一个板块进测试一下的话,可以及时找出问题并进行修正,所有测试这个习惯是一定需要具备的。

静态顺序表部分代码实现演示:(只包含.c文件和.h文件,测试文件这里就不写了)

1.SeqList.h

#pragma once#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include <assert.h>// 增强程序可维护性
#define  MAX_SIZE  10000
typedef int SQDataType;
// 静态顺序表
// 问题:给少了不够用,给多了用不完浪费,不能灵活控制
typedef struct SeqList
{SQDataType a[MAX_SIZE];int size;
}SL;//typedef struct SeqList SL;// 增删查改等接口函数
void SeqListInit(SL* ps);// 头插 尾插 头删 尾删
void SeqListPushBack(SL* ps, SQDataType x);
void SeqListPushFront(SL* ps, SQDataType x);
void SeqListPopBack(SL* ps);
void SeqListPopFront(SL* ps);

2.SeqList.c

#include "SeqList.h"增删查改等接口函数
void SeqListInit(SL* ps)
{memset(ps->a, 0, sizeof(SQDataType)*MAX_SIZE);ps->size = 0;
}// 头插 尾插 头删 尾删
void SeqListPushBack(SL* ps, SQDataType x)
{if (ps->size >= MAX_SIZE){printf("SeqList is Full\n");return;}ps->a[ps->size] = x;ps->size++;
}void SeqListPushFront(SL* ps, SQDataType x);
void SeqListPopBack(SL* ps);
void SeqListPopFront(SL* ps);

这里大家还可以看看静态顺序表尾插的实现,可以自己先尝试去理解一下,这样后续动态顺序表的尾插实现也能更好的入手哈。

小预告:到这里就把初始化部分给大家讲完了,由于初始化部分比较简单,就不把每一步拆开来讲了,大家通过我画的图应该就可以很好的理解掉这个部分,那么在下篇文章中博主将继续进行尾插,头插,头删,尾删等接口的实现,会拆开来详细讲述,让大家能更好的理解这几个接口实现的过程和需要注意的一些点。


往期回顾:

【数据结构初阶】--算法复杂度的深度解析

【C语言指针超详解(六)】--sizeof和strlen的对比,数组和指针笔试题解析,指针运算笔试题解析 

【C语言动态内存管理】--动态内存分配的意义,malloc和free,calloc和realloc,常见的动态内存的错误,动态内存经典笔试题分析,柔性数组,总结C/C++中程序内存区域划分 【自定义类型-结构体】--结构体类型,结构体变量的创建和初始化,结构体内存对齐,结构体传参,结构体实现位段

结语: 本篇文章就到此结束了,本篇博客是数据结构与算法专栏的第二篇,在下篇博客中会接着为大家分享顺序表中的其它知识点。大家感兴趣的话可以先看一下往期回顾中的几篇文章,都是对于数据结构来说比较重要的一些C语言知识储备,以及上一篇的算法复杂度,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。

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

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

相关文章

Gateway路径匹配规则易错点

目录 一、问题描述 二、问题产生原因&#xff1a; 三、总结 一、问题描述 在做微服务的项目的时候&#xff0c;选择在nacos上配置Gateway网关的路由规则&#xff0c;然后在进行前后端联调测试的时候发现&#xff0c;部分的微服务可以正常访问&#xff0c;但是commerce-servic…

什么是大模型应用开发

一、概念点 自然语言处理&#xff08;NLP:Natural Language Processing&#xff09; 大模型&#xff08;LLM:Large Language Models&#xff09; 模型部署&#xff1a;云部署、本地部署、开放API 本地部署最简单的一种方案&#xff1a;ollama https://ollama.com 二、大模型应…

Linux系统能ping通ip但无法ping通域名的解决方法

一、先确认系统网络管理服务 现代 Linux 发行版常用 NetworkManager 或 systemd-networkd 管理网络&#xff0c;而非传统 networking.service &#xff0c;先检查系统在用的网络服务&#xff1a; 1.检查 NetworkManager 执行以下命令&#xff1a; sudo systemctl status …

0_序章导论

​​课程整体框架​​ ​​时长​​&#xff1a;4周 ​​终极目标​​&#xff1a; &#x1f449; 学完后比大公司CEO更懂AI&#xff0c;能领导团队解决实际问题 ​​每周核心内容分解​​ ​​第一周&#xff1a;重新认识AI的本质​​ ​​弱AI&#xff08;ANI&#xff09; …

docker一键清除指令

在 Linux 系统中&#xff0c;关闭 Docker 服务及容器的指令如下&#xff0c;具体操作需根据需求选择&#xff1a; 1. 停止 Docker 容器 (1) 停止所有正在运行的容器 # 停止所有运行中的容器&#xff08;推荐优雅关闭&#xff09; docker stop $(docker ps -q)(2) 强制停止所有…

阿里云主机自动 HTTPS 证书部署踩坑实录

阿里云主机自动 HTTPS 证书部署踩坑实录 前言 请原谅本篇标题,阿里云其实非常好用,只是细节很多,尤其是在HTTPS证书的配置和使用上。希望通过这篇文章,能够帮助到遇到类似问题的朋友们。 原理 服务器运行 acme.sh 脚本,自动申请和更新 Let’s Encrypt 的 SSL 证书。ac…

Vue Class绑定:字符串形式详解与应用

Vue Class绑定:字符串形式详解与应用 在Vue中,class绑定有多种形式,其中字符串形式是最基础且常用的一种。我将通过一个完整的示例展示其用法和优势。 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><…

MySQL 与 Oracle 分区表详解:相同点与不同点

在数据库管理中&#xff0c;随着数据量的不断增长&#xff0c;如何高效地存储和查询数据成为了一个关键问题。分区表技术通过将大型表划分为多个更小、更易于管理的部分&#xff0c;显著提升了数据库的性能和可维护性。MySQL 和 Oracle 作为两款主流的关系型数据库管理系统&…

在MATLAB中绘制阵列天线的散射方向图

在MATLAB中绘制阵列天线的散射方向图 RCS元因子、RCS阵因子、总的RCS 单基地雷达 文章目录 前言一、雷达散射界面的定义二、阵列天线的雷达散射界面三、MATLAB仿真总结 前言 \;\;\;\;\; 在无线通信、雷达和天线设计中&#xff0c;分析阵列天线的散射特性至关重要。散射方向图&a…

SaaS+AI架构实战,

近年来&#xff0c;随着云计算技术的成熟和市场需求的变化&#xff0c;SaaS&#xff08;软件即服务&#xff09;已成为企业数字化转型的核心工具。与传统软件相比&#xff0c;SaaS通过云端按需交付服务&#xff0c;大幅降低了企业的IT部署成本&#xff0c;同时提供了更高的灵活…

网络安全应急响应实战笔记

网络安全应急响应实战笔记 项目介绍 面对各种各样的安全事件&#xff0c;我们该怎么处理&#xff1f; 这是一个关于安全事件应急响应的项目&#xff0c;从系统入侵到事件处理&#xff0c;收集和整理一些案例进行分析。 GitHub 地址&#xff1a;https://github.com/Bypass007…

国产Linux银河麒麟操作系统安装开源免费Draw.io(diagrams.net)替代Visio

一、Draw.io&#xff08;diagrams.net&#xff09;与 Microsoft Visio 对比&#xff1a; Draw.io&#xff08;现更名为 diagrams.net&#xff09;是一款流行的免费在线图表工具&#xff0c;可以作为 Microsoft Visio 的替代品。draw.io 支持 UML、流程图、架构图&#xff0c;模…

asio之socket RAII管理socket_holder

简介 socket_holder实现对socket的RAII管理 结构 #mermaid-svg-7AbOnlAgmXN8WUnw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7AbOnlAgmXN8WUnw .error-icon{fill:#552222;}#mermaid-svg-7AbOnlAgmXN8WUnw .er…

Python训练营---DAY56

DAY 56 时序数据的检验 知识点回顾&#xff1a; 假设检验基础知识 原假设与备择假设P值、统计量、显著水平、置信区间 白噪声 白噪声的定义自相关性检验&#xff1a;ACF检验和Ljung-Box 检验偏自相关性检验&#xff1a;PACF检验 平稳性 平稳性的定义单位根检验 季节性检验 ACF检…

【python深度学习】Day 56 时序数据的检验

知识点&#xff1a; 假设检验基础知识 原假设与备择假设P值、统计量、显著水平、置信区间 白噪声 白噪声的定义自相关性检验&#xff1a;ACF检验和Ljung-Box 检验偏自相关性检验&#xff1a;PACF检验 平稳性 平稳性的定义单位根检验 季节性检验 ACF检验序列分解&#xff1a;趋势…

搭建网站时用到的技术

jQuery AJAX FLASK框架 要再Python的虚拟环境下部署 接下来创建项目文件夹 /data/demo 进入demo目录中&#xff0c;创建虚拟环境 ​​激活虚拟环境后&#xff0c;所有操作都基于创建时使用的 Python 版本​​ virtualenv venv 成功会生成一个venv文件夹&#xff0c; 接…

Docker知识点汇总——AI教你学Docker

Docker & Docker Compose 全面知识点梳理 一、Docker 基础知识 1.1 Docker 概念 什么是容器、镜像、仓库、Docker 引擎容器与虚拟机的区别Docker 的应用场景与优势 1.2 Docker 安装与配置 各操作系统&#xff08;Linux、Windows、macOS&#xff09;上的安装方法配置加…

Agent轻松通-P1:什么是Agent?

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录 1 引言2 基础概念3 Agent的挑战3.1 复杂度带来的…

Grafana MySQL监控大盘指标图趋势不连续分析

问题现象 通过benchmarksql对MySQL数据库做压测完发现Grafana关于该数据库的监控图趋势不连续&#xff0c;监控数据异常。 说明&#xff1a;Prometheusmysqlexpoter都通过容器运行 日志分析 检查了其他数据库节点跟主机节点趋势图均正常&#xff0c;排除 Prometheus 的问题&a…

Python实例题:基于区块链的去中心化应用平台(区块链、智能合约)

目录 Python实例题 题目 问题描述 解题思路 关键代码框架 难点分析 扩展方向 Python实例题 题目 基于区块链的去中心化应用平台&#xff08;区块链、智能合约&#xff09; 问题描述 开发一个基于区块链的去中心化应用平台&#xff0c;包含以下功能&#xff1a; 区块…