一、实验名称:线性顺序表的应用——图书管理系统
二、实验目的
熟练掌握线性表的顺序存储方法,实现顺序表的基本操作,能够使用顺序表的基本操作完成图书管理的基本功能。
三、实验要求
1、建立头文件SqList.h,包含数据类型定义和基本操作。
2、建立程序文件SqListApp.cpp,通过调用头文件中的操作实现以下功能. (1)从数据文件中读入数据到顺序表 (2)遍历 (3)查找 (4)插入(5)删除(6)修改。
四、实验环境
(1) 硬件环境:微机一台;
(2) 软件环境:windows7+VC++ 2010/6.0集成开发环境。
五、实验内容(测试数据可以更改,根据自己实现的题目改写下面的内容)
1 创建:创建顺序表list,将数据文件book.txt文件中的数据读入顺序表,然后遍历顺序表
2 查找:读取第idx个元素的值(idx=4)
3 修改(按价格查找):查找价格是price的图书信息(price=38),把38修改成30.
4 修改(按书号查找):查找书号是id的图书信息(id=9787302252887),把价格修改成30.
5 插入(在第i个元素前):在第idx个元素前插入元素elem_ins4 然后遍历顺序表(idx=3,elem_ins4=(9787302180632 数据结构实用教程 35)
6 插入(在元素e 前):在元素elem_ins4 前插入元素elem_ins5,然后遍历顺序表(elem_ins5=9787302180633 算法与数据结构 30)
7 删除(第i个元素):删除第idx个元素,把被删元素存入元素elem_dele6, 然后输出elem_dele6, 遍历顺序表(idx=5)
8 删除(删除元素e):删除元素elem_ins5,把被删元素存入元素elem_dele7, 然后然后输出elem_dele7
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
SqList.h
#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
#include<Windows.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
#define MAXSIZE 100 //顺序表可能达到的最大长度
struct Book {
string id;//ISBN
string name;//书名
double price;//定价
};
typedef Book ElemType;
typedef struct {
ElemType *elem; //存储空间的基地址
int length; //当前长度
} SqList;
Status InitList_Sq(SqList &L) { //算法2.1 顺序表的初始化
//构造一个空的顺序表L
L.elem = new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
if (!L.elem)
exit(OVERFLOW); //存储分配失败退出
L.length = 0; //空表长度为0
return OK;
}
void InputFromFile_Sq(SqList &L,string fn)
{//顺序表信息输入,从book.txt文件中读入数据到线性表
string head_1,head_2,head_3;
int i=L.length;
fstream infile;
infile.open("book.txt");
if (!infile) {
cout << "错误!未找到文件!" << endl;
exit(ERROR);
}
infile >> head_1 >> head_2 >> head_3;
while (!infile.eof()) {
infile >> L.elem[i].id >> L.elem[i].name >> L.elem[i].price;
i++;
}
L.length = i;
infile.close();
}
Status GetElem(SqList L, int i, ElemType &e) {//算法2.2 顺序表的取值
if (i < 1 || i > L.length)
return ERROR; //判断i值是否合理,若不合理,返回ERROR
e = L.elem[i - 1]; //elem[i-1]单元存储第i个数据元素
return OK;
}
int LocateElem_Sq(SqList L, double e) { //算法2.3 顺序表的查找
//顺序表的查找
for (int i = 0; i < L.length; i++)
if (L.elem[i].price == e)
return i + 1;//查找成功,返回序号i+1
return 0;//查找失败,返回0
}
Status ListInsert_Sq(SqList &L, int i, ElemType e) { //算法2.4 顺序表的插入
//在顺序表L中第i个位置之前插入新的元素e
//i值的合法范围是1<=i<=L.length+1
if ((i < 1) || (i > L.length + 1))
return ERROR; //i值不合法
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;
}
Status ListDelete_Sq(SqList &L, int i,ElemType &e) { //算法2.5 顺序表的删除
//在顺序表L中删除第i个元素,并用e返回其值
//i值的合法范围是1<=i<=L.length
if ((i < 1) || (i > L.length))
return ERROR; //i值不合法
e=L.elem[i-1];
for (int j = i; j <= L.length; j++)
L.elem[j - 1] = L.elem[j]; //被删除元素之后的元素前移
--L.length; //表长减1
return OK;
}
void ListModify_Sq(SqList &L,double p1,double p2)
{//将顺序表中的元素价格为p1修改成p2
//调用方法LocateElem_Sq找到price=p1元素的位序index,然后修改其price为p2
int index=LocateElem_Sq(L,p1);
if(index)
L.elem[index-1].price=p2;
else
cout<<"no element price is "<<p1<<endl;
}
void Traverse_Sq(SqList L)
{//顺序表的输出
cout << "当前图书系统信息(顺序表)读出:\n";
for (int i = 0; i < L.length; i++)
cout << left <<"No " <<i+1<<": "<<setw(15) << L.elem[i].id << "\t" << left
<< setw(30) << L.elem[i].name << "\t" << left
<< setw(5) << L.elem[i].price << endl;
}
void showAuthor()
{
cout<<endl;
cout<<"\t\t\t----------------------------------------"<<endl;
cout<<"\t\t\t*** 学号 11111111111 姓名 张三三 ***"<<endl;
cout<<"\t\t\t----------------------------------------"<<endl;
cout<<"\t\t\t\t1 创建:创建顺序表list\n";
cout<<"\t\t\t\t2 查找第idx个元素的值(idx=4)\n";
cout<<"\t\t\t\t3 修改(按价格查找)\n";
cout<<"\t\t\t\t4 修改(按书号查找)\n";
cout<<"\t\t\t\t5 插入(在第i个元素前)\n";
cout<<"\t\t\t\t6 插入(在元素e 前)\n";
cout<<"\t\t\t\t7 删除(第i个元素)\n";
cout<<"\t\t\t\t8 删除(删除元素e)\n";
cout<<"\t\t\t\t0 退出\n";
cout<<"\t\t\t请输入以下选项(0-8)\n";
}
void VisitElement(SqList L,int i)
{//输出顺序表中的第i个元素
cout << left <<"VisitElement算法实现: No " <<i<<": "<<setw(15) << L.elem[i-1].id << "\t" << left
<< setw(30) << L.elem[i-1].name << "\t" << left
<< setw(5) << L.elem[i-1].price << endl;
}
int LocateElemid_Sq(SqList L, string e) {
//顺序表的查找
for (int i = 0; i < L.length; i++)
if (L.elem[i].id == e)
return i + 1;//查找成功,返回序号i+1
return 0;//查找失败,返回0
}
void ListModifyById_Sq(SqList &L,string id,int p)
{//将顺序表中书号是id的元素价格修改成p
//调用方法LocateElemById_Sq找到id元素的位序index,然后修改其price为p
int index=LocateElemid_Sq(L,id);
if(index)
L.elem[index-1].price=p;
else
cout<<"no element price "<<endl;
}
SqListApp.cpp
/*
//1 创建:创建顺序表list,将数据文件book.txt文件中的数据读入顺序表,然后遍历顺序表
//2 查找:读取第idx个元素的值(idx=4)
//3 修改(按价格查找):查找价格是price的图书信息(price=38),把38修改成30.
//4 修改(按书号查找):查找书号是id的图书信息(id=9787302252887),把价格修改成30.
//5 插入(在第i个元素前):在第idx个元素前插入元素elem_ins4 然后遍历顺序表(idx=3,elem_ins4=(9787302180632 数据结构实用教程 35)
//6 插入(在元素e 前):在元素elem_ins4 前插入元素elem_ins5,然后遍历顺序表(elem_ins5=9787302180633 算法与数据结构 30)
//7 删除(第i个元素):删除第idx个元素,把被删元素存入元素elem_dele6, 然后输出elem_dele6, 遍历顺序表(idx=5)
//8 删除(删除元素e):删除元素elem_ins5,把被删元素存入元素elem_dele7, 然后然后输出elem_dele7,遍历顺序表 (elem=9787302180633 算法与数据结构 30)
*/
#include"Sqlist.h"
int main() {
system("title 1111张三");
system("date /T"); //显示当前日期
system("TIME /T");
system("color E4"); //改变运行界面的背景颜色和字体颜色
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SMALL_RECT rc;
rc.Left = 0;
rc.Top = 0;
rc.Right = 80;
rc.Bottom = 30;
SetConsoleWindowInfo(hOut, TRUE, &rc);
SqList list;
string filename="book.txt";
ElemType e;
int idx=0;
ElemType elem_ins4;
elem_ins4.id="9787302180632";
elem_ins4.name="数据结构实用教程";
elem_ins4.price=35;
ElemType elem_ins5;
elem_ins5.id="9787302180633";
elem_ins5.name="算法与数据结构";
elem_ins5.price=40;
ElemType elem_dele6,elem_dele7;
int choose=-1;
while(choose!=0)
{
showAuthor();
cin>>choose;
switch(choose)
{
case 1: //1 创建:创建顺序表list,将数据文件book.txt文件中的数据读入顺序表,然后遍历顺序表
cout<<"---将数据文件book.txt文件中的数据读入顺序表---"<<endl;
if(InitList_Sq(list))
cout<<"顺序表创建成功"<<endl; // 创建顺序表
system("pause");
InputFromFile_Sq(list,filename);
cout<<"将数据读入顺序表"<<endl; //将数据文件book.txt文件中的数据读入顺序表
system("pause");
Traverse_Sq(list);
cout<<"遍历顺序表成功"<<endl; //遍历顺序表
system("pause");
system("cls");
break;
case 2://2 查找:读取第idx个元素的值(idx=4)
idx=4;
cout<<"---2 查找:读取第idx个元素的值(idx=4)---"<<endl;
GetElem(list,4,e);//算法2.2 顺序表的取值
cout<<"GetElem算法实现: No 4 "<<": "<<" "<<e.id<<" "<<e.name<<" "<<e.price<<endl;
VisitElement(list,4);//输出顺序表中的第i个元素
system("pause");
system("cls");
break;
case 3://3 修改:查找价格是price的图书信息(price=38),把38修改成30.
idx=LocateElem_Sq(list,38);
cout<<"---befor modify:---"<<endl;
VisitElement(list, idx);
ListModify_Sq(list ,38,30);
cout<<"---after modify:---"<<endl;
VisitElement(list, idx);
system("pause");
system("cls");
break;
case 4:
//4 修改(按书号查找):查找书号是id的图书信息(id=9787302252887),把价格修改成30.
idx=LocateElemid_Sq(list,"9787302252887");
cout<<"---befor modify:---"<<endl;
VisitElement(list, idx);
ListModifyById_Sq(list,"9787302252887",30);
cout<<"---after modify:---"<<endl;
VisitElement(list, idx);
system("pause");
system("cls");
break;
case 5://5 插入(在第i个元素前):在第idx个元素前插入元素elem_ins4
idx=3;
cout<<"---5 插入(在第i个元素前)---"<<endl;
ListInsert_Sq(list,idx,elem_ins4);
Traverse_Sq(list);
system("pause");
system("cls");
break;
case 6: //6 插入(在元素e 前):在元素elem_ins4 前插入元素elem_ins5
//(1)调用方法LocateElem_Sq找到elem_ins4所在的位序idx
//(2)调用方法ListInsert_Sq在第idx个元素前插入元素elem_ins5
cout<<"---6 插入(在元素e 前)---"<<endl;
idx=LocateElem_Sq(list,elem_ins4.price);
ListInsert_Sq(list,idx,elem_ins5);
Traverse_Sq(list);
system("pause");
system("cls");
break;
case 7:
//7 删除(第i个元素):删除第idx个元素,把被删元素存入元素elem_dele6, 然后输出elem_dele6, 遍历顺序表(idx=5)
idx=5;
cout<<"---7 删除(第i个元素)---\n";
VisitElement(list,5);
ListDelete_Sq(list,idx,elem_dele6);
Traverse_Sq(list);
system("pause");
system("cls");
break;
case 8:
//8 删除(删除元素e):删除元素elem_ins5,把被删元素存入元素elem_dele7,
// 然后然后输出elem_dele7,遍历顺序表 (elem=9787302180633 算法与数据结构 30)
cout<<"---8 删除(删除元素e)---\n";
idx=LocateElem_Sq(list,elem_ins5.price);
VisitElement(list,idx);
ListDelete_Sq(list,idx,elem_dele7);
Traverse_Sq(list);
system("pause");
system("cls");
break;
case 0:break;
}
}
return 0;
}