【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】常用的字符转义:“>“,“<“,““,“/“等
概要 字符转义是指在编写代码或处理文本数据时,将特殊字符转换为另一种形式,以便在特定的上下文中正确解析和处理这些字符。 内容 特殊字符描述XML转义表示法&和符号&<小于符号<>大于符号>"双引号"单引号&ap…...
李宏毅深度学习项目——HW1个人笔记
视频链接 PDF链接 googleColab链接 GoogleColab是一个免费的jupyter notebook,可以用上面的gpu资源进行训练 题目 通过前两天的数据,预测第三天某个人感染新冠的概率 范例 导包 # 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)人脸识别模型是根据什么来识别个人的
可解释性人脸识别(XFR)? 人脸识别有一个任务叫1:N(识别)。这个任务将一个人的照片与N张注册照片进行比较,找出相似度最高的人。 这项任务用于刑事调查和出入境点。在犯罪调查中,任务从监控摄像…...
仓库管理系统的设计
管理员账户功能包括:系统首页,个人中心,管理员管理,公告管理,物资管理,基础数据管理,用户管理 用户账户功能包括:系统首页,个人中心,公告管理,物…...
最火AI角色扮演流量已达谷歌搜索20%!每秒处理2万推理请求,Transformer作者公开优化秘诀
卡奥斯智能交互引擎是卡奥斯基于海尔近40年工业生产经验积累和卡奥斯7年工业互联网平台建设的最佳实践,基于大语言模型和RAG技术,集合海量工业领域生态资源方优质产品和知识服务,旨在通过智能搜索、连续交互,实时生成个性化的内容…...
MySQL:MySQL分组排序函数rank()、row_number()、dense_rank()与partition by结合使用
一、前言 在 MySQL 中,虽然标准的 SQL 函数 RANK(), ROW_NUMBER(), 和 DENSE_RANK() 是 SQL 标准的一部分,但早期的 MySQL 版本并不直接支持这些窗口函数。然而,从 MySQL 8.0 开始,这些函数被引入以支持窗口函数(也称为…...
opencv c++ 检测图像尺寸大小,标注轮廓
1. 项目背景 本项目旨在开发一个图像处理程序,通过使用计算机视觉技术,能够自动检测图像中物体的尺寸并进行分类。项目利用了开源的计算机视觉库 OpenCV,实现了图像的灰度处理、二值化、轮廓检测、边界框绘制以及尺寸分类等功能。通过这些功…...
Python数据可视化基础:使用Matplotlib绘制图表
Python数据可视化基础:使用Matplotlib绘制图表 数据可视化是数据分析中的重要环节,它可以帮助我们更直观地理解数据。Python作为一门强大的编程语言,提供了多种库来支持数据可视化,其中Matplotlib是最为流行和功能丰富的库之一。…...
Java开发接口设计的原则
在现代软件开发实践中,接口设计扮演着至关重要的角色。它不仅关乎代码的结构和未来的可维护性,还直接影响到软件系统的灵活性和扩展性。本文将通过实例详解几个核心的接口设计原则,帮助开发者更好地编写和管理接口,从而提升软件的…...
[火灾警报系统]yolov5_7.0-pyside6火焰烟雾识别源码
国内每年都会发生大大小小的火灾,造成生命、财产的损失。但是很多火灾如果能够早期发现,并及时提供灭火措施,将会大大较小损失。本套源码采用yolov5-7.0目标检测算法结合pyside6可视化界面源码,当检测到火灾时,能否发出…...
机器学习和深度学习区别
定义和范围: 机器学习:是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改…...
【功能详解】银河麒麟操作系统“安全启动”是如何发挥作用的?
2023年12月,财政部、工信部发布了7项信息类产品《政府采购需求标准》,为包括操作系统在内多项产品的政府集中采购提供政策支撑。其中,安全、可信作为国产操作系统的基本要求备受关注。 安全体系的构建离不开操作系统本身的硬实力,…...
关于多线程的理解
#系列文章 关于时间复杂度o(1), o(n), o(logn), o(nlogn)的理解 关于HashMap的哈希碰撞、拉链法和key的哈希函数设计 关于JVM内存模型和堆内存模型的理解 关于代理模式的理解 关于Mysql基本概念的理解 关于软件设计模式的理解 关于Redis知识的理解 文章目录 前言一、线程…...
C语言 | Leetcode C语言题解之第155题最小栈
题目: 题解: //单调栈 单调递减 typedef struct {//正常 stackint stack[10000];int stackTop;//辅助 stackint minStack[10000];int minStackTop; } MinStack;MinStack* minStackCreate() {MinStack* newStack (MinStack *) malloc(sizeof(MinS…...
Qdrant 的基础教程
目录 安装Qdrant安装Qdrant客户端初始化Qdrant客户端创建集合(Collection)插入向量数据创建索引搜索向量清理资源 Qdrant是一个开源的向量数据库,它专注于高维向量的快速相似性搜索。以下是一个基础的Qdrant教程,帮助你开始使用Qd…...
任务4.8.3 利用SparkSQL统计每日新增用户
实战概述:利用SparkSQL统计每日新增用户 任务背景 在大数据时代,快速准确地统计每日新增用户是数据分析和业务决策的重要部分。本任务旨在使用Apache SparkSQL处理用户访问历史数据,以统计每日新增用户数量。 任务目标 处理用户访问历史数…...
DS知识点总结--线性表定义及顺序表示
数据结构知识点汇总(考研C版) 文章目录 数据结构知识点汇总(考研C版)二、线性表2.1 线性表的定义和操作2.1.1 线性表的定义2.1.2 线性表的基本操作 2.2 线性表的顺序表示2.2.1 顺序表的定义2.2.2 顺序表上的基本操作的实现 二、线性表 2.1 线性表的定义和操作 2.1.1 线性表的…...
百度文库AI产品“橙篇”:支持10万字长文生成,开启AI创作新篇章
6月19日,百度文库发布了一款创新产品「橙篇」,这一行业首创的产品集成了10万字长文生成及多模态编辑能力,成为首个实现「查阅创编」一站式AI自由创作平台的里程碑。 百度“橙篇”官网: 地址:橙篇AI - 用橙篇…...
wsl子系统ubuntu20.04 设置docker服务开机自启动
docker的重要性毋庸置疑。掌握虚拟化必备工具。windows台式机相信大家都有,那么开启windows的wsl子系统ubuntu来熟悉linux分布式开发就方便多了,用不着另购电脑。docker是在有限成本前提下尽可能多的尝试使用多OS、隔离物理环境影响的方便工具。下面就介…...
SAP ScreenPersonas
https://developers.sap.com/mission.screen-personas.html 跟着这个练习做一遍就了解了Personas 访问SAP提供的Personas练习系统 申请用户 登录练习系统 随便找一个可以支持Personas的程序搞起来,比如IW51 执行后等它出现这个图标就可以开始了....
充电学习—3、Uevent机制和其在android层的实现
sysfs 是 Linux userspace 和 kernel 进行交互的一个媒介。通过 sysfs,userspace 可以主动去读写 kernel 的一些数据,同样的, kernel 也可以主动将一些“变化”告知给 userspace。也就是说,通过sysfs,userspace 和 ker…...
“河南省勘察设计资质整合趋势与企业应对“
"河南省勘察设计资质整合趋势与企业应对" 河南省勘察设计资质的整合趋势与企业应对策略可以从以下几个方面来分析: 整合趋势: 资质标准简化与合并:随着国家和地方政府深化“放管服”改革,勘察设计资质的管理趋向简化&…...
简单了解雪花算法
雪花算法是什么 不多解释。看一看 具体是怎么 生产 唯一ID 的。 ID 由多个数据组合拼接成64位,分别是 时间戳 服务器节点ID 序列号,每个数据项占的位数不固定,可以根据实际需求设置。首位 1 个二进制位 是 符号位。 public long allocate(l…...
自己做的视频网站上传电影/推广链接点击器
2019独角兽企业重金招聘Python工程师标准>>> #情景描述 以Mysql作为数据库的JavaWeb项目,对于Mysql中的Time,Date,DateTime类型,Java的对应类型都是Date。Java程序在存储和读取相应字段的数据的时候,有时候…...
做网站需要参考书目书/网站建设软件
TRUNCATE,DORP,DELETE 相同点: truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: 1. truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但…...
可以在家做兼职的网站/营销号
转载于:https://www.cnblogs.com/classmethond/p/9388307.html...
做网站的windowlcd/b站官方推广
转自:http://hi.baidu.com/jingweiyoung/item/55a895cc22b8abdeee183bb0 linux下为了多线程同步,通常用到锁的概念。 posix下抽象了一个锁类型的结构:ptread_mutex_t。通过对该结构的操作,来判断资源是否可以访问。顾名思义&#…...
常州网站制作企业/源码交易网站源码
目录 01 准备工作 02 环境配置 03 CDH安装 报错 01 准备工作 官网地址下载页面:https://www.cloudera.com/downloads/cdh.html,现在下载好像需要注册一个账号,下面的链接进入后需要登录,也可以自行在上面的下载页面找。 CDH…...
国内最好的网站建设/网站开发与设计
默认用户有这么几个,system,sys,scott,hr ,一般scott 和hr 作为你的练习用户.system的默认密码是 managersys的默认密码是 change_on_install练习用户,oracle 10g 以后需要解锁.使用sys或者system 用户登录以后,使用如下命令解锁alter user scott identified by tiger account …...