图书管理系统 链表 c++

图书信息的组成部分为:书号、书名、作者名、出版社、出版时间、价格

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;
    }
}

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值