一、代码实现部分:

        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博客

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐