数据结构——顺序表中基本操作的实现

/*
顺序表中基本操作的实现
2018.04.10
*/
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;

//函数结构状态代码
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//Status是函数返回值的类型,其值是函数结果状态代码
typedef int Status;

#define MAXSIZE 10000
typedef struct{
    char no[20];    //图书IBSN
    char name[50];  //图书名字
    double price;   //图书价格
}Book;

typedef struct{
    Book *elem;     //存储空间的基地址
    int length;     //图书表中当前图书的个数
}SqList;            //图书表的顺序存储结构类型为SqList

//-----------------------------------------------------------------------------------------
//顺序表的初始化
//算法步骤:
//1.为顺序表动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址;
//2.将表长设置为0

Status InitList(SqList &L){
    //构造一个空的顺序表L
    L.elem=new Book[MAXSIZE];   //为顺序表分配一个大小为MAXSIZE的数组空间
    if(!L.elem)                 //存储分配失败则退出
        exit(OVERFLOW);
    L.length=0;                 //空表长度为0
    return OK;
}

//-----------------------------------------------------------------------------------------
//取值(根据指定位置序号i,获取顺序表中的第i个元素的值)
//算法步骤:
//1.判断i是否合理(1<=i<=L.L.length);
//2.若i合理,则将第i个元素L.elem[i-1]赋值给参数e,通过e返回第i个数据元素的传值;
Status GetElem(SqList L,int i,Book &e){
    if(i<1||i>L.length)
        return ERROR;
    e=L.elem[i-1];
    return OK;
}

//-----------------------------------------------------------------------------------------
//查找(根据指定的元素值e,查找 顺序表中第1个与e相等的元素;若成功则返回该元素在表中的位置序号;若失败,则返回0)
//算法步骤:
//1.从第一个元素起,依次和e相比较,若找到与e相等的元素L.elem[i],则查找成功,返回该元素的讯号i+1;
//2.若查遍整个顺序表都没有找到,则查找失败,返回0;

Status LocateElem1(SqList L,Book e){
    for(int i=0;i<L.length;++i)
        if(strcmp(L.elem[i].name,e.name)==0)
        //if(L.elem[i].name==e.name)    //根据书名查找
            return i+1;
    return ERROR;
}

Status LocateElem2(SqList L,Book e){
    for(int i=0;i<L.length;++i)
        if(strcmp(L.elem[i].no,e.no)==0)
        //if(L.elem[i].no==e.no)    //根据书的IBSN查找
            return i+1;
    return ERROR;
}

//-----------------------------------------------------------------------------------------
//插入(在表的第i个位置插入一个新的数据元素,使长度为n的线性表变成长度为n+1的线性表)
//算法步骤:
//1.判断插入位置i是否合法(i的合法范围为1<=i<=n+1),若不合法则返回ERROR;
//2.判断顺序表的存储空间是否已满,若满则返回ERROR;
//3.将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n+1时无需移动);
//4.将要插入的新元素e放入第i个位置;
//5.表长加1;

Status ListInsert(SqList &L, int i, Book e){
    if((i<1)||(i>L.length+1))   //判断i是否合法
        return ERROR;
    if(L.length==MAXSIZE)       //判断当前存储是否已满
        return ERROR;   
    for(int j=L.length-1;j>=i-1;--j)    //插入位置及以后的元素后移
        L.elem[j+1]=L.elem[j];
    L.elem[i-1]=e;  //将新元素e放进第i个位置
    ++L.length; //表长加1
    return OK;
}

//-----------------------------------------------------------------------------------------
//删除(将表的第i个元素删除,将线性表的长度n变成n-1)
//算法步骤:
//1.判断删除位置i是否合法,若不合法则返回ERROR;
//2.将第i+1个至第n个元素依次向前移动一个位置(当i=n时无需移动);
//3.表长减1;

Status ListDelect(SqList &L,int i){
    if(i<1||i>=L.length)
        return ERROR;
    for(int j=i;j<=L.length;++j)
        L.elem[j-1]=L.elem[j];
    --L.length;
    return OK;
}

//-----------------------------------------------------------------------------------------
//删除顺序表
Status DeleteList(SqList &L){
    delete L.elem;
    return OK;
}

int main(){
    int option;
    SqList L;
    Book BookStore[3];
    strcpy(BookStore[0].name,"Happy");
    strcpy(BookStore[0].no,"BKFD532146");
    BookStore[0].price=12.445;
    strcpy(BookStore[1].name,"My Name");
    strcpy(BookStore[1].no,"JKNDK48792");
    BookStore[1].price=73.993;
    strcpy(BookStore[2].name,"I SEE");
    strcpy(BookStore[2].no,"KJFD456348");
    BookStore[2].price=58.039;
    while(1){
        system("pause");
        system("CLS");
        cout<<endl<<"图书管理系统"<<endl;
        cout<<"---------------------------------"<<endl;
        cout<<"1.顺序表初始化"<<endl;
        cout<<"2.插入数据"<<endl;
        cout<<"3.根据IBSN查找"<<endl;
        cout<<"4.根据书名查找"<<endl;
        cout<<"5.取出数值"<<endl;
        cout<<"6.显示数据"<<endl;
        cout<<"7.删除数据"<<endl;
        cout<<"8.删除顺序表"<<endl;
        cout<<"9.退出"<<endl;
        cout<<"---------------------------------"<<endl;
        cout<<"Please input option:";
        cin>>option;
        Book e;
        int tmp;
        switch(option){
        case 1:
            if(OK==InitList(L))
                cout<<"1.Success!"<<endl;
            else
                cout<<"1.ERROR!"<<endl;

            break;
        case 2:
            for(int i=0;i<3;++i){
                if(ListInsert(L,i+1,BookStore[i])!=OK){
                    cout<<"2.ERROR!"<<endl;
                    break;
                }
            }
            cout<<"2.Success!"<<endl;
            break;
        case 3:
            cout<<"Please input Book IBNS:";
            getchar();
            gets(e.no);
            if(LocateElem2(L,e)==ERROR){
                cout<<"3.No Found!"<<endl;
                break;  
            }
            else
                cout<<e.no<<" Stay in "<<LocateElem2(L,e)<<endl;
            break;
        case 4:
            cout<<"Please input Book Name:";
            getchar();
            gets(e.name);
            if(LocateElem1(L,e)==ERROR){
                cout<<"4.No Found!"<<endl;
                break;  
            }
            else
                cout<<e.name<<" Stay in "<<LocateElem1(L,e)<<endl;
            break;
        case 5:
            cout<<"Please input number:";
            cin>>tmp;
            if(GetElem(L,tmp,e)==OK){
                cout<<"\tIBNS\t\t书名\t\t价格"<<endl;
                cout<<"-----------------------------------------------"<<endl;
                cout<<"\t"<<e.no<<"\t"<<e.name<<"\t\t"<<e.price<<endl;
            }
            else
                cout<<"5.ERROR!"<<endl;
            break;
        case 6:
            if(GetElem(L,1,e)==OK){
                cout<<"\tIBNS\t\t书名\t\t价格"<<endl;
                cout<<"-----------------------------------------------"<<endl;
                for(int i=1;i<L.length;++i){
                    cout<<"\t"<<e.no<<"\t"<<e.name<<"\t\t"<<e.price<<endl;
                    GetElem(L,i+1,e);
                }
            }
            else
                cout<<"6.ERROR!"<<endl;
            break;
        case 7:
            cout<<"Please input number:";
            cin>>tmp;
            if(ListDelect(L,tmp)==OK)
                cout<<"7.Success!"<<endl;
            else
                cout<<"7.ERROR!"<<endl;
            break;
        case 8:
            if(OK==DeleteList(L))
                cout<<"8.Success!"<<endl;
            else
                cout<<"8.ERROR!"<<endl;break;
        case 9:
            cout<<"See you!"<<endl;
            exit(0);
            break;
        default:cout<<"ERROR Input!"<<endl;break;
        }
    }
    return 0;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值