【算法说明】
此算法代码来源于严蔚敏编著的《数据结构(C语言版|第2版)》的随书代码。
这个代码做了一点点微调。它对于学习顺序表的动态实现足矣。
【算法代码】
#include <bits/stdc++.h>
using namespace std;
const int MAXSIZE=100; //顺序表可能达到的最大长度
struct Book {
string id;//ISBN
string name;//书名
double price;//定价
};
struct SqList { //顺序表动态实现,可自由扩充
Book *elem; //存储空间的基地址
int length; //当前长度
};
int InitList_Sq(SqList &L) { //顺序表的初始化
//构造一个空的顺序表L
L.elem=new Book[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
if(!L.elem) exit(-1); //存储分配失败退出
L.length=0; //空表长度为0
return 1;
}
int GetElem(SqList L,int i,Book &e) { //顺序表的取值
if (i<1 || i>L.length) return 0; //判断i值是否合理,若不合理,返回0
e=L.elem[i-1]; //elem[i-1]单元存储第i个数据元素
return 1;
}
int LocateElem_Sq(SqList L, double e) { //顺序表的查找
for (int i=0; i<L.length; i++)
if (L.elem[i].price==e) return i+1; //查找成功,返回序号i+1
return 0;//查找失败,返回0
}
int ListInsert_Sq(SqList &L, int i, Book e) { //顺序表的插入
//在顺序表L中第i个位置之前插入新的元素e
//i值的合法范围是1<=i<=L.length+1
if ((i<1)||(i>L.length+1)) return 0; //i值不合法
if (L.length==MAXSIZE) return 0; //当前存储空间已满
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 1;
}
int ListDelete_Sq(SqList &L, int i) { //顺序表的删除
//在顺序表L中删除第i个元素,并用e返回其值
//i值的合法范围是1<=i<=L.length
if ((i<1) || (i>L.length)) return 0; //i值不合法
for (int j=i; j<=L.length; j++)
L.elem[j-1]=L.elem[j]; //被删除元素之后的元素前移
--L.length; //表长减1
return 1;
}
int main() {
SqList L;
int i=0, temp, a, c, choose;
double price;
Book e;
string head_1, head_2, head_3;
cout<<"1. 建立\n";
cout<<"2. 输入\n";
cout<<"3. 取值\n";
cout<<"4. 查找\n";
cout<<"5. 插入\n";
cout<<"6. 删除\n";
cout<<"7. 输出\n";
cout<<"0. 退出\n\n";
choose=-1;
while(choose!=0) {
cout<<"请选择:";
cin>>choose;
switch (choose) {
case 1://创建顺序表
if (InitList_Sq(L)) cout<<"成功建立顺序表\n\n";
else cout<<"顺序表建立失败\n\n";
break;
case 2: { //顺序表信息输入
i=0;
L.elem=new Book[MAXSIZE];
if(!L.elem) exit(-1);
L.length=0;
fstream file;
file.open("book.txt");
if(!file) {
cout<<"错误!未找到文件!"<<endl;
exit(0);
}
file>>head_1>>head_2>>head_3;
while (!file.eof()) {
file>>L.elem[i].id>>L.elem[i].name>>L.elem[i].price;
i++;
}
cout<<"输入 book.txt 信息完毕\n\n";
L.length=i;
file.close();
}
break;
case 3://顺序表的取值
cout<<"请输入一个位置用来取值:\n";
cin>>i;
temp=GetElem(L,i,e);
if (temp!=0) {
cout<<"查找成功\n";
cout<<"第"<<i<<"本图书的信息是:\n";
cout<<left<<setw(15)<<e.id<<"\t"<<left<<setw(50)
<<e.name<<"\t"<<left<<setw(5)<<e.price<<endl
<<endl;
} else
cout<<"查找失败!位置超出范围\n\n";
break;
case 4: //顺序表的查找
cout<<"请输入所要查找价格:";
cin>>price;
temp=LocateElem_Sq(L, price);
if (temp!=0) {
cout<<"查找成功\n";
cout<<"该价格对应的书名为:"<<L.elem[temp-1].name<<endl<<endl;
} else
cout<<"查找失败!没有这个价格对应的书籍\n\n";
break;
case 5: //顺序表的插入
cout<<"请输入插入的位置和书本信息,包括:编号 书名 价格(用空格隔开):";
cin>>a;
cin>>e.id>>e.name>>e.price; //输入a和b,a代表插入的位置,b代表插入的数值(书本信息)
if (ListInsert_Sq(L, a, e))
cout<<"插入成功.\n\n";
else
cout<<"插入失败.\n\n";
break;
case 6: //顺序表的删除
cout<<"请输入所要删除的书籍的位置:";
cin>>c;
if(ListDelete_Sq(L,c))
cout<<"删除成功.\n\n";
else
cout<<"删除失败.\n\n";
break;
case 7: //顺序表的输出
cout<<"当前图书系统信息(顺序表)读出:\n";
for(i=0; i<L.length; i++)
cout<<left<<setw(15)<<L.elem[i].id<<"\t"<<left
<<setw(50)<<L.elem[i].name<<"\t"<<left
<<setw(5)<<L.elem[i].price<<endl;
cout<<endl;
break;
}
}
return 0;
}
/* book.txt文件内容
ISBN 书名 定价
9787302257646 程序设计基础 25
9787302219972 单片机技术及应用 32
9787302203513 编译原理 46
9787811234923 汇编语言程序设计教程 21
9787512100831 计算机操作系统 17
9787302265436 计算机导论实验指导 18
9787302180630 实用数据结构 29
9787302225065 数据结构(C语言版) 38
9787302171676 C#面向对象程序设计 39
9787302250692 C语言程序设计 42
9787302150664 数据库原理 35
9787302260806 Java编程与实践 56
9787302252887 Java程序设计与应用教程 39
9787302198505 嵌入式操作系统及编程 25
9787302169666 软件测试 24
9787811231557 Eclipse基础与应用 35
*/