【C语言】顺序表的创建

2023-10-30

一、代码实现部分:

        1、顺序表是线性表的基础部分,至于顺序表,在本人看来无异于数组。至于线性表的概念,在此不再赘述。接下来尝试利用C语言对线性表中的顺序表进行代码实现(此程序中规定用户输入的数据类型为int类型):

typedef struct{
    int *p;
    int length;
    int ac;
}S,*pS;

首先定义一个结构体,结构体中定义一个指针变量,两个int类型变量,之所以定义两个int类型变量length和ac是为了分别记录顺序表的规定长度(申请长度)和实际长度(已使用的长度,或者说已经存放了个元素个数)。

        2、在定义好结构体后,进行对顺序表的创建。在此利用函数void crate_s(pS s);进行对顺序表的创建

void crate_s(pS s){
    int a;
    printf("你想要存储多少个数据?\n");
    scanf("%d",&a);
    if(a<=0){
        printf("你不想存储数据!\n");
    }else{
        s->p=(int *)malloc(sizeof(int)*a);
        if(NULL==s->p){
            printf("空间申请失败!\n");
        }else{
            s->length=a;
            s->ac=-1;
            printf("能够存储%d个元素的空间申请成功!\n",s->length);
        }
    }
}

当结构体传入函数void crate_s(pS s);后,先判断用户是否想创建顺序表,要创建多长的顺序表。当用户想要创建顺序表后,向计算机申请相应空间,并且结构体中的length用于记录顺序表的规定(申请)长度,ac用于记录顺序表的实际长度。

        3、通过void insert_s(pS s);函数实现顺序表中添加数据,具体代码如下:

void insert_s(pS s){
    int a,b,c,d,e,i;
    a=s->length;
    b=s->ac;
    c=a-(b+1);
    if(a==0){
        printf("你还没有创建顺序表!\n");
    }else if(c==0){
        printf("此表已满!\n");
    }else{
        printf("这个顺序表长度为%d,你还可以存%d个数据,你想存多少数据?\n",a,c);
        scanf("%d",&d);
        if(d==0){
            printf("你不想存数据!\n");
        }else if(c<d){
            printf("此顺序表空间不足!\n");
        }else{
            for(i=0;i<d;i++){
                printf("请输入第%d个元素:\n",i+1);
                scanf("%d",&e);
                s->p[++(s->ac)]=e;
                printf("元素输入成功!\n");
            }
        }
    }
}

这个函数的编程思想是先判断是否已经创建顺序表,顺序表是否已经存满数据。然后判断用户想要输入的数据个数是否存在溢出情况,最后再存放用户想要存放的数据。

        4、通过void trave_s(pS s);函数实现顺序表数据的遍历,具体代码如下:

void trave_s(pS s){
    int a,b,c,i;
    a=s->length;
    b=s->ac;
    if(a==0){
        printf("你还没创建顺序表!\n");
    }else{
        if(b==-1){
            printf("这是一个空表!\n");
        }else{
            printf("顺序表中数据是:\n");
            for(i=0;i<=b;i++){
                printf("%4d",s->p[i]);
            }
            printf("\n");
        }
    }
}

此函数的编程思想是先判断顺序表是否存在,是否为空,若都不是,那么遍历这个顺序表中实际存在的数据(这里注意区分顺序表的规定长度与实际长度)。

        5、通过void search_s(pS s);函数实现对顺序表元素的查询,具体代码如下:

void search_s(pS s){
    int a,b,c,i;
    a=s->length;
    b=s->ac;
    if(a==0){
        printf("你还没有创建顺序表!\n");
    }else{
        if(b==-1){
            printf("这是一个空表!\n");
        }else{
            printf("此顺序表有%d个元素,你想查询几号元素?\n",b+1);
            scanf("%d",&c);
            if(c<=0||c>(b+1)){
                printf("你找的元素不在此顺序表中表中");
            }else{
                printf("你要找的第%d号元素是%d \n",c,s->p[c-1]);
            }
        }
    }
}

在这里,仍然是先判断顺序表是否存在,是否为空,然后按照序号查找元素。若查找的方式是输入元素,查看其是否在顺序表中,那么本人的实现方法是利用最笨的遍历查找,将顺序表中的元素一一取出和输入元素相互比较以此找出此元素和次元素所在位置。

        6、利用void change_s(pS s);函数实现修改顺序表数据,具体代码如下:

void change_s(pS s){
    int a,b,c,d,i;
    a=s->length;
    b=s->ac;
    if(a==0){
        printf("你还没有创建顺序表!\n");
    }else{
        if(b==-1){
            printf("这是一个空表!\n");
        }else{
            printf("此顺序表有%d个元素,你想修改几号元素?\n",b+1);
            scanf("%d",&c);
            if(c<=0||c>(b+1)){
                printf("你修改的元素不在此顺序表中表中\n");
            }else{
                printf("你要修改的第%d号元素是%d,你想将其修改成什么数值? \n",c,s->p[c-1]);
                scanf("%d",&d);
                s->p[c-1]=d;
                printf("元素修改成功!\n");
            }
        }
    }
}

先判断顺序表是否存在,顺序表是否为空,然后找到想要修改的元素下标,对对应的值进行修改。

        7、利用void empty_s(pS s);函数实现将顺序表置空:

void empty_s(pS s){
    int a,b,c;
    a=s->length;
    b=s->ac;
    if(a==0){
        printf("你还没有建表!\n");
    }else{
        if(b==-1){
            printf("这是一个空表!\n");
        }else{
            s->ac=-1;
            printf("此表已经置空!\n");
        }
    }
}

同样先判断存在,判断是否为空,再进行置空。(小想法:这个置空倒是特别简单,将记录顺序表真实长度的ac变量值置为-1即可,那么在改变ac变量值之前已经在相应位置赋好的值怎么办?个人主观理解为,这些值会被其他(无论是否是人为操作)值覆盖,因此不用关心这些值的下场(无知的奸笑))。

        8、利用void delete_s(pS s);函数实现删除顺序表中数据:

void delete_s(pS s){
    int a,b,c,d;
    a=s->length;
    b=s->ac;
    if(a==0){
        printf("你还没有建表!\n");
    }else{
        if(b==-1){
            printf("这是一个空表!\n");
        }else{
            printf("你想要删除第几号元素?\n");
            scanf("%d",&c);
            if(c<=0||c>b+1){
                printf("你要删除的元素不在此顺序表中!\n");
            }else{
                d=c-1;
                printf("你要删除的第%d号元素是%d\n",c,s->p[d]);
                for(d;d<=b;d++){
                    s->p[d]=s->p[d+1];
                }
                s->ac--;
                printf("此元素删除成功!\n");
            }
        }
    }
}

同样,判存在,判空。因为此处是以元素在顺序表中的位置来定位元素,因此要判断要删除的元素是否在顺序表中。然后再做删除操作(指定元素的后面覆盖前面,ac-1)

        9、利用void init_s(pS s);函数实现向顺序表中插入数据,具体代码如下:

void init_s(pS s){
    int a,b,c,d,e,f;
    a=s->length;
    b=s->ac;
    if(a==0){
        printf("你还没有建立顺序表!\n");
    }else{
        if(b==-1){
            printf("这是一个空表!\n");
        }else{
            if(a==b+1){
                printf("此表以满!\n");
            }else{
                printf("你想在数据前面插入新数据还是想在数据后面插入新数据?选择前插请输入0,选择后插请输入1:\n");
                scanf("%d",&c);
                switch(c){
                    case 0:
                        printf("此顺序表一共可以存储%d个元素,目前已经存储了%d个元素,你想在几号元素前面插入数据?\n",a,b+1);
                        scanf("%d",&d);
                        e=d-1;
                        if(d<=0||d>b+2){
                            printf("此表中没有这号元素,你无法插入");
                        }else{
                            for(e;e<=b;b--){
                                s->p[b+1]=s->p[b];
                            }
                            printf("你想在%d号元素前面添加什么数值?\n",d);
                            scanf("%d",&f);
                            s->p[e]=f;
                            s->ac++;
                            printf("元素添加成功!\n");
                        }
                        break;

                     case 1:
                        printf("此顺序表一共可以存储%d个元素,目前已经存储了%d个元素,你想在几号元素后面插入数据?\n",a,b+1);
                        scanf("%d",&d);
                        if(d<0||d>b+1){
                            printf("此表中没有这号元素,你无法插入");
                        }else{
                            for(d;d<=b;b--){
                                s->p[b+1]=s->p[b];
                            }
                            printf("你想在%d号元素后面添加什么数值?\n",d);
                            scanf("%d",&f);
                            s->p[d]=f;
                            s->ac++;
                            printf("元素添加成功!\n");
                        }
                        break;

                     default:
                        printf("你不想输入数据!\n");
                        break;
                }
            }
        }
    }
}

判断表是否存在,是否为空。判断是要前插还是后插。保证插入数据后数据不会溢出。

        10、利用void thong_s(pS s);函数得到顺序表的长度,具体代码如下:

void thong_s(pS s){
    int a,b,c;
    a=s->length;
    b=s->ac;
    if(a==0){
        printf("你还没有建表!\n");
    }else{
        if(b==-1){
            printf("这是一个空表!\n");
        }else{
            printf("此链表长度为%d",1+b);
        }
    }
}

判断表是否存在,是否为空,返回结构体中真实记录顺序长度的ac+1值,因为ac初值是从-1开始。

        11、接下来就来实现应用一个基本框架将这些基本功能串联起来,构成一个简单的顺序表小程序。基本框架如下:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h> //引入函数库                           

typedef struct{
    int *p;
    int length;
    int ac;
}S,*pS;          //定义结构体                            

//声明各个功能函数

void main(){
    int a=1,b;
    S s;
    s.length=0;
    while(a){
        system("cls");
        printf("\n\n\t\t顺序表基本操作\n");
        printf("\t\t...1-n.顺序表的各种功能操作;  \n");
        printf("\t\t...0.退出;  \n");
        printf("\n\n");
        printf("\t\t请选择[0,9]: ");
        scanf("%d",&b);
        printf("\n\n");
        switch(b){
            case 1-n:调用各种功能函数     ;break;
            case 0:  a=0                 ;break;
        }
        if(b!=0){
            printf("请输入任意键继续:\n");
            getche();
        }
    }
    system("cls");
    printf("\t\t程序结束\n");
    exit(-1);
}

//具体的各种功能函数  

这基本框架就是一个基本表单。

二、结果展示部分:

小程序运行结果如下:

1. 程序开始运行界面

2. 申请存储空间,即创建顺序表。

3. 向顺序表中添加元素。

4. 展示顺序表中元素。

5. 向顺序表中再次添加元素。

6.展示再次添加元素后的顺序表内容。

7.在已有顺序表中插入元素。

8.展示已经插入元素后的顺序表。

 9. 修改指定位置的元素内容

10. 展示已经修改好的顺序表内容。

        在此仅仅展示这几个简单功能,剩余功能也能正常实现。目前发现的不足之处在于,每次实现某一功能前总是要写出先判断顺序表是否存在、是否为空的代码,这些代码显得很冗余,因此可以尝试将这些代码写入一个新函数,在实现某一功能先调用此函数即可。

以上是本人对顺序表的C语言代码初步实现,不喜勿喷,感谢理解。

相关链接:

【C语言】单链表的创建_lixxkv的博客-CSDN博客

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

【C语言】顺序表的创建 的相关文章

  • Java中\t的作用

    t是补全当前字符串长度到8的整数倍 最少1个最多8个空格 补多少要看你 t前字符串长度 比如当前字符串长度10 那么 t后长度是16 也就是补6个空格 如果当前字符串长度12 此时 t后长度是16 补4个空格
  • 19 个 K8S 日常故障处理集锦

    问题1 K8S集群服务访问失败 原因分析 证书不能被识别 其原因为 自定义证书 过期等 解决方法 更新证书即可 问题2 K8S集群服务访问失败 curl 7 Failed connect to 10 103 22 158 3000 Conn
  • 【Metashape精品教程15】点云分类 分类地面点 创建DEM

    Metashape精品教程15 点云分类 分类地面点 创建DEM 文章目录 Metashape精品教程15 点云分类 分类地面点 创建DEM 前言 一 点云分类 Classify Points 二 分类地面点 三 手动分类 四 创建DEM
  • 2023网络安全面试题汇总(附答题解析+配套资料)

    随着国家政策的扶持 网络安全行业也越来越为大众所熟知 相应的想要进入到网络安全行业的人也越来越多 为了更好地进行工作 除了学好网络安全知识外 还要应对企业的面试 所以在这里我归总了一些网络安全方面的常见面试题 希望对大家有所帮助 内容来自于
  • 标定协议之CCP协议基础知识介绍

    上一篇 标定协议基础知识介绍 中对标定协议进行了初步的介绍 从这一篇文章开始对CCP标定协议进行相关介绍 本篇将对CCP标定协议相关指令进行介绍 CCP通讯报文定义 CCP标定协议标准中定义了两条CAN通讯报文 CRO Command Re
  • Python 更新pip报错

    解决办法 更新指令中加上 user python m pip install user upgrade pip
  • Tomcat线程模型及调优

    一 Tomcat线程模型 1 BIO 同步阻塞式I O操作 表示Tomcat使用的是传统Java I O操作 即Java io包及其子包 Tomcat7以下版本默认情况下是以bio模式运行的 由于每个请求都要创建一个线程来处理 线程开销较大

随机推荐

  • case when where 显示没有该列 mysql,mysql - MySQL CASE WHEN麻木IS NULL忽略记录WHERE麻木IS NOT NULL - SO中文参考 - www.s...

    计算numb m value NULL 1 7 64 NULL 1 7 65 8070 2 7 935 8070 2 7 941 NULL 3 7 62 8070 4 7 92 8070 4 7 935的每个值的最小值和最大值 取决于COA
  • spring赌上未来的一击:WebFlux性能实测

    最近花了一点时间系统的测试验证了在SpringBoot框架下使用SpringMVC和Spring WebFlux两种框架开发接口 对比了响应时间以及压测吞吐量的区别 WebFlux SpringMVC 如果对WebFlux还不了解的同学 那
  • tesseract64位编译

    经过两天吐血的编译 tesseract终于可以在win64下用了 我这将每一步更加细化 我编译的是tesseract ocr3 02 leptonica1 68 1 要想编译自己的tesseract的lib和dll必须先编译leptonic
  • Linux中通过命令行监控股票报价

    如果你是那些股票投资者或者交易者中的一员 那么监控证券市场将是你的日常工作之一 最有可能的是你会使用一个在线交易平台 这个平台有着一些漂亮的实时图表和全部种类的高级股票分析和交易工具 虽然这种复杂的市场研究工具是任何严肃的证券投资者了解市场
  • 【Vue2.0源码学习】生命周期篇-初始化阶段(initEvents)

    文章目录 1 前言 2 解析事件 3 initEvents函数分析 4 总结 1 前言 本篇文章介绍生命周期初始化阶段所调用的第二个初始化函数 initEvents 从函数名字上来看 这个初始化函数是初始化实例的事件系统 我们知道 在Vue
  • 关于setConnectTimeout和setReadTimeout的问题

    1 问题描述 这几天测试重构后的下载框架 发现在下载过程中如果网络中断或网络较差 个别应用的下载就会阻塞卡住 一直卡在 正在下载 xx 2 问题排查和定位 思考 网络差不应该报网络异常的错误或者直接抛timeout异常吗 所以马上去检查Ht
  • 我所不知道的TCP Socket编程(一)-简介+创建套接字

    Socket编程 套接字 Socket 连接起了数字世界 定义 源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字 其用于标识客户端请求的服务器和服务 它是网络通信过程中端点的抽象表示 包含进行网络通信必需的五种信息 连接使用
  • MMU地址映射过程详细

    ARMv6 MMU简述 1 MMU由协处理器CP15控制 2 MMU功能 地址映射 VA gt PA 内存访问权限控制 3 虚拟地址到物理地址的转换过程 Micro TLB gt Main TLB gt Page Table Walk 址映
  • DVWA平台漏洞测试与源码分析(一)SQL注入

    DVWA平台是初学网络安全者了解十大漏洞的有效途径 此平台收集了当前威胁网络安全的最常见的十大漏洞 并且为各位初学者提供了靶场实验环境 我们可以利用此平台进行各种攻击实验 从而丰富自己对于Web安全的认识 这篇文章主要介绍了DVWA平台中的
  • 【Hello mysql】 mysql的内外连接 (重点)

    Mysql专栏 Mysql 本篇博客简介 介绍mysql的内外连接 mysql的内外连接 重点 内连接 显示SMITH的名字和部门名称 外连接 左外连接 右外连接 总结 表的内外连接是mysql中比较常用的内容 也是我们学习mysql的重点
  • Python str函数

    描述 str函数是Python的内置函数 它将参数转换成字符串类型 即人适合阅读的形式 语法 str object 名称 说明 备注 object 待被转换成字符串的参数 可省略的参数 返回值 返回object的字符串形式 使用示例 1 无
  • vue.js 输入框输入值自动过滤特殊字符替换中问标点

  • 搜寻吉祥数,在给定的范围内,例如1~99999,找出吉祥数字,满足的条件为:全部数字必须由6或者8构成,如66666,66668,668,…

    题目 在给定的范围内 例如1 99999 找出吉祥数字 满足的条件为 全部数字必须由6或者8构成 如66666 66668 668 1 一开始想的很杂 考虑了效率 把要查找的数转化成String再转化成char数组 逐个跟 6 8 比较 但
  • 随机变量列的四种收敛性

    极限定理是研究随机变量列的收敛性 在学习中遇到了随机变量列的四种收敛性 几乎处处收敛 a e 收敛 以概率收敛 P 收敛 依分布收敛 d 收敛 k阶矩收敛 下面是对它们的吐血整理 考虑一个随机变量列 n c为一个常数 由于随机性不能直接刻画
  • 基于stm32f103c8t6的定时器详解(持续更新)

    一 stm32f103系列定时器介绍 先声明 stm32f103c8t6中没有基本定时器 只有TIM1 TIM4 分别是高级定时器和通用定时器 对照下图请自行阅读stm32f103x的datasheet 1 定时器功能 定时 输出比较 输入
  • Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘commit‘)

    问题 使用vuex的时候 调用this store commit 方法名 参数 的时候 报了这个错 搜索到的解决方法都是在说什么store没在main js里vue实例中挂载 而我 已经挂得好好的了 给我气坏了 解决策略 我问题在于 没有把
  • Vue开发环境搭建和vue-cli脚手架

    vue本质是一个js脚本 提供了一个前端框架 在开发时 可以直接引入这个js脚本 也可以使用脚手架工具 在本地搭建一个项目 Vue js安装 方法一 在 Vue js 的官网上直接下载 vue min js 并用
  • 质量铁三角

    文章目录 质量铁三角 1 流程 2 技术 3 组织 质量铁三角 1 流程 从计划到策略的实现 流程就是按照这种思维方式指导软件开发的 并且流程来源于成功的经验 可以指导项目少走弯路 从而提高软件质量 不仅如此 流程还对项目的成本和进度控制有
  • 树的Hash方法?

    写这篇博文的主要还是因为自己菜得抠脚 弱校联盟的十一专场的第三天是JAG Practice Contest for ACM ICPC Asia Regional 2016 其中的E题大意是给一颗有根树 问有多少对子树每个深度的节点数都相同
  • 【C语言】顺序表的创建

    一 代码实现部分 1 顺序表是线性表的基础部分 至于顺序表 在本人看来无异于数组 至于线性表的概念 在此不再赘述 接下来尝试利用C语言对线性表中的顺序表进行代码实现 此程序中规定用户输入的数据类型为int类型 typedef struct