/*
顺序表中基本操作的实现
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;
}
数据结构——顺序表中基本操作的实现
最新推荐文章于 2022-09-11 19:04:28 发布
本文深入探讨数据结构中的顺序表,详细解析插入、删除、查找等基本操作的原理及其实现过程,帮助理解顺序表的工作机制。
摘要由CSDN通过智能技术生成