• 数据结构--线性表之顺序表


    1.线性表定义

    线性表(List):零个或多个数据元素的有限序列。

    线性表的数据集合为{a1,a2,…,an},假设每个元素的类型均为DataType。其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。

     

    在较复杂的线性表中,一个数据元素可以由若干个数据项组成。在这种情况下,常把数据元素称为记录,含有大量记录的线性表又称为文件。

    2.顺序表

    线性表的顺序存储结构

    1.概念

    用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。

    2.特点

    逻辑上相邻的数据元素,物理次序也是相邻的。

    只要确定好了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,所以线性表的顺序存储结构是一种随机存取的储存结构,因为高级语言中的数组类型也是有随机存取的特性,所以通常我们都使用数组来描述数据结构中的顺序储存结构,用动态分配的一维数组表示线性表。

    3.代码

    1: .h

    1. #pragma once
    2. //预防头文件被重复引用
    3. //定义与声明
    4. //定长顺序表
    5. typedef struct SQList
    6. {
    7. int elem[10];//存放数据,固定长度为10
    8. int length;//有效数据的个数
    9. }SQList,*PSQList;
    10. //初始化
    11. void InitSqlist(PSQList ps);
    12. //插入数据,在ps顺序表的pos位置插入val
    13. bool Insert(PSQList ps, int pos, int val);
    14. //判空
    15. bool IsEmpty(PSQList ps);
    16. //在ps中查找第一个val.找到返回下标,没有找到返回-1
    17. int Search(PSQList ps, int key);
    18. //删除pos位置的值
    19. bool DelPos(PSQList ps, int pos);
    20. //删除第一个val的值
    21. bool DelVal(PSQList ps, int val);
    22. //返回key的前驱下标,如果不存在返回-1
    23. int GetPrio(PSQList ps, int key);
    24. //返回key的后继下标,如果不存在返回-1
    25. int GetNext(PSQList ps, int key);
    26. //输出
    27. void Show(PSQList ps);
    28. //清空数据
    29. void Clear(PSQList ps);
    30. //销毁整个内存
    31. void Destroy(PSQList ps);

    2: .cpp

    1.头文件

    1. #include
    2. #include
    3. #include"sqlist.h"

    2.初始化,为了让程序正确运行

    1. void InitSQList(PSQList ps)
    2. {
    3. assert(ps != NULL);
    4. if (ps == NULL)
    5. {
    6. return;
    7. }
    8. ps->length = 0;
    9. }
    10. static bool IsFull(PSQList ps)
    11. {
    12. return ps->length == 10;
    13. }

    3.插入数据,在ps顺序表的pos位置插入val

    1. bool Insert(PSQList ps, int pos, int val)
    2. {
    3. //判空
    4. assert(ps != NULL);
    5. if (ps == NULL)
    6. {
    7. return false;
    8. }
    9. //判断是不是满的表
    10. if(pos<0||IsFull(ps)||pos> ps->length)
    11. {
    12. return false;
    13. }
    14. //把数据移动到后
    15. for(int i=ps->length-1;i>=pos;i--)
    16. {
    17. ps->elem[i+1] = ps->elem[i];
    18. }
    19. //插入数据
    20. ps->elem[pos] = val;
    21. //有效数据++
    22. ps->length++;
    23. }

    4.判空

    1. bool IsEmpty(PSQList ps)
    2. {
    3. return ps->length == 0;
    4. }

    5.查找,找到返回下标,没找到返回-1

    1. int Search(PSQList ps, int key)
    2. {
    3. //判空
    4. assert(ps != NULL);
    5. if (ps == NULL)
    6. {
    7. return false;
    8. }
    9. for (int i = 0; i < ps->length; i++)
    10. {
    11. if (ps->elem[i] == key)
    12. {
    13. return i;
    14. }
    15. }
    16. return -1;
    17. }

    6.删除pos位置的值

    1. bool Delpos(PSQList ps, int pos)
    2. {
    3. //判空
    4. assert(ps != NULL);
    5. if (ps == NULL)
    6. {
    7. return false;
    8. }
    9. if (pos < 0 || pos >= ps->length)
    10. {
    11. return false;
    12. }
    13. for (int i = pos; i < ps->length-1; i++)
    14. {
    15. ps->elem[i] = ps->elem[i + 1];
    16. }
    17. ps->length--;
    18. }

    7.删除第一个val的值

    1. bool Delval(PSQList ps, int val)
    2. {
    3. assert(ps != NULL);
    4. if (ps == NULL)
    5. {
    6. return false;
    7. }
    8. int i = Search(ps, val);
    9. if (i < 0)
    10. {
    11. return false;
    12. }
    13. return Delpos(ps, i);
    14. }

    8.返回key的前驱下标,如果不存在返回-1

    1. int GetPrio(PSQList ps, int key)
    2. {
    3. assert(ps != NULL);
    4. if (ps == NULL)
    5. {
    6. return false;
    7. }
    8. int i = Search(ps, key);
    9. if (i <= 0)//头无前驱
    10. return false;
    11. else
    12. return i-1;
    13. }

    9.返回key的后继下标,如果不存在返回-1

    1. int GetNext(PSQList ps, int key)
    2. {
    3. assert(ps != NULL);
    4. if (ps == NULL)
    5. {
    6. return false;
    7. }
    8. int i = Search(ps, key);
    9. if (i < 0||i==ps->length-1)//尾无后继
    10. return false;
    11. else
    12. return i+1;
    13. }

    10.输出

    1. void Show(PSQList ps)
    2. {
    3. //判空
    4. assert(ps != NULL);
    5. if (ps == NULL)
    6. {
    7. return ;
    8. }
    9. for (int i = 0; i < ps->length; i++)
    10. {
    11. printf("%d ", ps->elem[i]);
    12. }
    13. printf("\n");
    14. }

    11.清空数据

    1. void Clear(PSQList ps)
    2. {
    3. ps->length = 0;
    4. }

    12.销毁 

    1. void Destroy(PSQList ps)
    2. {
    3. Clear(ps);
    4. }

    3. .test

    1. #include
    2. #include "sqlist.h"
    3. int main()
    4. {
    5. SQList sq;
    6. printf("%d\n", sizeof(sq));
    7. InitSQList(&sq);
    8. for (int i = -1; i < 20; i++)
    9. {
    10. Insert(&sq, i, i);
    11. }
    12. Show(&sq);
    13. int i = Search(&sq, 2);
    14. if (i >= 0)
    15. {
    16. printf("该值位于%d号下标\n", i);
    17. }
    18. else
    19. {
    20. printf("没有找到\n");
    21. }
    22. int index;
    23. for (int i = -1; i < 11; i++)
    24. {
    25. index = Search(&sq, i);
    26. if (index >= 0)
    27. {
    28. printf("%d位于%d号下标\n", i, index);
    29. }
    30. else
    31. {
    32. printf("没有找到%d\n",i);
    33. }
    34. }
    35. Delpos(&sq, 5);
    36. Show(&sq);
    37. Delval(&sq, 0);
    38. Show(&sq);
    39. return 0;
    40. }v

    4.测试结果

     44                                        顺序表的大小
    0 1 2 3 4 5 6 7 8 9                插入数据,只存10个(表的大小为10)
    该值位于2号下标                  查找val=2的下标
    没有找到-1                           查询不到-1
    0位于0号下标                       
    1位于1号下标
    2位于2号下标
    3位于3号下标
    4位于4号下标
    5位于5号下标
    6位于6号下标
    7位于7号下标
    8位于8号下标
    9位于9号下标
    没有找到10                       查询不到10
    0 1 2 3 4 6 7 8 9               删除5
    1 2 3 4 6 7 8 9                  删除0

     

  • 相关阅读:
    神经网络参数如何确定的,神经网络参数个数计算
    Pandas进阶修炼120题-第五期(一些补充,101-120题)
    Pandas数据分析:快速图表可视化各类操作详解+实例代码(一)
    避免被反洗钱冻住的方法
    (蓝桥杯第十四届c解法,部分题目)​一、冶炼金属​二、飞机降落
    Bipartite graph
    GDAL Dataset.WriteRaster_Direct
    python常见过滤器的整理
    面试数据库篇(mysql)- 08事务
    POS系统完整体系的介绍 Pos终端主密钥MK、DUKPT、PEK、DEK、MEK、TUSN的含义 ---安全行业基础篇7
  • 原文地址:https://blog.csdn.net/m0_59052131/article/details/127938957