图书信息的组成部分为:书号、书名、作者名、出版社、出版时间、价格
1) 新书上架:添加图书信息 2) 图书浏览:输出所有图书信息 3) 图书查询:可按书号、书名或作者名查询 4)图书下架:删除指定图书信息,如按书号 |
一、每一部分的功能
由书的信息构成的结构体
typedef struct book
{
string num;//书号
string name;//书名
string author;//作者名
string publisher;//出版社
string time;//出版时间
double price;//图书价格
int count;//数量
}book;
链表每个结点的组成
typedef struct Node{
public:
book data;
struct Node* next;
};
表头
Node* creathead()
{
Node*headNode=new Node;
headNode->next=NULL;
return headNode;
}
结点
Node* creatNode(book data)
{
Node*newNode=new Node;
newNode->next=NULL;
newNode->data=data;
return newNode;
}
输入(采用尾插法)
void insertbytail(Node* headNode,book data)
{
Node*pMove=headNode;
while(pMove->next)
{
pMove=pMove->next;
}
Node*newNode=creatNode(data);
pMove->next=newNode;
}
打印
void display(Node* headNode)
{
cout<<"书号\t书名\t作者名\t出版社\t出版时间\t出版价格\t数量"<<endl;
Node*pMove=headNode->next;
while(pMove)
{
cout<<pMove->data.num<<"\t"<<pMove->data.name<<"\t"<<pMove->data.author<<"\t"<<pMove->data.publisher<<"\t"<<pMove->data.time<<"\t"<<pMove->data.price<<"\t"<<"\t"<<pMove->data.count<<endl;
pMove=pMove->next;
}
}
删除
void deleteNode(Node*headNode,string booknum)
{
Node*posleftNode=headNode;
Node*posNode=headNode->next;
while(posNode!=NULL&&posNode->data.num!=booknum)
{
posleftNode=posNode;
posNode=posleftNode->next;
}
if(posNode==NULL)
cout<<"没有您要下架的书"<<endl;
else
{
posleftNode->next=posNode->next;
delete posNode;
posNode->next=NULL;
}
}
查询
void searchbyname(Node* headNode,string bookname)
{
Node*pMove=headNode;
while(pMove!=NULL)
{
pMove=pMove->next;
if(pMove->data.name==bookname)
{
cout<<"书号\t书名\t作者名\t出版社\t出版时间\t出版价格\t数量"<<endl;
cout<<pMove->data.num<<"\t"<<pMove->data.name<<"\t"<<pMove->data.author<<"\t"<<pMove->data.publisher<<"\t"<<pMove->data.time<<"\t"<<pMove->data.price<<"\t"<<pMove->data.count<<endl;
}
}
cout<<"没有您要查找的书"<<endl;
}
void searchbynum(Node*headNode,string booknum)
{
Node*pMove=headNode;
while(pMove!=NULL&&pMove->data.num!=booknum)
{
pMove=pMove->next;
}
if(pMove==NULL)
cout<<"没有您要查找的书"<<endl;
else
{
cout<<"书号\t书名\t作者名\t出版社\t出版时间\t出版价格\t数量"<<endl;
cout<<pMove->data.num<<"\t"<<pMove->data.name<<"\t"<<pMove->data.author<<"\t"<<pMove->data.publisher<<"\t"<<pMove->data.time<<"\t"<<pMove->data.price<<"\t"<<pMove->data.count<<endl;
}
}
void searchbyauthor(Node*headNode,string bookauthor)
{
Node*pMove=headNode;
while(pMove!=NULL&&pMove->data.author!=bookauthor)
{
pMove=pMove->next;
}
if(pMove==NULL)
cout<<"没有您要查找的书"<<endl;
else
{
cout<<"书号\t书名\t作者名\t出版社\t出版时间\t出版价格\t数量"<<endl;
cout<<pMove->data.num<<"\t"<<pMove->data.name<<"\t"<<pMove->data.author<<"\t"<<pMove->data.publisher<<"\t"<<pMove->data.time<<"\t"<<pMove->data.price<<"\t"<<pMove->data.count<<endl;
}
}
文件操作
//写文件
void writefile(const char* filename,Node*headNode)
{
ofstream ofs;
ofs.open(filename,ios::out);
Node*pMove=headNode;
while(pMove!=NULL)
{
ofs<<pMove->data.num<<"\t"<<pMove->data.name<<"\t"<<pMove->data.author<<"\t"<<pMove->data.publisher<<"\t"<<pMove->data.time<<"\t"<<pMove->data.price<<"\t"<<pMove->data.count<<endl;
pMove=pMove->next;
}
ofs.close();
}
//读文件
void readfile(const char* filename,Node*headNode)
{
ifstream ifs;
ifs.open(filename, ios::in);
if (!ifs.is_open())
{
cout << "读取文件失败" << endl;
return;
}
book tempdata;
while(!ifs.eof())
{
ifs>>tempdata.num>>tempdata.name>>tempdata.author>>tempdata.publisher>>tempdata.time>>tempdata.price;
insertbytail(headNode,tempdata);
}
ifs.close();
}
菜单
{
cout << "\t\t\t***************************************************************" << endl;
cout << "\t\t\t*******************欢迎光临图书管理系统************************" << endl;
cout << "\t\t\t**************** 1.输入1 新书上架 *******************" << endl;
cout << "\t\t\t**************** 2.输入2 图书浏览 *******************" << endl;
cout << "\t\t\t**************** 3.输入3 按书号查询 *******************" << endl;
cout << "\t\t\t**************** 4.输入4 按书名查询 *******************" << endl;
cout << "\t\t\t**************** 5.输入5 按作者名查询 *******************" << endl;
cout << "\t\t\t**************** 6.输入6 图书下架 *******************" << endl;
cout << "\t\t\t**************** 7.输入7 退出程序 *******************" << endl;
cout << "\t\t\t***************************************************************" << endl;
}
选择
void keyboard()
{
int x;book data;
cin>>x;
switch (x)
{
case 1:
cout << "开始录入书籍信息" << endl;
cout<<"请依次输入书籍的书号,书名,作者名,出版社,出版时间,图书价格,数量"<<endl;
cin >> data.num;
cin >> data.name;
cin >> data.author;
cin >> data.publisher;
cin >> data.time;
cin >> data.price;
cin >> data.count;
insertbytail(list,data);
writefile("book.txt",list);
break;
case 2:
display(list);
break;
case 3:
cout << "请输入您要进行查找的图书的书号" << endl;
cin >>data.num;
searchbynum(list,data.num);
break;
case 4:
cout << "请输入您要进行查找的图书的书名" << endl;
cin >>data.name;
searchbyname(list,data.name);
break;
case 5:
cout << "请输入您要进行查找的图书的作者名" << endl;
cin >>data.author;
searchbyauthor(list,data.author);
break;
case 6:
cout << "请输入您要删除图书的书号" << endl;
cin >>data.num;
deleteNode(list,data.num);
writefile("book.txt",list);
break;
case 7:
cout<<"退出程序" <<endl;
break;
default:
cout << "您的输入有误,请重新输入" << endl;
}
}
二、所有代码
#include<iostream>
#include<cstring>
#include<stdlib.h>
#include <fstream>
using namespace std;
typedef struct book
{
string num;//书号
string name;//书名
string author;//作者名
string publisher;//出版社
string time;//出版时间
double price;//图书价格
int count;//数量
}book;
typedef struct Node{
public:
book data;
struct Node* next;
};
void menu();//菜单
void keyboard();//操作指南
Node* creathead();//表头
Node* creatNode(book data);//结点
void display(Node* headNode);//打印
void insertbytail(Node* headNode,book data);//输入
void deleteNode(Node* headNode,string booknum);//删除
void searchbynum(Node*headNode,string booknum);// 按书号查询
void searchbyname(Node* headNode,string bookname);//按书名查询t
void searchbyauthor(Node*headNode,string bookauthor);//按作者名查询
void writefile(const char* filename,Node* headNode);//写文件
void readfile(const char* filename,Node* headNode); //读文件
Node* list=NULL;
int main()
{
list=creathead();
while(1)
{
menu();
keyboard();
system("pause");
system("cls");
}
system("pause");
return 0;
}
void menu()
{
cout << "\t\t\t***************************************************************" << endl;
cout << "\t\t\t*******************欢迎光临图书管理系统************************" << endl;
cout << "\t\t\t**************** 1.输入1 新书上架 *******************" << endl;
cout << "\t\t\t**************** 2.输入2 图书浏览 *******************" << endl;
cout << "\t\t\t**************** 3.输入3 按书号查询 *******************" << endl;
cout << "\t\t\t**************** 4.输入4 按书名查询 *******************" << endl;
cout << "\t\t\t**************** 5.输入5 按作者名查询 *******************" << endl;
cout << "\t\t\t**************** 6.输入6 图书下架 *******************" << endl;
cout << "\t\t\t**************** 7.输入7 退出程序 *******************" << endl;
cout << "\t\t\t***************************************************************" << endl;
}
Node* creathead()
{
Node*headNode=new Node;
headNode->next=NULL;
return headNode;
}
Node* creatNode(book data)
{
Node*newNode=new Node;
newNode->next=NULL;
newNode->data=data;
return newNode;
}
void display(Node* headNode)
{
cout<<"书号\t书名\t作者名\t出版社\t出版时间\t出版价格\t数量"<<endl;
Node*pMove=headNode->next;
while(pMove)
{
cout<<pMove->data.num<<"\t"<<pMove->data.name<<"\t"<<pMove->data.author<<"\t"<<pMove->data.publisher<<"\t"<<pMove->data.time<<"\t"<<pMove->data.price<<"\t"<<"\t"<<pMove->data.count<<endl;
pMove=pMove->next;
}
}
void insertbytail(Node* headNode,book data)
{
Node*pMove=headNode;
while(pMove->next)
{
pMove=pMove->next;
}
Node*newNode=creatNode(data);
pMove->next=newNode;
}
void deleteNode(Node*headNode,string booknum)
{
Node*posleftNode=headNode;
Node*posNode=headNode->next;
while(posNode!=NULL&&posNode->data.num!=booknum)
{
posleftNode=posNode;
posNode=posleftNode->next;
}
if(posNode==NULL)
cout<<"没有您要下架的书"<<endl;
else
{
posleftNode->next=posNode->next;
delete posNode;
posNode->next=NULL;
}
}
void searchbyname(Node* headNode,string bookname)
{
Node*pMove=headNode;
while(pMove!=NULL)
{
pMove=pMove->next;
if(pMove->data.name==bookname)
{
cout<<"书号\t书名\t作者名\t出版社\t出版时间\t出版价格\t数量"<<endl;
cout<<pMove->data.num<<"\t"<<pMove->data.name<<"\t"<<pMove->data.author<<"\t"<<pMove->data.publisher<<"\t"<<pMove->data.time<<"\t"<<pMove->data.price<<"\t"<<pMove->data.count<<endl;
}
}
cout<<"没有您要查找的书"<<endl;
}
void searchbynum(Node*headNode,string booknum)
{
Node*pMove=headNode;
while(pMove!=NULL&&pMove->data.num!=booknum)
{
pMove=pMove->next;
}
if(pMove==NULL)
cout<<"没有您要查找的书"<<endl;
else
{
cout<<"书号\t书名\t作者名\t出版社\t出版时间\t出版价格\t数量"<<endl;
cout<<pMove->data.num<<"\t"<<pMove->data.name<<"\t"<<pMove->data.author<<"\t"<<pMove->data.publisher<<"\t"<<pMove->data.time<<"\t"<<pMove->data.price<<"\t"<<pMove->data.count<<endl;
}
}
void searchbyauthor(Node*headNode,string bookauthor)
{
Node*pMove=headNode;
while(pMove!=NULL&&pMove->data.author!=bookauthor)
{
pMove=pMove->next;
}
if(pMove==NULL)
cout<<"没有您要查找的书"<<endl;
else
{
cout<<"书号\t书名\t作者名\t出版社\t出版时间\t出版价格\t数量"<<endl;
cout<<pMove->data.num<<"\t"<<pMove->data.name<<"\t"<<pMove->data.author<<"\t"<<pMove->data.publisher<<"\t"<<pMove->data.time<<"\t"<<pMove->data.price<<"\t"<<pMove->data.count<<endl;
}
}
//文件操作
void writefile(const char* filename,Node*headNode)
{
ofstream ofs;
ofs.open(filename,ios::out);
Node*pMove=headNode;
while(pMove!=NULL)
{
ofs<<pMove->data.num<<"\t"<<pMove->data.name<<"\t"<<pMove->data.author<<"\t"<<pMove->data.publisher<<"\t"<<pMove->data.time<<"\t"<<pMove->data.price<<"\t"<<pMove->data.count<<endl;
pMove=pMove->next;
}
ofs.close();
}
void readfile(const char* filename,Node*headNode)
{
ifstream ifs;
ifs.open(filename, ios::in);
if (!ifs.is_open())
{
cout << "读取文件失败" << endl;
return;
}
book tempdata;
while(!ifs.eof())
{
ifs>>tempdata.num>>tempdata.name>>tempdata.author>>tempdata.publisher>>tempdata.time>>tempdata.price;
insertbytail(headNode,tempdata);
}
ifs.close();
}
void keyboard()
{
int x;book data;
cin>>x;
switch (x)
{
case 1:
cout << "开始录入书籍信息" << endl;
cout<<"请依次输入书籍的书号,书名,作者名,出版社,出版时间,图书价格,数量"<<endl;
cin >> data.num;
cin >> data.name;
cin >> data.author;
cin >> data.publisher;
cin >> data.time;
cin >> data.price;
cin >> data.count;
insertbytail(list,data);
writefile("book.txt",list);
break;
case 2:
display(list);
break;
case 3:
cout << "请输入您要进行查找的图书的书号" << endl;
cin >>data.num;
searchbynum(list,data.num);
break;
case 4:
cout << "请输入您要进行查找的图书的书名" << endl;
cin >>data.name;
searchbyname(list,data.name);
break;
case 5:
cout << "请输入您要进行查找的图书的作者名" << endl;
cin >>data.author;
searchbyauthor(list,data.author);
break;
case 6:
cout << "请输入您要删除图书的书号" << endl;
cin >>data.num;
deleteNode(list,data.num);
writefile("book.txt",list);
break;
case 7:
cout<<"退出程序" <<endl;
break;
default:
cout << "您的输入有误,请重新输入" << endl;
}
}