数据结构之顺序表详解:从原理到C语言实现

news2024/11/24 2:25:03

引言

在上一篇文章中我们讲到了时间复杂度空间复杂度,今天我们接着讲数据结构中的内容。

数据的存储和组织方式决定了程序的效率。而顺序表,也就是大家熟悉的数组,正是我们编程中的“起步工具”。它简单易懂,却能帮你解决许多实际问题。那么什么是顺序表呢?

1. 什么是顺序表?

顺序表,简单来说就是你常见的数组(Array)。它是一种线性表,指的是数据按照顺序排列、依次存储在连续的内存空间中。你可以把顺序表想象成一排紧密排列的座位,每个座位上都可以放一个数据,每个座位都有自己的编号(索引),你可以通过这个编号快速找到想要的座位上的数据。

虽然顺序表看似简单,但理解它的运作原理以及如何高效使用它,将为你后续学习更复杂的数据结构打下坚实的基础。

在这篇文章中,我将带你深入探讨顺序表的基础知识、实现方式、常见操作以及优缺点,并结合C语言代码一步步展示如何操作和应用顺序表。无论你是刚开始编程,还是想巩固基础,这篇文章都将帮助你更好地掌握这一重要的概念。废话不多说,我们开始今天的学习之旅吧~~~

2. 顺序表的特点

顺序表的几个显著特点包括存储连续性、随机访问、固定大小和插入删除的代价较高。这些特点直接影响了我们在不同场景下选择使用顺序表的决策。具体如何,我们接着看。

3. 顺序表的基本操作

顺序表的基本操作包括:插入删除查找更新。下面我将逐一介绍这些操作,并对每段代码进行详细的解释。

1). 插入元素

在顺序表中插入元素时,我们需要注意插入的位置。如果是在表的末尾,操作相对简单;如果是在中间,可能需要移动后面的元素。以下是插入元素的代码实现:

#include <stdio.h>

void insert(int arr[], int *size, int pos, int value) {
    // 向后移动元素
    for (int i = *size; i > pos; i--) {
        arr[i] = arr[i - 1]; // 将元素逐一向后移动
    }
    // 插入新值
    arr[pos] = value; // 在指定位置插入新值
    (*size)++; // 增加顺序表的大小
}
  • void insert(int arr[], int *size, int pos, int value)定义了一个函数,接受数组arr、当前大小size的指针、插入位置pos和要插入的值value
  • for (int i = *size; i > pos; i--)从顺序表的最后一个元素开始,向前遍历到插入位置。*size代表当前顺序表的大小。
  • arr[i] = arr[i - 1]将当前位置的元素向后移动一个位置,以腾出插入的空间。
  • arr[pos] = value在指定位置插入新值。
  • (*size)++插入元素后,顺序表的大小增加1。
2). 删除元素

删除元素时,同样需要将删除位置之后的元素向前移动,以保持顺序表的连续性。以下是删除元素的代码实现:

void delete(int arr[], int *size, int pos) {
    // 向前移动元素
    for (int i = pos; i < *size - 1; i++) {
        arr[i] = arr[i + 1]; // 将后面的元素向前移动
    }
    (*size)--; // 减少顺序表的大小
}
  • void delete(int arr[], int *size, int pos)定义了一个函数,接受数组arr、当前大小size的指针和要删除的元素位置pos
  • for (int i = pos; i < *size - 1; i++)从删除位置开始,遍历到倒数第二个元素(因为最后一个元素需要被覆盖)。
  • arr[i] = arr[i + 1]将当前位置的元素替换为下一个位置的元素,从而“覆盖”要删除的元素。
  • (*size)--删除元素后,顺序表的大小减少1。
3). 查找元素

查找顺序表中的元素可以通过索引直接访问。以下是查找元素的代码实现:

int get(int arr[], int size, int pos) {
    if (pos >= 0 && pos < size) {
        return arr[pos]; // 返回指定位置的值
    }
    return -1; // 返回-1表示索引无效
}
  • int get(int arr[], int size, int pos):定义了一个函数,接受数组arr、当前大小size和要查找的元素位置pos
  • if (pos >= 0 && pos < size):检查索引pos是否有效,确保在合法范围内。
  • return arr[pos]如果索引有效,返回对应位置的值。
  • return -1如果索引无效,返回-1作为错误指示。
4). 更新元素

更新顺序表中的元素只需通过索引找到目标元素并进行赋值。以下是更新元素的代码实现:

void update(int arr[], int size, int pos, int value) {
    if (pos >= 0 && pos < size) {
        arr[pos] = value; // 更新指定位置的值
    }
}
  • void update(int arr[], int size, int pos, int value)定义了一个函数,接受数组arr、当前大小size、要更新的元素位置pos和新值value
  • if (pos >= 0 && pos < size):检查索引是否有效。
  • arr[pos] = value:如果有效,将指定位置的值更新为新值。

4. 顺序表的优缺点

上面我们说到顺序表的特点。所以它在不同的场景下表现各异。我们就需要充分理解它的优缺点,以便在合适的场景中使用它。

优点:
  • 快速访问:由于支持随机访问,顺序表能够在O(1)的时间内通过索引找到元素,这在需要频繁查找的场景中非常有用。
  • 结构简单:顺序表的实现相对简单,是编程入门的一个良好选择。
缺点:
  • 插入和删除效率低:每次在中间插入或删除元素时,都会导致大量的元素移动,效率较低,特别是数据量大时。
  • 固定容量:数组一旦定义,大小就固定了,无法动态调整。因此在实际使用中,可能会出现空间不足或浪费空间的情况。

5. 顺序表的应用场景

顺序表非常适合那些需要频繁访问元素的场景,比如:

  • 查找元素频繁:当需要快速访问元素时,顺序表的随机访问特性可以提供极高的性能。
  • 插入和删除较少:顺序表适合数据更新较少的情况,尤其是数据量固定、变动较少的场景。

例如:

  • 学生成绩表:当我们只需要根据学生的序号快速查找成绩时,顺序表是一个非常好的选择。
  • 图像处理:像素点数据通常以二维数组的形式存储,可以高效访问和处理。

6. 何时不使用顺序表

尽管顺序表有很多优点,但它并不适合所有场景,特别是在以下情况下:

  • 频繁插入/删除:当你的程序中存在大量的插入和删除操作时,顺序表会变得低效,链表可能是更好的选择。
  • 动态扩展需求:当数据量不可预估且需要动态扩展时,顺序表的固定大小会成为限制。

当然,顺序表也能有动态扩展,但是它并不是最好的选择,每次扩容它都会有额外的消耗,如果有老铁想要知道顺序表的动态扩展可以评论区留言,这里我不展开讲。


7. 总结

顺序表是数据结构的基础部分,它提供了快速的随机访问能力,适合数据量固定且访问频繁的场景。在C语言中,顺序表的实现相对简单,是初学者理解线性数据结构的理想起点。

在学习顺序表的过程中,建议你多动手实践,尝试实现插入、删除、查找等操作,这不仅能帮助你理解顺序表的原理,还能为你未来学习更复杂的数据结构(如链表、栈、队列)打下坚实的基础。

下一步,我将深入讨论链表及其在灵活数据存储中的应用。顺序表虽然性能优越,但在一些特定场景中,链表的灵活性会表现得更好。

最后如果觉得有收获的话记得点赞加收藏哦~~~

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

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

相关文章

python利用电脑默认打开方式打开文件,视频,图片

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理python利用os库打开本地文件的方法。 这个确实比较简单。 利用os库的 os.startfile("mp4") 函数即可用系统默认打开方式打开文件。 这里打开视频进行测试。 import os os.startfile("…

linux 虚拟环境下源码安装DeepSpeed

第一步&#xff1a;创建虚拟环境&#xff1a; conda create -n deepspeed python3.10 第二步&#xff1a;进入虚拟环境&#xff0c;安装Pytorch 2.3.1 # CUDA 12.1 conda install pytorch2.3.1 torchvision0.18.1 torchaudio2.3.1 pytorch-cuda12.1 -c pytorch -c nvidia 第…

谷粒商城(学习笔记)

配置刷新的注解 数据表中不存在的数据 gateway路径重写 CORS跨域 调整路由顺序&#xff1a; TODO是什么:备忘录 逻辑删除 axios有请求缓存&#xff1a; 请求的模版&#xff01; 删除成功后&#xff0c;重新获取数据&#xff01; 删除成功之后&#xff0c;还有提示消息 删除成功…

八大排序--08快速排序

现有 arr {4,8,9,2,7}数组&#xff0c;请用快速排序的方式实现从小到大排序&#xff1a; 方法&#xff1a; 1.定义待排序数组中的第一个值为基准数&#xff1b; 2.定义j游标&#xff0c;从后向前移动找到第一个比基准数小的值停下&#xff1b; 3.定义i游标&#xff0c;从后向…

自定义注解和组件扫描在Spring Boot中动态注册Bean(一)

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在Spring Boot中&#xff0c;自定义注解和组件扫描是两种强大的机制&#xff0c;它们允许开发者以声明性的方式动态注册Bean。这种方式不仅提高了代码的可读性和可维护性&#xff0c;还使得Spring Boot应用的…

区域识别——基于python语言

目录 目录 1.水域识别 2.模型介绍 3.文件框架 4.代码示例 4.1 data_preprocess.py 4.2 model1.0.py 4.3 train2.0.py 4.4 predict.py 4.5 运行结果 5.总结 1.水域识别 人眼看见河道可以直接分辨出这是河道&#xff0c;但是如何让计算机也能识别出这是河道呢&#x…

无序中的秩序:Transformer模型的创新性结构解析

最近我在看论文时&#xff0c;发现很多都在用 Transformer 模型&#xff0c;我知道transformer很有名&#xff0c;但是我也只是听说过他的大名&#xff0c;不知道他具体是做什么怎么做的&#xff0c;因此我决定深入了解一下&#xff0c;并做个简单记录&#xff0c;方便以后参考…

TDC上YARN Web-UI 查看application日志方法

方法一 #通过浏览器访问tdc&#xff0c;访问的工作节点对于TDC都是外部节点。在提交给yarn任务后&#xff0c;YarnRM的Web UI 可以展示yarnnm上运行的application日志&#xff0c;但是由于跳转的svc地址&#xff0c;无法直接访问。 #在tdc界面上找到yarn实例&#xff0c;进入ya…

【Scala入门学习】集合常用方法和函数操作

1. foreach循环遍历 foreach 方法的原型&#xff1a; // f 返回的类型是Unit&#xff0c; foreach 返回的类型是Unit def foreach[U](f: Elem > U) 该方法接受一个函数 f 作为参数&#xff0c; 函数 f 的类型为Elem > U&#xff0c;即 f 接受一个参数&#xff0c;参数…

达梦数据库(DM)单机典型安装

达梦数据库&#xff08;DM&#xff09;单机典型安装 环境&#xff1a;centos7.6 1、创建用户 #增加用户和组&#xff0c;用于安装管理达梦数据库。 新建用户组&#xff1a;groupadd dinstall 新建用户&#xff1a;指定用户组&#xff0c;家目录&#xff0c;shell。useradd -g…

反转链表解题思路

题目描述 给定一个单链表的头结点pHead&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 示例&#xff1a;当输入链表{1,2,3}时&#xff0c;经反转后&#xff0c;原链表变为{3,2,1}&#xff0c;所以对应的输出为{3,2,1}。 解题思路&#xff1a;迭…

股市大涨下的会展业创新者

近期&#xff0c;股市涨势强劲有力&#xff0c;各大指数普遍上扬&#xff0c;市场活力空前。与此同时&#xff0c;伴随全球经济逐步复苏及会展行业不断发展&#xff0c;上市展览公司机遇与挑战并存。国内外市场需求持续增长拓展了广阔发展空间&#xff0c;但同时行业竞争愈发激…

中国宏观经济与产业发展:挑战与机遇并存

#长沙屿# 在复杂多变的国内外经济形势之下&#xff0c;中国经济已然步入一个至关重要的发展阶段。今日&#xff0c;让我们深入剖析当前经济形势&#xff0c;对中国宏观经济的运行现状及产业发展的趋势展开深度探讨。 2024年&#xff0c;中国经济运行总体平稳、稳中有进&#x…

职场启悟:没有靠山的你,45岁前必知的5大潜规则

我是农村孩子&#xff0c;父母都是农民&#xff0c;毕业一切都是靠着自己找工作&#xff0c;在陌生的大城市除了认识老师就是同学。记得那是我初入职场的第三个月&#xff0c;每天我都沉浸在无尽的工作中&#xff0c;加班到深夜&#xff0c;周末也时常无休。我觉的农村孩子只能…

Chainbase :链原生的 Web3 AI 基建设施

“随着 Chainbase 在生态系统和市场方面的进一步拓展&#xff0c;其作为链原生 Web3 AI 基建设施的价值将愈发显著。” 算法、算力和数据是 AI 技术的三大核心要素。实际上&#xff0c;几乎所有的 AI 大模型都在不断革新算法&#xff0c;以确保模型能够跟上行业的发展趋势&…

机器学习中的模型设计与训练流程详解

目录 前言1. 模型设计1.1 数据特性分析1.2 计算资源限制1.3 应用场景需求 2. 模型训练2.1 训练集与验证集的划分2.2 损失函数的选择2.3 模型参数更新 3. 优化方法3.1 梯度下降法3.2 正则化方法 4. 模型测试4.1 性能评估指标4.2 模型的泛化能力 5. 模型选择5.1 数据规模与模型复…

怎么提取人声去掉背景音乐?人声提取秘籍:去掉背景音乐的技巧

在数字化时代&#xff0c;音频处理变得越来越普遍&#xff0c;我们经常需要从一段音频或视频中提取出纯净的人声&#xff0c;而去除掉背景音乐或其他杂音。这种需求在视频编辑、音乐制作、甚至在学习和娱乐中都十分常见。本文将介绍几种简单易行的方法&#xff0c;帮助你轻松提…

【Spring】获取 Cookie和Session

回顾 Cookie HTTP 协议自身是属于“无状态”协议 无状态&#xff1a;默认情况下&#xff0c;HTTP 协议的客户端和服务器之间的这次通信和下次通信之间没有直接的联系 但是在实际开发中&#xff0c;我们很多时候是需要知道请求之间的关联关系的 例如登录网站成功后&#xff…

抖音小游戏画图位置移动

文章目录 画图移动图形位置 画图 const canvas tt.createCanvas(); const context canvas.getContext(2d);context.width 500; context.height 500;let isPressing false; // 是否按下 let startX 0; let startY 0;context.fillStyle "#f00"; context.fillR…

@zabbix监控网站黑链接监控及数据推送

zabbix监控网站黑链接及数据推送 文章目录 zabbix监控网站黑链接及数据推送1.检测脚本1》编写python脚本2》脚本执行 2.数据推送1》方案一2》方案二 3.zabbix web 1.检测脚本 1》编写python脚本 创建脚本check_black_links.py&#xff0c;使用python脚本实现网站黑链接检测&a…