顺序表的静态和动态实现

2023-11-08

静态顺序表


:所谓静态顺序表就是把空间的大小给定

结构体的定义:

typedef struct SeqList
{
    DataType array[MaxSize];
    int size;
}SeqList;

基本操作的实现:

void InitSeqList(SeqList* pSeq)
{
    assert(pSeq);
    memset(pSeq->array, 0, MaxSize*sizeof(DataType));
    pSeq->size = 0;
}
void PrintSeqList(SeqList* pSeq)
{
    assert(pSeq);
    for (int i = 0; i < pSeq->size; i++)
    {
        printf("%d\n", pSeq->array[i]);
    }
    printf("\n");
}
void PushBack(SeqList* pSeq, DataType data)//尾插
{
    assert(pSeq);
    if (pSeq->size == MaxSize)
    {
        printf("Capacity Is Full!\n");
        return;
    }
    pSeq->array[pSeq->size++] = data;

}
void PopBack(SeqList* pSeq)//尾删
{
    assert(pSeq);
    if (0 == pSeq->size)
    {
        printf("Capacity Is Empty!\n");
        return;
    }
    pSeq->size--;
}
void PushFront(SeqList* pSeq, DataType data)//头插
{
    assert(pSeq);
    if (pSeq->size == MaxSize)
    {
        printf("Capacity Is Full!\n");
        return;
    }
    int i = pSeq->size - 1;//定位到顺序表的最后一个元素
    for (; i >= 0; i--)
    {
        pSeq->array[i + 1] = pSeq->array[i];
    }
    pSeq->array[0] = data;
    pSeq->size++;
}
void PopFront(SeqList* pSeq)//头删
{
    assert(pSeq);
    if (pSeq->size == 0)
    {
        printf("Capacity Is Empty!\n");
        return;
    }
    int i = 0;//定位到顺序表的第一个位置
    for (; i < pSeq->size - 1; i++)
    {
        pSeq->array[i] = pSeq->array[i + 1];
    }
    pSeq->size--;

}
void Insert(SeqList* pSeq, size_t pos, DataType data)//插入
{
    assert(pSeq);
    if (pSeq->size == MaxSize)
    {
        printf("Capacity Is Full!\n");
        return;
    }
    int i = pSeq->size - 1;
    for (; i >= pos; i--)
    {
        pSeq->array[i + 1] = pSeq->array[i];
    }
    pSeq->array[pos-1] = data;//因为是数组,所以插入pos-1的位置
    pSeq->size++;
}
void Erase(SeqList* pSeq, size_t pos)//删除
{
    if (pSeq->size == 0)
    {
        printf("Capacity Is Empty!\n");
        return;
    }

    int i = pos- 1;
    for (; i <pSeq->size-1;i++)
    {
        pSeq->array[i] = pSeq->array[i + 1];
    }
    pSeq->size--;
}
int Find(SeqList* pSeq, DataType data)
{
    for (int i = 0; i < pSeq->size - 1; i++)
    {
        if (pSeq->array[i] == data)
        {
            return i;
        }
    }
}
void Remove(SeqList* pSeq, DataType data)//移除第一个值为data的元素
{
    assert(pSeq);
    if (0 == pSeq)
    {
        printf("Capacity Is Empty!\n");
        return;
    }

    for (int i = 0; i < pSeq->size - 1; i++)
    {
        if (data == pSeq->array[i])
        {
            Erase(pSeq, i+1);
            return;
        }

    }
}

void BubbleSort(SeqList* pSeq)//冒泡排序
{
    if (0 == pSeq)
    {
        printf("Capacity Is Empty!\n");
            return;
    }
    int i, j;
    int flag = 0;
    for (i = 0; i < pSeq->size - 1; i++)
    {
        for (j = 0; j < pSeq->size - 1- i; j++)
        {
            if (pSeq->array[j] > pSeq->array[j + 1])
            {
                int temp = pSeq->array[j];
                pSeq->array[j] = pSeq->array[j + 1];
                pSeq->array[j + 1] = temp;
                flag = 1;
            }
        }
        if (flag == 0)//如果flag=0,表示没有进行排序,即原序列有序,直接结束循环
            break;
    }
}
void SelectSort(SeqList* pSeq)//选择排序
{
    assert(pSeq);
    int i, j, k;
    for (i = 0; i < pSeq->size - 1; i++)
    {
        k = i;
        for (j = i + 1; j < pSeq->size; j++)
        {
            if (pSeq->array[k]>pSeq->array[j])
            {
                k = j;
            }
        }
        if (k != i)//判断第i小的数是不是在第i个位置上
        {
            int temp = pSeq->array[k];
            pSeq->array[k] = pSeq->array[i];
            pSeq->array[i] = temp;
        }
    }
}
int BinarySearch(SeqList* pSeq, DataType data)//二分法查找
{
    assert(pSeq);
    int left = 0;
    int right = pSeq->size - 1;
    int mid = left + (right - left) / 2;//防止相加溢出
    while (left <= right)
    {
        mid = left + (right - left) / 2;
        if (pSeq->array[mid] == data)
        {
            return mid + 1;//mid为数组的位置,+1是返回我们所理解的位置
        }
        else if (pSeq->array[mid] > data)
        {
            right = mid - 1;
        }
        else
        {
            left = mid + 1;
        }
    }
    return -1;
}

动态顺序表

同样先是结构体的定义,与静态不同的是,这里的空间由一个指针指向,在使用时进行动态开辟。

typedef struct SeqList
{
    DataType* elem;//指向当前空间
    int size;//当前有效的数据长度
    int capacity;//当前容量
}SeqList;

基本操作的实现:

void InitSeqList(SeqList* pSeq)
{
    pSeq->elem = (DataType*)malloc(sizeof(DataType));
    pSeq->capacity = EXPLAND_CAPACITY;
    pSeq->size = 0;
}

void PrintSeqList(SeqList* pSeq)
{
    assert(pSeq);
    for (int i = 0; i < pSeq->size; i++)
    {
        printf("%d\n", pSeq->elem[i]);
    }
    printf("\n");
}

void Expland_Capacity(SeqList* pSeq)
{
    assert(pSeq);
    if (pSeq->size == pSeq->capacity)
    {
        pSeq->size = pSeq->capacity * 2;
        DataType* newelem = (DataType*)malloc(pSeq->capacity * 2);
        memcpy(newelem, pSeq->elem, pSeq->size*sizeof(DataType));
        free(pSeq->elem);
        pSeq->elem = newelem;
    }
}

void PushBack(SeqList* pSeq,DataType data)
{
    assert(pSeq);
    Expland_Capacity(pSeq);
    pSeq->elem[pSeq->size++] = data;
}

void PopBack(SeqList* pSeq)
{
    assert(pSeq);
    if (pSeq->size > 0)
    {
        pSeq->size--;
    }
    return;
}

void PushFront(SeqList* pSeq, DataType data)
{
    assert(pSeq);
    Expland_Capacity(pSeq);
    for (int i = pSeq->size - 1; i >= 0; i--)
    {
        pSeq->elem[i + 1] = pSeq->elem[i];
    }
    pSeq->elem[0] = data;
    pSeq->size++;
}

void PopFront(SeqList* pSeq)
{
    assert(pSeq);
    if (0 == pSeq->size)
    {
        printf("Capacity Is Empty!\n");
        return;
    }
    for (int i = 0; i < pSeq->size - 1; i++)
    {
        pSeq->elem[i] = pSeq->elem[i + 1];
    }
    pSeq->size--;
}

int main()
{
    SeqList L;
    InitSeqList(&L);
    PushBack(&L, 1);
    PushBack(&L, 2);
    PushBack(&L, 3);
    PushBack(&L, 4);
    PushBack(&L, 5);
    //SelectSort(&L);
    /*Insert(&L, 4, 4);*/
    //Erase(&L, 4);
    //RemoveAll(&L, 3);
    //BubbleSort(&L);
    //BinarySearch(&L, 2);
    PrintSeqList(&L);
    /*Find(&L, 3)*/;
    return 0;
}

静态顺序表和动态顺序表大体上只是空间的问题,一个是刚开始就给定大小,而另一个可以在后续的使用中再次进行扩充。


最常被拿来做比较的应该就是顺序表和链表各自的优缺点了。
顺序表
优:
内存连续,节省空间。
支持随机访问
缺:
除了在尾部操作之外,其余的操作都要挪动整个空间的元素


链表
优:
在任意位置插入或删除都很方便。
缺:
不支持随机访问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

顺序表的静态和动态实现 的相关文章

随机推荐

  • kafka常用命令汇总(亲测自用)

    文章目录 一 启动kafka 二 查看命令 三 创建topic 四 生产者 五 消费者 六 修改topic 七 删除topic 一 启动kafka kafka 2 13 3 3 1 zookeeper 3 4 14 2 13 3 3 1 前
  • 基础篇——Pycharm的安装与使用windows+ubuntu 初学者此篇够用

    简介 Pycharm是python编程过程中最为推荐的编辑调试软件之一 其使用简单 界面友好 也成了学习Python路上必须学会的软件之一 本篇教程简单介绍一下windows用户从安装到日常使用的基本功能 其他系统也可简单参考 软件安装 P
  • 嵌入式Linux学习笔记 1-14 异常与中断

    1 异常与中断的概念引入与处理流程 上图解释了何为中断何为异常 其中中断也是属于一种异常 引申拓展为ARM对异常 中断 的处理过程 1 初始化 1 设置中断源 让他可以产生中断 如某个按键可以产生中断的话 我们可以设置他的gpio引脚为中断
  • LeetCode刷题笔记--015. 三数之和

    题目描述 给定一个包含 n 个整数的数组 nums 判断 nums 中是否存在三个元素 a b c 使得 a b c 0 找出所有满足条件且不重复的三元组 注意 答案中不可以包含重复的三元组 例如 给定数组 nums 1 0 1 2 1 4
  • 【算法】蓝桥杯dfs深度优先搜索之凑算式总结

    本文 算法 蓝桥杯dfs深度优先搜索之凑算式总结 相关文章 算法 蓝桥杯dfs深度优先搜索之排列组合总结 算法 蓝桥杯dfs深度优先搜索之图连通总结 前言 曾几何时这个词现在用正适合不过了 曾几何时我还是对dfs算法一脸懵x的状态 虽说大二
  • Java中32位的最高位为1的二进制数如何转换成整数

    int类型的 3的32位表示为 11111111111111111111111111111101 将32位翻转的时候应该为 10111111111111111111111111111111 当时在LeetCode做这题的时候想的是用字符串翻
  • IDEA开发工具11---Python引入第三方包

    如要在工程文件中引入requests 但是本机上并没有安装这个包 在工程文件中输入import requests 然后Alt Enter 然后回车 IDEA会自动安装这个包
  • ESP8266 连接 MQTT

    ESP8266 连接 MQTT 主控芯片 MM32F2377 MB 039 WiFi 适配器 ESP8266 开发环境 IAR 7 80 4 MQTT 模拟服务器 MQTT fx MQTT MQTT is an OASIS standard
  • 解决windows 下使用 mingw编译器 调试时 无法跟进源码

    windows 下使用 mingw编译器 调试时 无法跟进源码 最近在公司使用QT 开发 官方在线下载的 安装的QT mingw 都是没有debug版本的 由于没有debug版本动态库 所以你调试的时候压根就无法跟进QT源代码里 那么找问题
  • 关于在windows下启动zkServer.cmd闪退的解决办法

    1 下载zookeeper注册中心 下载地址 http www apache org dyn closer cgi zookeeper 下载后解压即可 进入D apach zookeeper 3 4 5 bin 双击zkServer cmd
  • ES6 数组内对象去重

    在实际的项目当中不可避免的会遇到数组里面元素重复情况 下面将介绍几种ES6数组去重的方法 1 使用Set去重 const arr 张三 张三 三张三 let set new Set arr set 自带去重 Set 张三 三张三 conso
  • Ubuntu搭建Samba服务-学习记录

    文章目录 Ubuntu安装Samba流程 Samba配置文件 Samba添加账户 配置文件修改 Samba服务控制 设置开机自动启动 通过systemctl 启动服务 通过 rc local 启动 Windows访问 参考链接 当前文章仅用
  • 福禄克电缆检测仪MS2-100有哪些功能?

    现在的通信技术人员有很多问题需要处理 而不仅仅是电缆问题 在确定连接问题的原因之前 必须先排除可能存在的电缆和服务等问题 是否有电话电压 极性是什么 远端有以太网交换机吗 PoE 是否可用 福禄克电缆检测仪MS2 100可以确认这些问题 为
  • LaTeX:插入PDF出现版本警告

    LaTeX LaTeX LATE X 插入PDF出现版本警告 文章目录 LaTeX LaTeX LATE X 插入PDF出现版本警告 1 问题描述 2 解决
  • 微信封号被限制的几种原因及解决方法

    微信被限制了也不需要紧张 找到原因对应处理就行了 一 总结一下微信微信被限制登录的几种原因 1 频繁的违规操作 微信违规操作了 比方说频繁的添加微信好友 发布违规信息 使用第三方非法破解软件等 这些行为都属于微信明令禁止的行为 如果触犯了微
  • vim连接外接显示器后右侧无法选中的问题

    RT 解决办法 在 vimrc添加如下代码 if has mouse sgr set ttymouse sgr else set ttymouse xterm2 end 原文连接 https ifconfiger com articles
  • 4.jeston nano NX安装系统、pycharm

    笔者有幸通过项目一次入手一块jeston Xavier NX和jeston nano 随即开始研究安装系统和pycharm 其中系统换了4个镜像才安装成功 其实下载安装官方的就行 其他的包括店里的都不要用 1 安装系统 务必注意镜像要下对
  • 如何修改VsCode的背景图片

    步骤 第一步 准备一张图片 图片路径最好不要出现中文 第二步 在VsCode中安装插件 搜索 background 安装这个插件 第三步 这个插件安装成功之后 里面自带了一些背景 如果喜欢可以不用换 也可以根据需要自定义 找到 settin
  • SpringBoot-线程池ThreadPoolExecutor异步处理(包含拆分集合工具类)

    ThreadPoolExecutor VS ThreadPoolTaskExecutor ThreadPoolTaskExecutor是对ThreadPoolExecutor进行了封装处理 配置文件application yml 异步线程配
  • 顺序表的静态和动态实现

    静态顺序表 所谓静态顺序表就是把空间的大小给定 结构体的定义 typedef struct SeqList DataType array MaxSize int size SeqList 基本操作的实现 void InitSeqList S