当前位置: 首页 > news >正文

【C语言】顺序表(上卷)

什么是数据结构?

数据结构是由“数据”和“结构”两词组合而来的。

数据需要管理。数据结构就是计算机存储、组织数据的方式。比如一个班级就是一个结构,管理的就是班级里的学生。如果我们要找三年2班的同学李华,就可以直接去三年2班找而不用大海捞针。

其实我们已经学过一种数据结构:数组。有了数组后我们就可以通过下标,对指定的数据进行修改等操作。

顺序表

顺序表底层就是数组,是在数组的基础上进行了维护和封装。

那么,为什么我们已经有了数组,还要有顺序表呢?

比如我们想在数组最后的地方增加一个数据,知道位置后我们可以添加,但如果在大型程序中我们时常需要增删查改,会比较麻烦,而顺序表就提供了现成的方法可以使用。

数组和顺序表的区别就像苍蝇馆子和米其林餐厅的区别,食材都差不多,但由于摆盘等区别开来。在数组基础上,顺序表增加了增删查改的方法。

线性表

顺序表是线性表的一种

那么什么是线性表?是具有相同特性的数据结构的集合。

举个例子,蔬菜不是某个具体的菜,而是莲藕、白菜、南瓜这些菜的集合。可以看到“蔬菜”具有一些共同的特征。水果有菠萝、草莓、树莓等,也是类似的道理。

草莓是水果里的一种,就像顺序表是线性表里的一种。

那么,线性表里的数据结构有哪些相同的特性呢?

线性表从两个方面有相同特性:物理结构和逻辑结构

什么是物理结构?举个例子,数组arr[10]有10个空间,它的10个空间是连续的。每个空间都有自己的地址,称之为物理地址或物理内存。所以物理结构指的是数据在内存里面存储的时候的结构是否是物理的,也就是在内存上存储的时候长什么样子。

在线性表中,物理结构通常来说是不一定连续,而逻辑结构是连续的。

什么是逻辑结构?也就是想象出来的结构。比如去商店买东西排队时就是线性的,站成一条线,但实际上排队时并不总是站成笔直的一条线,而是可能站得零零散散的一条线。所以抽象来说是站成了一条线,这条线是我们想象出来的。

数组的物理结构是线性的。它的逻辑结构也是线性的。

数组在物理结构上是连续的,因为通过arr+1、arr+2...我们就可以连续地访问数据。

现在回过头来看顺序表,顺序表的特性:逻辑结构一定是连续的(因为线性表在逻辑结构上一定是连续的);物理结构是连续的(顺序表底层是数组,在物理结构上的连续的)。

给数组申请空间,我们有两种方式:

int arr[10]={0}        定长的数组

int* arr        动态内存开辟,确定大小后再去动态申请

 所以顺序表的分类

静态顺序表的定义:

struct SeqList

{

        int arr[100];//定长数组,编译阶段已确定大小

        int size;//顺序表当前有效的数据个数(存储了几个数据)

};

动态顺序表的定义:

struct SeqList

{

        int* arr;

        int size;//顺序表当前有效的数据个数

        int capacity;//当前空间大小

};

哪种顺序表更好呢?我们能精确预测到需要多大空间来存储信息呢? 如果后续我们一开始设置好的空间不够了,可能就会丢失用户信息等。也就是说数组大小给小了,空间不够用;数组大小给大了,会浪费空间。(代码能力很差,可能带来经济损失)

所以动态顺序表更好,可以动态增容,不够时我们就增容。

动态顺序表的实现与各种方法

我们创建3个文件,.h文件用来放顺序表结构、声明顺序表的方法,.c文件用来放实现顺序表的方法。最后再创建一个测试文件,也是.c结尾。

顺序表的初始化

注意:用typedef的意义在于我们想要改数据的类型时可以省去代码中的一个个修改。 (尤其是代码量大时)

顺序表的销毁

顺序表我们是动态开辟来的,所以要手动释放空间。

SeqList.h

SeqList.c

test.c

顺序表如何插入数据 

插入数据可以在顺序表的头部或尾部位置插入。

尾插

在插入数据前,我们需要先确保当前有空间可以插入数据。

插入数据前我们先进行空间是否足够的判断。

SeqList.c

注意,增容我们要申请多大的空间或者说一次增容多大呢?

增容通常来说是成倍数的增加,一般是2或者3倍。(往往是2倍)

realloc时,如果后续空间不足就会在其他地方重新申请空间,将原来数据拷贝过来并释放掉原来的空间。这个步骤是比较麻烦的,如果一次次realloc,每次申请空间都要重复这一过程,会造成性能低下,或者说程序的运行效率大大降低。

而增得太大又浪费空间,所以2倍2倍去扩容比较好。

了解了这一点后我们可以写成尾插函数代码:

SeqList.c

可以看到虽然插入数据的代码只有最后一行,前面的准备工作却必不可少。 

test.c

SeqList.h

头插

在这一步我们会发现,尾插和头插都需要判断空间是否足够,所以我们可以将其封装成一个函数:

然后我们再接着写头插代码:

 

顺序表如何删除数据 
尾删

SeqList.h

SeqList.c 

 

头删

SeqList.h 

 

SeqList.c  

 本文到此结束,祝阅读愉快^_^

相关文章:

【C语言】顺序表(上卷)

什么是数据结构? 数据结构是由“数据”和“结构”两词组合而来的。 数据需要管理。数据结构就是计算机存储、组织数据的方式。比如一个班级就是一个结构,管理的就是班级里的学生。如果我们要找三年2班的同学李华,就可以直接去三年2班找而不…...

Luma AI如何注册:文生视频领域的新星

文章目录 Luma AI如何注册:文生视频领域的新星一、Luma 注册方式二、Luma 的效果三、Luma 的优势四、Luma 的功能总结 Luma AI如何注册:文生视频领域的新星 近年来,Luma AI 凭借其在文生视频领域的创新技术,逐渐成为行业的新星。…...

一站式实时数仓Hologres整体能力介绍

讲师:阿里云Hologres PD丁烨 一、产品定位 随着技术的进步,大数据正从规模化转向实时化处理。用户对传统的T1分析已不满足,期望获得更高时效性的计算和分析能力。例如实时大屏,城市大脑的交通监控、风控和实时的个性化推荐&…...

如何在 Windows 上安装 Docker Desktop

如何在 Windows 上安装 Docker Desktop Docker 是一个开放平台,用于开发、部署和运行应用程序。Docker Desktop 是 Docker 在 Windows 和 macOS 上的官方客户端,它使得开发者能够轻松地在本地环境中构建、运行和共享容器化应用程序。本文将详细介绍如何…...

WPF由文本框输入的内容动态渲染下拉框

在做项目过程中,需要扫码枪扫描快递单号或者手动输入快递单号时,自动检索该单号是哪个快递公司的,下拉框中自动带出该单号的快递公司。当输入的快递单号不存在时,将数据库中所有快递公司都带出 效果: 通过输入的快递单…...

RPCMon:一款基于ETW的RPC监控工具

关于RPCMon RPCMon是一款基于事件跟踪的WindowsRPC监控工具,该工具是一款GUI工具,可以帮助广大研究人员通过ETW(Event Tracing for Windows)扫描RPC通信。 RPCMon能够为广大研究人员提供进程之间RPC通信的高级视图,该…...

【odoo】常用的字符转义:“>“,“<“,““,“/“等

概要 字符转义是指在编写代码或处理文本数据时&#xff0c;将特殊字符转换为另一种形式&#xff0c;以便在特定的上下文中正确解析和处理这些字符。 内容 特殊字符描述XML转义表示法&和符号&amp;<小于符号<>大于符号>"双引号&quot;单引号&ap…...

李宏毅深度学习项目——HW1个人笔记

视频链接 PDF链接 googleColab链接 GoogleColab是一个免费的jupyter notebook&#xff0c;可以用上面的gpu资源进行训练 题目 通过前两天的数据&#xff0c;预测第三天某个人感染新冠的概率 范例 导包 # Numerical Operations import math import numpy as np# Reading/Wr…...

3D Gaussian Splatting Windows安装

0.安装C++ 编译器 https://aka.ms/vs/17/release/vs_buildtools.exe 1.下载源码 git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive 2.安装cuda NVIDIA GPU Computing Toolkit CUDA Toolkit Archive | NVIDIA Developer 3.安装COLMAP...

人脸识别——可解释的人脸识别(XFR)人脸识别模型是根据什么来识别个人的

可解释性人脸识别&#xff08;XFR&#xff09;&#xff1f; 人脸识别有一个任务叫1:N&#xff08;识别&#xff09;。这个任务将一个人的照片与N张注册照片进行比较&#xff0c;找出相似度最高的人。 这项任务用于刑事调查和出入境点。在犯罪调查中&#xff0c;任务从监控摄像…...

仓库管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;公告管理&#xff0c;物资管理&#xff0c;基础数据管理&#xff0c;用户管理 用户账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告管理&#xff0c;物…...

最火AI角色扮演流量已达谷歌搜索20%!每秒处理2万推理请求,Transformer作者公开优化秘诀

卡奥斯智能交互引擎是卡奥斯基于海尔近40年工业生产经验积累和卡奥斯7年工业互联网平台建设的最佳实践&#xff0c;基于大语言模型和RAG技术&#xff0c;集合海量工业领域生态资源方优质产品和知识服务&#xff0c;旨在通过智能搜索、连续交互&#xff0c;实时生成个性化的内容…...

MySQL:MySQL分组排序函数rank()、row_number()、dense_rank()与partition by结合使用

一、前言 在 MySQL 中&#xff0c;虽然标准的 SQL 函数 RANK(), ROW_NUMBER(), 和 DENSE_RANK() 是 SQL 标准的一部分&#xff0c;但早期的 MySQL 版本并不直接支持这些窗口函数。然而&#xff0c;从 MySQL 8.0 开始&#xff0c;这些函数被引入以支持窗口函数&#xff08;也称为…...

opencv c++ 检测图像尺寸大小,标注轮廓

1. 项目背景 本项目旨在开发一个图像处理程序&#xff0c;通过使用计算机视觉技术&#xff0c;能够自动检测图像中物体的尺寸并进行分类。项目利用了开源的计算机视觉库 OpenCV&#xff0c;实现了图像的灰度处理、二值化、轮廓检测、边界框绘制以及尺寸分类等功能。通过这些功…...

Python数据可视化基础:使用Matplotlib绘制图表

Python数据可视化基础&#xff1a;使用Matplotlib绘制图表 数据可视化是数据分析中的重要环节&#xff0c;它可以帮助我们更直观地理解数据。Python作为一门强大的编程语言&#xff0c;提供了多种库来支持数据可视化&#xff0c;其中Matplotlib是最为流行和功能丰富的库之一。…...

Java开发接口设计的原则

在现代软件开发实践中&#xff0c;接口设计扮演着至关重要的角色。它不仅关乎代码的结构和未来的可维护性&#xff0c;还直接影响到软件系统的灵活性和扩展性。本文将通过实例详解几个核心的接口设计原则&#xff0c;帮助开发者更好地编写和管理接口&#xff0c;从而提升软件的…...

[火灾警报系统]yolov5_7.0-pyside6火焰烟雾识别源码

国内每年都会发生大大小小的火灾&#xff0c;造成生命、财产的损失。但是很多火灾如果能够早期发现&#xff0c;并及时提供灭火措施&#xff0c;将会大大较小损失。本套源码采用yolov5-7.0目标检测算法结合pyside6可视化界面源码&#xff0c;当检测到火灾时&#xff0c;能否发出…...

机器学习和深度学习区别

定义和范围&#xff1a; 机器学习&#xff1a;是一门多领域交叉学科&#xff0c;涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改…...

【功能详解】银河麒麟操作系统“安全启动”是如何发挥作用的?

2023年12月&#xff0c;财政部、工信部发布了7项信息类产品《政府采购需求标准》&#xff0c;为包括操作系统在内多项产品的政府集中采购提供政策支撑。其中&#xff0c;安全、可信作为国产操作系统的基本要求备受关注。 安全体系的构建离不开操作系统本身的硬实力&#xff0c…...

关于多线程的理解

#系列文章 关于时间复杂度o(1), o(n), o(logn), o(nlogn)的理解 关于HashMap的哈希碰撞、拉链法和key的哈希函数设计 关于JVM内存模型和堆内存模型的理解 关于代理模式的理解 关于Mysql基本概念的理解 关于软件设计模式的理解 关于Redis知识的理解 文章目录 前言一、线程…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...