线性表的顺序存储—顺序表,突然的自我

先看代码整体结构

在这里插入图片描述

再看运行效果

初始化顺序表

在这里插入图片描述

追加元素

在这里插入图片描述

定位元素的下标

在这里插入图片描述

通过元素下标获取元素

在这里插入图片描述

插入元素

在这里插入图片描述

排序

在这里插入图片描述

删除元素

在这里插入图片描述

修改指定下标的元素值

在这里插入图片描述

清空顺序表后,操作菜单就会呈现提示“顺序表已清空”在这里插入图片描述

顺序表清空后,若再次进行某些函数操作,函数也会给出提示“顺序表已清空”。这里就拿顺序表的遍历和排序作示例
在这里插入图片描述
在这里插入图片描述

最后看代码?我还是复制粘贴后直接运行吧!读程真的很累!

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 6//顺序表的最大长度
#define SPAN 35;//菜单的水平跨度
#define VerticalGap 2//菜单的垂直间距,1就是一个换行,2就是两个换行
typedef struct ArrayList
{
    int* origin;//数据的来源,在结构体初始化后,与一段连续的内存单元建立联系,并操作这一块内存单元
    int length;//顺序表的最大长度,记录顺序表的最大容量,能存放多少个元素
    int counter;//顺序表的计数器,记录当前元素的个数
}* ListPointer,List;
ListPointer initialize();//初始化顺序表
void manifest(ListPointer lp);//遍历顺序表
void sort(ListPointer lp);
void append(ListPointer lp,int value);//为顺序表追加元素,也就是在顺序表末尾添加一个元素
void insert(ListPointer lp,int position,int value);//在顺序表指定的位置下插入一个值
void delete(ListPointer lp,int position);//删除顺序表中某一元素的值
void modify(ListPointer lp,int position,int value);//修改表中的某一元素值
void getElement(ListPointer lp,int position,int* value);//给定元素下标,返回元素值
void locateElement(ListPointer lp,int value,int* position);//定位元素,返回元素的下标
void clear(ListPointer lp);//清空顺序表
int judge(ListPointer lp,int position,char* executive);//判断在顺序表lp上,第position位置进行executive操作是否能够进行,这里的executive是函数名,
int isEmpty(ListPointer lp);//判断顺序表是否为空
int isFull(ListPointer lp);//判断顺序表是否已满
void inputData(int* data,char* dataExplanation);//录入数据,因为要反复使用scanf和printf这两个函数,干脆做一个提取
void menu(char** menu,int length);//动态地输出菜单
void duplicate(int size,char token);//给出一个整数size和一个字符型符号token,输出size个token,不换行
int main() {
    char* operatingMenu[] = {
            "1.reinitialize list", "2.present list", "3.append element",
            "4.delete element", "5.modify element", "6.insert element",
            "7.get element","8.locate element","9.sort",
            "10.clear list", "11.exit"};
    int length=sizeof(operatingMenu)/sizeof(char*);
    int indicator,position,value;
    ListPointer lp=NULL;
    printf("initializing...\n");
    lp=initialize();
    while(1)
    {
        system("cls");
        menu(operatingMenu,length);
        (lp!=NULL && !isEmpty(lp))?manifest(lp):printf("The List Is Empty.Data are required!Press 1 or 3 to renew.\n");
        inputData(&indicator,"digital indication:");
        switch(indicator)
        {
            case 1:free(lp);lp=initialize();break;//销毁之前的顺序表,并重新初始化一个顺序表
            case 2:manifest(lp);system("pause");break;
            case 3:{
                inputData(&value,"VALUE:");
                append(lp,value);
                system("pause");
                break;
            }
            case 4:{
                inputData(&position,"POSITION:");
                if(judge(lp,position,"delete"))
                {
                    delete(lp,position);
                }
               system("pause");
                break;
            }
            case 5:
            {
                inputData(&position,"POSITION:");
                if(judge(lp,position,"modify"))
                {
                    inputData(&value,"VALUE:");
                    modify(lp,position,value);
                }
                system("pause");
                break;
            }
            case 6:{
                inputData(&position,"POSITION:");
                if(judge(lp,position,"insert"))
                {
                    inputData(&value,"VALUE:");
                    insert(lp,position,value);
                }
                system("pause");
                break;
            }
            case 7:
                inputData(&position,"POSITION:");
                if(judge(lp,position,"getElement"))
                {
                    getElement(lp,position,&value);
                    printf("The element of position %d :\t%d\n",position,value);
                }
                system("pause");
                break;
            case 8:
                inputData(&value,"VALUE:");
                if(judge(lp,666,"locateElement"))
                {
                    locateElement(lp,value,&position);
                    position>0?printf("The position of element %d :\t%d\n",value,position):printf("The element doesn't exist!");
                }
                system("pause");
                break;
            case 9:sort(lp);system("pause");break;
            case 10:clear(lp);system("pause");break;
            case 11:free(lp);exit(-1);//销毁顺序表,并退出
        }
    }
}
ListPointer initialize() {
    ListPointer lp=(ListPointer)malloc(sizeof(List));
    lp->length=MAXSIZE;
    lp->origin=(int*)malloc(sizeof(int)*lp->length);
    lp->counter=0;
    int length;
    inputData(&length,"The length of List(0<length<6):");
    if(length<=0 || length>lp->length)
        exit(-1);
    for (int i = 0; i < length; ++i) {
        printf("element %d:",i+1);
        scanf("%d",lp->origin+i);
        ++lp->counter;
    }
    return lp;
}
void manifest(ListPointer lp)
{
    if(!judge(lp,666,"manifest"))
        return;
    printf("{");
    for (int i = 0; i < lp->counter; ++i) {
        if(i<lp->counter-1)
            printf("%d,",lp->origin[i]);
        else
            printf("%d}\n",*(lp->origin+i));
    }
}
void sort(ListPointer lp)//这里选用插入排序
{
    if(!judge(lp,666,"sort"))
        return;
    int retreat,shirley;
    for (int i = 1; i < lp->counter; ++i) {
        shirley=lp->origin[i];
        for (retreat =i-1; retreat>=0 && shirley<lp->origin[retreat]; --retreat) {
            lp->origin[retreat+1]=lp->origin[retreat];
        }
        lp->origin[retreat+1]=shirley;
    }
    printf("sorting is finished!\n");
}
void append(ListPointer lp,int value)
{
    if(!judge(lp,666,"append"))//666相当于良民证
    {
        return;
    }
    lp->origin[lp->counter]=value;
    ++lp->counter;
}
void insert(ListPointer lp,int position,int value)
{
    if(!judge(lp,position,"insert"))
    {
        return;
    }
    lp->counter++;
    for (int i = lp->counter; i>position; --i) {
        lp->origin[i-1]=lp->origin[i-2];
    }
    lp->origin[position-1]=value;
    printf("The element was inserted into list completely!\n");
}
void delete(ListPointer lp,int position)
{
    if(!judge(lp,position,"delete"))
    {
        return;
    }
    int value=lp->origin[position-1];
    for (int i = position; i <lp->counter ; ++i) {
        lp->origin[i-1]=lp->origin[i];
    }
    --lp->counter;
    printf("The element whose position is %d and value is %d was deleted completely!\n",position,value);
}
void modify(ListPointer lp,int position,int value)
{
    judge(lp,position,"modify")?lp->origin[position-1]=value:printf("operate once more please!!!");
}
void getElement(ListPointer lp,int position,int* value)
{
    if(judge(lp,position,"getElement"))
       *value=lp->origin[position-1];
}
void locateElement(ListPointer lp,int value,int* position)
{
    int flag=0;
    if(judge(lp,666,"locateElement"))
    {
        for(int  i = 0; i < lp->counter; ++i) {
            if(lp->origin[i]==value)
            {
                *position=i+1;
                flag=1;
            }
        }
        if(flag==0)
            *position=-1;
    }
}
void clear(ListPointer lp)
{
    lp->counter=0;
    printf("The List Was Cleared.Press 1 or 3 to renew!\n");
}
int judge(ListPointer lp,int position,char* executive)
{
    if(isEmpty(lp)&&(!strcmp(executive,"delete")
    ||!strcmp(executive,"modify")||!strcmp(executive,"manifest")
    ||!strcmp(executive,"insert")||!strcmp(executive,"getElement")
    ||!strcmp(executive,"locateElement")||!strcmp(executive,"sort")))
    {
        printf("The List Is Empty!\n");
        return 0;
    }
    if(isFull(lp) && (!strcmp(executive,"append") || !strcmp(executive,"insert")))
    {
        printf("The List Is Full!\n");
        return 0;
    }
    if(position==666)//验证函数操作是否合法时,666表示当前的函数无需指定下标去操作,相当于良民证“放行”
        return 1;
    if(position>lp->counter || position<=0)
    {
        printf("invalid position!\n");
        return 0;
    }
    return 1;
}
int isEmpty(ListPointer lp)
{
    return lp->counter==0?1:0;
}
int isFull(ListPointer lp)
{
    return lp->counter==lp->length?1:0;
}
void inputData(int* data,char* dataExplanation)
{
    printf("%s",dataExplanation);
    scanf("%d",data);
}
void menu(char** origin,int length) {
    int span=SPAN;
    int gapLength;
    duplicate(span,'*');
    duplicate(1,'\n');
    for (int i = 0; i < length; ++i) {
        duplicate(1,'*');
        gapLength=span-(strlen(*(origin+i)))-2;
        duplicate(gapLength/2,' ');
        printf("%s",origin[i]);
        if(gapLength%2==0)
        {
            duplicate(gapLength/2,' ');
        }else
        {
            duplicate(gapLength/2+1,' ');
        }
        duplicate(1,'*');
        duplicate(VerticalGap,'\n');
    }
    duplicate(span,'*');
    duplicate(1,'\n');
}
void duplicate(int size,char token)
{
    for (int i = 0; i <size ; ++i) {
        printf("%c",token);
    }
}

尽管累,但是我们在读程的过程中会不知不觉地成长着,提升着自己的读程能力,在潜移默化中也改善了我们的编程能力,加强了我们做事的耐心!共勉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值