【数据结构之线性表】顺序表简单实现图书系统

        本次图书系统使用DEV C++软件来进行操作实现。实现语言是c++。

实现图书系统使用到了顺序表的初始化、顺序表的建立、顺序表的插入、顺序表的删除、顺序表的查找等顺序表的基本操作。还使用到了c++的流进行数据的输入。

#include<iostream>
#include<fstream>
#include <iomanip>//这三个是c++的头文件
#define MAXSIZE 20
using namespace std;
typedef int Status;
 //定义图书类型 
typedef struct {
	string id;//ISBN
	string name;//书名
	double price;//定价 
} Book;
typedef struct {
	Book *elem;//存储基地址
	int length;//当前长度 
}SqList;
//顺序表初始化
Status InitList (SqList &L) {
	L.elem = new Book[MAXSIZE];//为顺序表分配一个大小为MAXSIZE的数组空间
	if(L.elem == NULL) {
		cout<< "初始化分配失败!" <<endl;
		return 0;//初始化分配失败返回0。 
	} 
	L.length = 0;
	return 1;//返回一则初始化成功 
}
//顺序表的取值
Status GetElem (SqList L, int i, Book &e) {
	if(i < 1 || i > L.length) {
		cout << "获取值失败,原因:取值不合理!!!" << endl;
		exit(1);//取值不合理直接退出。 
	}
	e = L.elem[i - 1];
	return 1;//取值成功返回一。 
} 
//顺序表的查找 
Status LocatElem (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。 
} 
//顺序表的插入
Status ListInsert (SqList &L, int i, Book e) {
	//首先判断是否可以插入
	if(i < 1 || i > L.length + 1)
	{
		return 0; 
	 } 
	 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;//顺序表加长。 
	 return 1;//插入成功返回 1。 
} 
//顺序表的删除
Status ListDelete (SqList &L, Status i) {
	//在顺序表中删除第i个元素,首先判断i的取值范围。
	if(i < 1 || i > L.length) {
		cout << "删除失败!!!";
		return 0;//i值不合法,返回0. 
	} 
	for(int j = i; j <= L.length - 1; j++) {
		L.elem[j - 1] = L.elem[j];
	}
	--L.length;
	return 1;//删除成功返回1. 
} 
//编写主函数调用顺序表的算法 
int main() {
	SqList L;
	int i = 0, temp = 0, location = 0;
	int choose;
	double price = 0;
	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 << "8,退出\n";
	choose = -1;
	while (choose != 0) {
		cout << "请选择:\n";
		cin >> choose;
		switch (choose) {
			//创建顺序表 
			case 1:
				if(InitList(L) == 1) {
					cout << "创建成功"; 
				}
				break;
			//顺序信息输入 
			case 2:
				{
					i = 0;
					fstream file;
					file.open("F://数据结构//线性表//book.txt");
					if(!file) {
						cout << "错误! 未找到文件!" << endl;
						continue;
					}
					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;
			//顺序表的取值 
			//调用此函数:GetElem (SqList L, int i, Book &e)
			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"  ///在C++中,setw(int n)用来控制输出间隔。
	                        << left << setw(50) << e.name << "\t"
	                        << left << setw(5) << e.price << endl
	                        << endl;
	                }
	                else cout<< "查找失败,位置超出范围!\n\n";	
				}		
				break;
			//顺序表的查找 
			//调用此函数:LocatElem (SqList L, double e)
			case 4:
				{
					cout << "请输入要查找的价格:\n";
					cin >> price;
					i = LocatElem(L,price);
					if (i == 0) {
						cout << "查找失败!!!"; 
					} else {
						cout << "此价格商品的序列号为:" << i <<endl;
					}
				}
				break;
			//顺序表的插入 ,
			//调用此函数:Status ListInsert (SqList &L, int i, Book e) 
			case 5:
				{
					cout << "输入插入的位置,书本信息包括:编号 书名 价格";
					cin >> location;
					cin >> e.id >> e.name >> e.price;
					i = ListInsert(L,location,e);
					if (i == 1) {
						cout << "插入成功!!!";
					}
				}
				break;
			//顺序表的删除	
			//调用此函数:Status ListDelete (SqList &L, Status i)  
			case 6:
				{
					cout << "请输入所要删除的书籍的位置:";
					cin >> location; 
					if(ListDelete(L,location) == 1) {
						cout << "删除成功!!!";
					}
				}
				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;
			case 8:
				choose = 0;
				break;
			default:
				break;
		}
	}
	return 0;
} 

注意:要先建立顺序表(否则下面的输入、插入等无法进行)

book.txt文件中的内容形式如下(TXT文件要和.cpp程序文件在同一文件目录下):

ISBN            书名                         定价
9787302257646     1程序设计基础            25
9787302219972     1单片机技术及应用        32
9787302203513     1编译原理            46
9787811234923     1汇编语言程序设计教程        21
9787512100831     1计算机操作系统            17
9787302265436     1计算机导论实验指导        18
9787302180630     1实用数据结构            29
9787302225065     1数据结构(C语言版)        38
9787302171676     1#面向对象程序设计        39
9787302250692     1语言程序设计            42
9787302150664     1数据库原理            35
9787302260806     1Java编程与实践            56
9787302252887     1Java程序设计与应用教程        39
9787302198505     1嵌入式操作系统及编程        25
9787302169666     1软件测试            24
9787811231557     1Eclipse基础与应用        35
 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值