码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【数据结构】顺序表详解


    文章目录

    前言

    一、顺序表是什么

    二、顺序表的基本操作

    1.初始化

    实现思想:

    代码如下(示例):

    2.顺序表扩容函数

    实现思想:

    代码如下(示例):

    3.顺序表头插

    实现思想:

    代码如下(示例):

    代码实现图(示例):

    4.顺序表尾插

    实现思想:

    代码如下(示例):

    代码实现图(示例):

    5.顺序表尾删

    实现思想:

    代码如下(示例):

    代码实现图(示例):

    6.顺序表头删

    实现思想:

    代码如下(示例):

    代码实现图(示例):

    7.顺序表查找

    实现思想:

    代码如下(示例):

    代码实现图(示例):

    8.顺序表任意位置插入

    实现思想:

    代码如下(示例):

    代码实现图(示例):

    9.顺序表任意位置删除

    实现思想:

    代码如下(示例):

    代码实现图(示例):

    10.销毁顺序表

    实现思想:

    代码如下(示例):

    11.顺序表打印

    实现思想:

    代码如下(示例):

    代码实现图(示例):

    12.顺序表修改

    实现思想:

    代码如下(示例):

    代码实现图(示例):

    总结


    前言

    本文详细的介绍了数据结构当中的最基础的顺序表,可以让初学者对顺序表进行深刻的的理解


    一、顺序表是什么

    顺序表是一种线性结构,它的逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入、删除时需要移动大量元素。顺序表可以分配一段连续的存储空间。顺序表上的基本操作有:初始化、顺序表头插、尾插、头删、尾删、查找、插入、删除、修改、销毁顺序表。

    二、顺序表的基本操作

    1.初始化

    一个程序要进行首先一个功能,首先要保证要进行初始化。对数据的初始化就如同汽车的车架子相同。

    实现思想:

    主体思想:为程序开辟所需要的内存空间,并对开辟的结构体进行初始化

    顺序表的初始化,首先要保证头节点地址不为空,然后使用malloc函数开辟一个固定大小结构体的空间,使结构体的当中的指针至指向该空间,并且判断是否开辟失败,如果失败perror函数返回开辟失败的原因,并将结构体的其他的变量进行初始化

    代码如下(示例):

    1. void SLInit(SL* ps)
    2. {
    3. assert(ps);
    4. ps->a = (SLDataType*)malloc(sizeof(SLDataType)*4);
    5. if (ps->a == NULL)
    6. {
    7. perror("malloc failed");
    8. return;
    9. }
    10. ps->size = 0;
    11. ps->capacity = 4;
    12. }

    2.顺序表扩容函数

    扩容函数主要是为满足增加功能在使用时的内存不足的情况,而该函数可以帮助函数进行空间的扩大

    实现思想:

    主体思想:先判断该结构体指向的地址不为空,然后进行数据存放数量和空间大小进行比较,如果有效存储空间满了就进行空间的增补,使用realloc函数进行在原来的空间的后面开辟空间,开辟失败就返回原因,并结束程序,开辟成功就在对指针进行重新的赋值有效空间同样进行跟改。

    代码如下(示例):

    1. void SLCheckCapacity(SL* ps)
    2. {
    3. assert(ps);
    4. // 满了要扩容
    5. if (ps->size == ps->capacity)
    6. {
    7. SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2 * (sizeof(SLDataType)));
    8. if (tmp == NULL)
    9. {
    10. perror("realloc failed");
    11. exit(-1);
    12. }
    13. ps->a = tmp;
    14. ps->capacity *= 2;
    15. }
    16. }

    3.顺序表头插

    顺序表的头插的通俗理解:

    就像在超市结账时一条长长的,尽然有序的买完东西人们正在排着队,突然来了一个人,以非常豪横的态度要第一个结账,大家看这个人不好惹,不想自找麻烦,就默认让这个人插了队,这个人插了队不要紧,因为他一个的插队造成第一个位置原本只能一个人的位置,现在两个人站着那里,就比较拥挤,这个时候,那个豪横的人就向后面的人说往后退一个位置,后面的人就和他后面的人说让个位置,就这样一个人的插入让整个队伍向后退了一个位置。

    实现思想:

    主体思想:判断结构体地址不为空。在判断空间是否足够,不够就扩容,然后利用数据的下标写一个循环进行数据向后移动,循环完的顺序表就可以利用下标在数组头部进行插入,再让有效数据的大小进行加一位

    代码如下(示例):

    1. void SLPushFront(SL* ps, SLDataType x)
    2. {
    3. assert(ps);
    4. SLCheckCapacity(ps);
    5. // 挪动数据
    6. int end = ps->size - 1;
    7. while (end >= 0)
    8. {
    9. ps->a[end + 1] = ps->a[end];
    10. --end;
    11. }
    12. ps->a[0] = x;
    13. ps->size++;
    14. }

    代码实现图(示例):

    4.顺序表尾插

    实现思想:

    主体思想:就数值的末端添加一个数据

    先判断传的地址是否为空,在进行扩容判断,在通过下标添加数据

    代码如下(示例):

    1. void SLPushBack(SL* ps, SLDataType x)
    2. {
    3. assert(ps);
    4. SLCheckCapacity(ps);
    5. ps->a[ps->size] = x;
    6. ps->size++;
    7. }

    代码实现图(示例):

    5.顺序表尾删

    实现思想:

    主体思想:将最后一个数值释放控制权

    确保传的地址和有效大小不为空,再对有效大小减少一位,这样就删除了尾数据。因为数据在空间当中的存储是比特,释放控制权就是让空间可以被其他人利用,我们不要了,不对其进行访问。

    代码如下(示例):

    1. void SLPopBack(SL* ps)
    2. {
    3. assert(ps);
    4. assert(ps->size > 0);
    5. ps->size--;
    6. }

    代码实现图(示例):

    6.顺序表头删

    实现思想:

    主体思想:让数据此前往后的进行打印复制

    代码如下(示例):

    1. void SLPopFront(SL* ps)
    2. {
    3. assert(ps);
    4. assert(ps->size > 0);
    5. int begin = 1;
    6. while (begin < ps->size)
    7. {
    8. ps->a[begin - 1] = ps->a[begin];
    9. ++begin;
    10. }
    11. ps->size--;
    12. }

    代码实现图(示例):

    7.顺序表查找

    实现思想:

    主体思想:通过下标指向的值进行判断来寻找

    代码如下(示例):

    1. int SLFind(SL* ps, SLDataType x)
    2. {
    3. assert(ps);
    4. for (int i = 0; i < ps->size; i++)
    5. {
    6. if (ps->a[i] == x)
    7. {
    8. return i;
    9. }
    10. }
    11. return -1;
    12. }

    代码实现图(示例):

    8.顺序表任意位置插入

    实现思想:

    主体思想:通过查找函数找到下标,将下标及后面的数据进行移动,再将新的数值通过下标插入进去。

    代码如下(示例):

    1. void SLInsert(SL* ps, int pos, SLDataType x)
    2. {
    3. assert(ps);
    4. assert(pos >= 0 && pos <= ps->size);
    5. SLCheckCapacity(ps);
    6. int end = ps->size - 1;
    7. while (end >= pos)
    8. {
    9. ps->a[end + 1] = ps->a[end];
    10. --end;
    11. }
    12. ps->a[pos] = x;
    13. ps->size++;
    14. }

    代码实现图(示例):

    9.顺序表任意位置删除

    实现思想:

    主体思想:通过下标来找到那个位置的值,让后面的数值向前面进行覆盖。

    代码如下(示例):

    1. void SLErase(SL* ps, int pos)
    2. {
    3. assert(ps);
    4. assert(pos >= 0 && pos < ps->size);
    5. int begin = pos + 1;
    6. while (begin < ps->size)
    7. {
    8. ps->a[begin - 1] = ps->a[begin];
    9. ++begin;
    10. }
    11. ps->size--;
    12. }

    代码实现图(示例):

    10.销毁顺序表

    实现思想:

    主体思想:将指针指向的空间释放,然后在将该空间赋为空。

    代码如下(示例):

    1. void SLDestroy(SL* ps)
    2. {
    3. assert(ps);
    4. free(ps->a);
    5. ps->a = NULL;
    6. ps->capacity = ps->size = 0;
    7. }

    11.顺序表打印

    实现思想:

    主体思想:和打印数组相同

    代码如下(示例):

    1. void SLPrint(SL* ps)
    2. {
    3. assert(ps);
    4. for (int i = 0; i < ps->size; i++)
    5. {
    6. printf("%d ", ps->a[i]);
    7. }
    8. printf("\n");
    9. }

    代码实现图(示例):

    12.顺序表修改

    实现思想:

    主体思想:通过下标找到该元素,对该元素进行再次赋值

    代码如下(示例):

    1. void SLModify(SL* ps, int pos, SLDataType x)
    2. {
    3. assert(ps);
    4. assert(pos >= 0 && pos < ps->size);
    5. ps->a[pos] = x;
    6. }

    代码实现图(示例):


    总结

    以上就是数据结构当中的顺序表的全部功能的实现,通过思想和代码实现,和效果图让初学者也可以快速上手。

  • 相关阅读:
    JAVA计算机毕业设计电子书店管理系统Mybatis+系统+数据库+调试部署
    C# 实例解释面向对象编程中的里氏替换原则
    LeetCode·每日一题·1678.设计 Goal 解析器·双指针
    关于参与阿里巴巴编程之夏Asoc-Nacos的感悟
    【无线模块】Wifi模块-ESP-01s的使用
    淘宝API常用接口与获取方式
    使用EasyExcel导出复杂报表
    史海峰:成为技术领导者 从技术到管理的必经之路丨声网开发者创业讲堂 • 第 5 期
    Optional .ofNullable()和flatMap()构造请求参数
    虚拟 DOM:前端性能优化的秘密
  • 原文地址:https://blog.csdn.net/weixin_73466540/article/details/134427114
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号