【C语言 数据结构】顺序表的使用

news2024/10/6 5:54:30

本文借鉴点击跳转
上一篇:线性表的简绍

文章目录

  • 顺序表
    • 什么是顺序表
    • 顺序表的初始化
    • 顺序表插入元素
    • 顺序表删除元素

顺序表

什么是顺序表

顺序表又称顺序存储结构,是线性表的一种,专门存储逻辑关系为“一对一”的数据。

顺序表存储数据的具体实现方案是:将数据全部存储到一整块内存空间中,数据元素之间按照次序挨个存放。

举个简单的例子,将 {1,2,3,4,5} 这些数据使用顺序表存储,数据最终的存储状态如下图所示:

image-20221028204317158


顺序表的初始化

使用顺序表存储数据,除了存储数据本身的值以外,通常还会记录以下两样数据:

  • 顺序表的最大存储容量:顺序表最多可以存储的数据个数;
  • 顺序表的长度:当前顺序表中存储的数据个数。

C 语言中,可以定义一个结构体来表示顺序表:

// TODO 定义结构体
typedef struct {
    ElemType *elem;
    int length;
    int listSize;
} SeqList;

尝试建立一个顺序表,例如:

//TODO 构造空的线性表L
void initList(SeqList *L) {
    L->elem = (ElemType *) malloc(LISTSIZE * sizeof(char));
    L->length = 0;
    L->listSize = LISTSIZE;
}

如上所示,整个建立顺序表的过程都封装在一个函数中,建好的顺序表可以存储 5 个逻辑关系为“一对一”的整数。

通常情况下,malloc() 函数都可以成功申请内存空间,当申请失败时,示例程序中进行了“输出失败信息和强制程序退出”的操作,您可以根据实际需要修改代码。


顺序表插入元素

向已有顺序表中插入数据元素,根据插入位置的不同,可分为以下 3 种情况:

  • 插入到顺序表的表头;

  • 在表的中间位置插入元素;

  • 尾随顺序表中已有元素,作为顺序表中的最后一个元素;

虽然数据元素插入顺序表中的位置有所不同,但是都使用的是同一种方式去解决,即:通过遍历,找到数据元素要插入的位置,然后做如下两步工作:

  • 将要插入位置元素以及后续的元素整体向后移动一个位置;
  • 将元素放到腾出来的位置上;

例如,在 {1,2,3,4,5} 的第 3 个位置上插入元素 6,实现过程如下:

  • 遍历至顺序表存储第 3 个数据元素的位置,如图1 所示:

image-20221028204916095

  • 将元素 3、4 和 5 整体向后移动一个位置,如图 2 所示:

image-20221028204939265

  • 将新元素 6 放入腾出的位置,如图 3 所示:

image-20221028205021416


因此,顺序表插入数据元素的 C 语言实现代码如下:

// TODO 插入
void insertList(SeqList *L, int loc, char c) {
    //存储空间已满
    if (L->length >= L->listSize) {
        L->elem = (ElemType *) realloc(L->elem, (L->listSize + LISTINCREMENT) * sizeof(char));
        L->listSize += LISTINCREMENT;
    }
    for (int k = L->length; k > loc; k--) {
        L->elem[k] = L->elem[k - 1];
    }
    L->length++;
    L->elem[loc] = c;
}

顺序表删除元素

从顺序表中删除指定元素,实现起来非常简单,只需找到目标元素,并将其后续所有元素整体前移 1 个位置即可。

后续元素整体前移一个位置,会直接将目标元素删除,可间接实现删除元素的目的。

例如,从 {1,2,3,4,5} 中删除元素 3 的过程如图 4 所示:

image-20221028205157927


因此,顺序表删除元素的 C 语言实现代码为:

// TODO 删除
void delList(SeqList *L, int loc) {
    for (int j = loc; j < L->length; j++) {
        L->elem[j - 1] = L->elem[j];
    }
    L->length--;
}

完整的代码如下所示

#include "stdio.h"
#include "windows.h"
#include "stdlib.h"

// TODO 定义常量
#define LISTSIZE 10
#define LISTINCREMENT 2

typedef char ElemType;

// TODO 定义结构体
typedef struct {
    ElemType *elem;
    int length;
    int listSize;
} SeqList;

//TODO 构造空的线性表L
void initList(SeqList *L) {
    L->elem = (ElemType *) malloc(LISTSIZE * sizeof(char));
    L->length = 0;
    L->listSize = LISTSIZE;
}

// TODO 增加
void appendList(SeqList *L, char c) {
    L->elem[L->length++] = c;
}

// TODO 插入
void insertList(SeqList *L, int loc, char c) {
    //存储空间已满
    if (L->length >= L->listSize) {
        L->elem = (ElemType *) realloc(L->elem, (L->listSize + LISTINCREMENT) * sizeof(char));
        L->listSize += LISTINCREMENT;
    }
    for (int k = L->length; k > loc; k--) {
        L->elem[k] = L->elem[k - 1];
    }
    L->length++;
    L->elem[loc] = c;
}

// TODO 删除
void delList(SeqList *L, int loc) {
    for (int j = loc; j < L->length; j++) {
        L->elem[j - 1] = L->elem[j];
    }
    L->length--;
}
// TODO 打印
void printList(SeqList *L){
    for (int i = 0; i < L->length; ++i) {
        printf("%c",L->elem[i]);
    }
    printf("\n");
}
void combine(SeqList *a, SeqList *b, SeqList *c)
{
    int i=0, j=0, k=0;
    //同时扫描两个表
    while(i<a->length && j<b->length)
    {
        if(a->elem[i]<=b->elem[j])
        {
            c->elem[k] = a->elem[i];
            i++;
            k++;
        }
        else
        {
            c->elem[k] = b->elem[j];
            j++;
            k++;
        }
    }
    //A表扫完,B组未扫完
    if(i==a->length)
    {
        for(; j<b->length; j++)
        {
            c->elem[k] = b->elem[j];
            k++;
        }
    }
    if(j==b->length)
    {
        for(; i<a->length; i++)
        {
            c->elem[k] = a->elem[i];
            k++;
        }
    }
    c->length=k;
}

int main() {
    char a[] = "ajcniydu";
    SeqList list;
    // TODO 初始化顺序表
    initList(&list);
    printf("%d\n", list.length);
    for (int i = 0; i < strlen("ajcniydu"); i++) {
        appendList(&list, a[i]);
    }
    printList(&list);
    printf("%d\n", list.length);
    insertList(&list, 3, 'p');
    printList(&list);
    printf("%d\n", list.length);
    delList(&list, 3);
    printList(&list);
    printf("%d\n", list.length);
    SeqList aList;
    SeqList bList;
    SeqList cList;
    initList(&aList);
    initList(&bList);
    initList(&cList);

    char a1[] = {'1','3','5','7'};
    char a2[] = {'2','4','6'};
    for (int i = 0; i < 4; i++) {
        appendList(&aList, a1[i]);
    }
    for (int i = 0; i < 3; i++) {
        appendList(&bList, a2[i]);
    }
    combine(&aList,&bList,&cList);
    printList(&cList);
    return 0;
}

运行结果

0
ajcniydu
8
ajcpniydu
9
ajpniydu
8
1234567

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

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

相关文章

Linux~一些基本开发工具的使用(yum,vim,gcc,gdb,makefile)

目录 一.yum——安装软件 二.Vim——文本编辑器 &#xff08;1&#xff09;.命令模式 &#xff08;2&#xff09;.底行模式 &#xff08;3&#xff09;.插入模式 tips:给对应用户配置sudo命令 一些注意事项 三.gcc/g——编译器 &#xff08;1&#xff09;.gcc如何完成…

客快物流大数据项目(八十三):Kudu的优化

文章目录 Kudu的优化 一、​​​​​​​Kudu关键配置 二、​​​​​​​​​​​​​​Kudu的使用限制 1、​​​​​​​​​​​​​​主键 2、Cells 3、​​​​​​​字段 4、表 5、其他限制 6、​​​​​​​​​​​​​​分区限制 7、扩展建议和限制 8、​…

2- 创建Spring项目—— 方式1

导包&#xff1a; 地址&#xff1a;https://repo.spring.io/ui/native/libs-release-local/org/springframework/spring/ 如&#xff1a;包名&#xff1a;spring-5.2.3.RELEASE-dist.zip 将其下libs文件夹下的4个jar包导入&#xff1a; spring-context-5.2.3.RELEASE.jar、…

物联网ARM开发-3协议-单总线应用红外遥控

前言&#xff1a;单总线类传感器-红外遥控的实现 目录 一、红外遥控工作原理讲解 1、光的基础知识 2、红外通信 3、红外NEC协议详解 二、红外遥控实例讲解 1、实验目的&#xff1a;按下遥控按键&#xff0c;主机通过红外接收器接收到信号并解码&#xff0c;识别出按键的…

大学生计算机相关专业有什么血泪建议吗?

工作多年后才发现大学期间错过太多&#xff01;&#xff01;&#xff01;给正在攻读CS的你&#xff0c;以下建议&#xff1a; 神级编程网站&#xff0c;堪称程序员的充电站&#xff0c;我给你找好了不能错过_程序员编程指南的博客-CSDN博客_程序员充电网站 大的课程很多&…

LA-PEG-NH2,Lipoic acid-PEG-Amine,硫辛酸PEG氨基用于量子点表面

表面反应性聚乙二醇聚乙二醇化试剂LA-PEG-NH2&#xff0c;又名Lipoic acid-PEG-Amine其中文名为硫辛酸-聚乙二醇-氨基。所属分类为Amine PEG Lipoic acid&#xff08;LA&#xff09;PEG。 该科研试剂Lipoic acid-PEG-Amine的分子量均可定制有&#xff1a;&#xff08;5000、20…

uboot移植一一更换控制台串口

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、场景需求 X210开发板的SOC中一共有4个串口&#xff08;串口0~3&#xff09;&#xff0c;并且用DB9接口引出了2个串口&#xff0c;分别是串口0和串口2。其中靠近网口的是串口0&#xff0c;远离网口…

java毕业设计——基于java+java-swing的泡泡堂网络游戏设计与实现(毕业论文+程序源码)——泡泡堂网络游戏

基于javajava-swing的泡泡堂网络游戏设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于javajava-swing的泡泡堂网络游戏设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。 文章目录&#xff1a; 基于javajava-…

多旋翼无人机仿真 rotors_simulator:基于PID控制器的位置控制---高度控制

多旋翼无人机仿真 rotors_simulator&#xff1a;基于PID控制器的位置控制---高度控制前言构建软件框架编译 cpp构建代码main函数构建构建类的定义订阅无人机里程计信息垂直位置控制串级P控制收敛结果收敛过程串级PID控制前言 无人机&#xff08;Unmanned Aerial Vehicle&#…

Oracle中分割字符串的方法

Oracle中分割字符串的方法1. 使用 regexp_substr() 函数1.1 方式11.2 方式22. 自定义函数2.1 自定义类型 table2.2 自定义函数2.2.1 自定义函数2.2.2 效果如下&#xff1a;2.3 Oracle查看&#xff1c;Collection&#xff1e; 类型数据3.1. 使用 regexp_substr() 函数 1.1 方式…

日志三个时间,动静态库的建立与使用

文章目录日志时间ModifyChangeAccessmake与g库lddfile静态库动态库静态库静态的制作静态库的使用动态库动态库的制作动态库的使用日志时间 Modify 最近修改文件内容的时间在一定条件下&#xff0c;修改文件内容时&#xff0c;可能修改文件属性&#xff1a;文件大小属性改变了 …

实验2:Numpy手写多层神经网络

引言 这个作业的目的是给你们介绍建立&#xff0c;训练和测试神经系统网络模型。您不仅将接触到使用Python包构建神经系统网络从无到有&#xff0c;还有数学方面的反向传播和梯度下降。但在实际情况下&#xff0c;你不一定要实现神经网络从零开始(你们将在以后的实验和作…

【数据结构与算法】详解快排

目录一、快排的定义及思路二、快排的代码实现一、快排的定义及思路 快排就是快速排序&#xff0c;是通过不断比较和移动交换来进行排序&#xff0c;相当于冒泡排序的一种升级。 其基本思想是&#xff1a; 分而治之&#xff0c;也就是把一组数组分成两个独立数组&#xff0c;再对…

【初学者入门C语言】之结构体(十一)

个人主页&#xff1a;天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主 &#x1f4ac; 刷题网站&#xff1a;一款立志于C语言的题库网站蓝桥杯ACM训练系统 - C语言网 (dotcpp.com) 特别标注&#xff1a;该博主将长期更新c语言内容&#xff0c;初学c语言的友友们&#xff0c…

【树莓派不吃灰】使用中经常看到的安装命令 wget、rpm、yum、dpkg、apt-get

目录1. 前言2. Linux系统两种主流软件包2.1 rpm包2.2 deb包3. 解决软件依赖问题 —— yum、apt3.1 yum3.2 apt 和 apt-get4. wget 网络文件下载工具5. 总结❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2022-10-28 ❤️❤️ 本篇…

设计模式之备忘录模式 - 简书

备忘录模式是一种行为设计模式&#xff0c; 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 解决方案 我们刚才遇到的所有问题都是封装 “破损” 造成的。 一些对象试图超出其职责范围的工作。 由于在执行某些行为时需要获取数据&#xff0c; 所以它们侵入了其…

ipv6学习笔记221029

IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写 ipv6的长度有128位, ipv4的长度是32位 ipv6以冒号:分隔 , ipv4以点.分隔 8个16位等于128位 , 4个十六进制表示16位(一个16进制表示4位) ipv6的128位 由 8 个 16位 16bit 组成 每…

【LeetCode】【两个数组的交集】

力扣 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 示例 2&#xff1a; 输入&#xff1a;num…

基于MATLAB的指纹识别算法仿真实现

目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 在指纹图像预处理部分&#xff0c;论文对预处理的各个步骤包括规格化、图像分割、中值滤波、二值化、细化等以及各个步骤的方法进行了深入的分析和研究&#xff0c;选择了一种图像预处理方案。在指纹特征提取部分…

基于javaweb的医疗挂号管理系统(java+springboot+freemarker+layui+mysql)

基于javaweb的医疗挂号管理系统(javaspringbootfreemarkerlayuimysql) 运行环境 Java≥8、MySQL≥5.7 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计&#xff0c;大作业&#xff0c;毕业设计&#xff0c;项目练习&#xff0c;学习演示等 功能说明 基…