数据结构(C语言)线性表 顺序存储

/*本程序中涉及位置,皆从位置0开始*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define Max_Length 100

typedef struct
{
    int data[Max_Length];
    int length;
}SqList;

int List_Init(SqList *List)
{
    //输入表长,产生随机数初始化表
    int i;
    srand(time(0));
    printf("请输入线性表长度(1-100):");
    scanf("%d",&List->length);
    if(List->length<1||List->length>100)//判断输入是否合法
        return ERROR;
    for(i=0;i<=List->length-1;i++)
        List->data[i]=rand()%Max_Length;//产生随机数并初始化
    return OK;
}//初始化函数

int List_Insert(SqList *List,int Pos,int Elem)
{
    //在指定位置插入元素
    int p=List->length-1;
    if(List->length==Max_Length)//判断表是否已满
        return OVERFLOW;
    else if(Pos<0||Pos>List->length)//判断位置是否合法
        return INFEASIBLE;
    else
    {
        while(p>=Pos)
        {
            List->data[p+1]=List->data[p];//右移插入位置后的元素
            p--;
        }
        List->data[Pos]=Elem;
        List->length++;
        return OK;
    }
}//插入函数

int List_Delete_Pos(SqList *List,int Pos,int *Elem)
{
    //删除指位置的元素,并返回
    if(Pos<0||Pos>List->length-1)//判断位置是否合法
        return INFEASIBLE;
    else
    {   
        *Elem=List->data[Pos];
        while(Pos<=List->length-2)
        {
            List->data[Pos]=List->data[Pos+1];//删除位置以后元素左移
            Pos++;
        }
        List->length--;
        return OK;
    }
}//按位置删除函数

int List_Delete_Elem(SqList *List,int Elem)
{
    //删除表中所有指定元素
    int flag=0,i,DeleteElem,State;
    for(i=0;i<=List->length-1;i++)
    {
        if(Elem==List->data[i])//判断遍历元素是否与目标元素相等
        {
            flag=1;
            State=List_Delete_Pos(List,i,&DeleteElem);
            i--;
        }
    }
    if(flag==0)
        return ERROR;//如果flag=0,则表示表中没有目标元素
    else
        return OK;
}//按元素删除函数

int List_Replace_Pos(SqList *List,int Pos,int *Elem)
{
    //替换指定位置元素
    int e=*Elem;
    if(Pos<0||Pos>List->length)//判断位置是否合法
        return INFEASIBLE;
    else
    {
        *Elem=List->data[Pos];
        List->data[Pos]=e;
        return OK;
    }
}//按位置替换函数

int List_Replace_Elem(SqList *List,int e,int Elem)
{
    //替换所有表中目标函数
    int flag=0,i;
    for(i=0;i<=List->length-1;i++)
        if(List->data[i]==e)//判断遍历元素与目标元素是否相等
        {
            flag=1;
            List->data[i]=Elem;
        }
    if(flag==0)
        return ERROR;//如果flag=0,则表中没有目标元素
    else
        return OK;
}//按元素替换函数

int List_Find_Pos(SqList *List,int Pos,int *Elem)
{
    //返回指定位置元素
    if(Pos<0||Pos>List->length-1)//判断位置是否合法
        return INFEASIBLE;
    else
    {
        *Elem=List->data[Pos];
        return OK;
    }
}//按位置查找函数

int List_Find_Elem(SqList *List,int Elem,int *Pos)
{
    //返回目标元素首次出现的位置
    int flag=0,i;
    for(i=0;i<=List->length-1;i++)
        if(Elem==List->data[i])//判断遍历元素是否与目标元素相等
        {
            flag=1;
            *Pos=i;
            return OK;
        }
    if(flag==0)
        return ERROR;//如果flag=0,则表中没有目标元素
}//按元素查找函数

int List_Show_All(SqList *List)
{
    int i;
    if(List->length<=0)
        return ERROR;
    else
    {
        for(i=0;i<=List->length-1;i++)
            printf("%02d ",List->data[i]);
        printf("\n");
        return OK;
    }
}//查看所有元素

void List_Show_Length(SqList *List,int *Length)
{
    *Length=List->length;
}//查看表长函数

void List_Clear(SqList *List)
{
    List->length=0;
}//清空表函数

int menu()
{
    //显示操作页面菜单
    int result;
    while(1)
    {
        system("cls");
        printf("***************顺序表菜单***************\n");
        printf("01.初始化表     02.插入元素\n");
        printf("03.按位置删除        04.按元素删除\n");
        printf("05.按位置查找        06.按元素查找\n");
        printf("07.按位置替换        08.按元素替换\n");
        printf("09.查看所有元素       10.查看表长\n");
        printf("11.清空表      12.保存数据到文件\n");
        printf("13.读取文件数据       00.退出程序\n");
        printf("*****************************************\n");
        printf("请输入:");//打印菜单
        if(scanf("%d",&result)!=1)//检测输入
        {
            fflush(stdin);
            continue;
        }
        if(result>=0&&result<=13)
            break;
    }
    return (result);
}//菜单函数

void List_Read(SqList *List)
{
    //读取文件中的表信息
    FILE *fp;
    int i;
    if((fp=fopen("Database.txt","r"))==NULL)
        exit(INFEASIBLE);
    fscanf(fp,"%d",&List->length);
    for(i=0;i<=List->length-1;i++)
        fscanf(fp,"%d",&List->data[i]);
    fclose(fp);
}//拓展1:读取文件数据

void List_Save(SqList *List)
{
    //将表的信息保存到文件中
    FILE *fp;
    int i;
    if((fp=fopen("Database.txt","w"))==NULL)
        exit(INFEASIBLE);
    fprintf(fp,"%d\n",List->length);
    for(i=0;i<=List->length-1;i++)
            fprintf(fp,"%02d ",List->data[i]);
    fclose(fp);
}//拓展2:保存到文件

int main()
{
    int result,Pos,e,Elem,Length,State;
    SqList sqlist;
    SqList *List=&sqlist;
    while(1)
    {
        result=menu();
        switch(result)
        {
        case 1:
            system("cls");
            printf("1.初始化表:\n");
            State=List_Init(List);
            if(State==OK)
                printf("初始化成功!\n");
            else
                printf("初始化失败!\n");
            printf("按任意键继续......\n");
            getch();
            break;
        case 2:
            system("cls");
            printf("2.插入元素:\n");
            printf("请输入插入元素:");
            scanf("%d",&Elem);
            printf("请输入插入位置(0-%d):",List->length);
            scanf("%d",&Pos);
            State=List_Insert(List,Pos,Elem);
            if(State==OVERFLOW)
                printf("线性表已满,不可插入!\n");
            else if(State==INFEASIBLE)
                printf("插入元素物理位置错误!\n");
            else
                printf("插入成功!\n");
            printf("按任意键继续......\n");
            getch();
            break;
        case 3:
            system("cls");
            printf("3.按位置删除:\n");
            printf("请输入删除元素所在位置(0-%d):",List->length-1);
            scanf("%d",&Pos);
            State=List_Delete_Pos(List,Pos,&Elem);
            if(State==INFEASIBLE)
                printf("删除元素物理位置错误!\n");
            else
                printf("删除成功!\n");
            printf("按任意键继续......\n");
            getch();
            break;
        case 4:
            system("cls");
            printf("4.按元素删除:\n");
            printf("请输入删除元素:");
            scanf("%d",&Elem);
            State=List_Delete_Elem(List,Elem);
            if(State==ERROR)
                printf("元素不存在!\n");
            else
                printf("删除元素成功!\n");
            printf("按任意键继续......\n");
            getch();
            break;
        case 5:
            system("cls");
            printf("5.按位置查找:\n");
            printf("请输入查找位置(0-%d):",List->length-1);
            scanf("%d",&Pos);
            State=List_Find_Pos(List,Pos,&Elem);
            if(State==INFEASIBLE)
                printf("目标元素物理位置错误!\n");
            else
                printf("线性表位置%d为元素%d\n",Pos,Elem);
            printf("按任意键继续......\n");
            getch();
            break;
        case 6:
            system("cls");
            printf("6.按元素查找:\n");
            printf("请输入查找元素:");
            scanf("%d",&Elem);
            State=List_Find_Elem(List,Elem,&Pos);
            if(State==ERROR)
                printf("该元素不存在!\n");
            else
                printf("元素%d在表中的位置为%d\n",Elem,Pos);
            printf("按任意键继续......\n");
            getch();
            break;
        case 7:
            system("cls");
            printf("7.按位置替换:\n");
            printf("请输入替换位置(0-%d):",List->length-1);
            scanf("%d",&Pos);
            printf("请输入替换后元素:");
            scanf("%d",&Elem);
            State=List_Replace_Pos(List,Pos,&Elem);
            if(State==INFEASIBLE)
                printf("替换元素物理位置错误!\n");
            else
                printf("替换元素成功!\n");
            printf("按任意键继续......\n");
            getch();
            break;
        case 8:
            system("cls");
            printf("8.按元素替换:\n");
            printf("请输入替换前元素:");
            scanf("%d",&e);
            printf("请输入替换后元素:");
            scanf("%d",&Elem);
            State=List_Replace_Elem(List,e,Elem);
            if(State==ERROR)
                printf("目标元素不存在!\n");
            else 
                printf("替换成功!\n");
            printf("按任意键继续......\n");
            getch();
            break;
        case 9:
            system("cls");
            printf("9.查看所有元素:\n");
            State=List_Show_All(List);
            if(State==ERROR)
                printf("线性表为空!\n");
            printf("按任意键继续......\n");
            getch();
            break;
        case 10:
            system("cls");
            printf("10.查看表长:\n");
            List_Show_Length(List,&Length);
            printf("当前线性表的长度为:%d\n",Length);
            printf("按任意键继续......\n");
            getch();
            break;
        case 11:
            system("cls");
            printf("11.清空表:\n");
            List_Clear(List);
            printf("已清空线性表表!\n");
            printf("按任意键继续......\n");
            getch();
            break;
        case 12:
            system("cls");
            printf("12.保存数据到文件:\n");
            List_Save(List);
            printf("保存成功!\n");
            printf("按任意键继续......\n");
            getch();
            break;
        case 13:
            system("cls");
            printf("13.读取文件数据:\n");
            List_Read(List);
            printf("读取文件成功!\n");
            printf("按任意键继续......\n");
            getch();
            break;
        case 0:
            printf("确定退出?Y/N\n");
            fflush(stdin);
            if(getchar()=='Y')
            {
                printf("谢谢使用!再见......\n");
                exit(0);
            }
            else
            {               
                printf("请继续......\n");
                getch();
            }
            break;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值