数据结构之图书管理系统

绪论:

    昨晚看了女友老师的数据结构题目要求,觉得你们的题还是很有意思的,晚上花了两小时纯写了一下代码,救济一下18级数媒的小伙伴。因为这道题你们在网上找不到答案!老师题目要求还是比较刁钻的。


令狐助教帮你们分析分析

    答案我会贴出来,但是看你们有没有能力把它组织起来了,放在项目里执行。但答案我肯定都会写在这篇文章里。我会按我写它时的思路来介绍这个答案,希望大家从答案里学到东西。


第一文件结构创建:

我们需要在源文件创建:

  • bookmis.cpp
  • bookmis.h
  • main.cpp
  • status.h

第二打通文件脉络:

首先从main.cpp开始:

#include <iomanip>
#include "string"
#include"bookmis.h"
#include"status.h"
#include<iostream>

接着从bookmis.cpp引入:

#include"bookmis.h"
#include<iostream>
using namespace std;
void LocateBook(BookList L)
{
	Book e;
	int i;
	char n = 0;
	while (1)
	{
		std::cout << "输入1按书号查找,输入2按书名查找,输入3按作者名查找,输入4按序号查找,输入#返回上一级:" << endl;
		std::cin >> n;
		if (n == '#')
			break;
		if (n == '1')
		{
			std::cout << "请输入要查找的书号:";
			std::cin >> e.isbn;
			for (i = 0; i < L.length; i++)
			{
				if (strcmp(L.elem[i].isbn, e.isbn) == 0)
				{
					std::cout << L.elem[i].isbn << "  " << L.elem[i].name << "  " << L.elem[i].author << endl;
					break;
				}

			}
			if (i >= L.length)
				std::cout << "查无此书!请查看输入是否正确" << endl;


		}
		if (n == '2')
		{
			std::cout << "请输入要查找的书名:";
			std::cin >> e.name;
			for (i = 0; i < L.length; i++)
			{
				if (strcmp(L.elem[i].name, e.name) == 0)
				{
					std::cout << L.elem[i].isbn << "  " << L.elem[i].name << "  " << L.elem[i].author << endl;
					break;
				}


			}
			if (i >= L.length)
				std::cout << "查无此书!请查看输入是否正确" << endl;
		}
		if (n == '3')
		{
			std::cout << "请输入要查找的作者:";
			std::cin >> e.author;
			for (i = 0; i < L.length; i++)
			{
				if (strcmp(L.elem[i].author, e.author) == 0)
				{
					std::cout << L.elem[i].isbn << "  " << L.elem[i].name << "  " << L.elem[i].author << endl;
					break;
				}


			}
			if (i >= L.length)
				std::cout << "查无此书!请查看输入是否正确" << endl;
		}
		if (n == '4')
		{
			std::cout << "请输入要查找的序号:";
			std::cin >> i;
			if (i <= L.length)
			{
				std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl;


			}
			if (i > L.length)
				std::cout << "查无此书!请查看输入是否正确" << endl;
		}



	}

}

void Deletebyname(BookList &L)
{
	Book e;
	int i, j;
	char n = 0;
	while (1)
	{


		std::cout << "请输入要删除的书名:";
		std::cin >> e.name;
		for (i = 0; i < L.length; i++)
		{
			if (strcmp(L.elem[i].name, e.name) == 0)
			{
				for (j = i + 1; j <= L.length - 1; j++)
					L.elem[j - 1] = L.elem[j];
				--L.length;
				Printf(L);

			}


		}
	}

}

跟着一步走,补充头文件bookmis.h引入:

我们将在这个头文件里完成图书管理系统的表结构建设,并分别声明三个函数

  1. void LocateBook(BookList L);
  2. void Deletebyname(BookList &L);
  3. void Printf(BookList &L);

三个函数相当于图书管理系统的三个支柱,后序的功能都是靠这三个支柱完成的。


typedef struct
{
	char isbn[20];
	char name[50];
	char author[20];
	int price[100];

}Book;
typedef struct
{
	Book *elem;
	int length;

}BookList; 
void LocateBook(BookList L);
void Deletebyname(BookList &L);
void Printf(BookList &L);

再来最后一步头文件status.h的建立和引入:
建立状态标识符:

#pragma once
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 10000

这个时候我们已经建立并打通了

  • bookmis.cpp
  • bookmis.h
  • main.cpp
  • status.h

四个文件的脉络!

第三开始修建房梁

我们的主干main.cpp的房梁主要由以下几个结构构成:

int InitList(BookList &L);
int GetBook(BookList L, int i, Book &e);
int InsertBook(BookList &L, int i);
void Update(BookList &L);
void Create(BookList &L, int n);
void Printf(BookList &L);

如果说你看不懂这几个函数的功能:

那请你购买邓玉洁版的《算法与数据结构》

-------->点击购买

这是基础之基础,表建立的功能。

对应函数功能补充:

using namespace std;
void Printf(BookList &L);
int InitList(BookList &L)
{
	L.elem = new Book[MAXSIZE];
	if (!L.elem) exit(OVERFLOW);
	L.length = 0;
	return OK;
}
int GetBook(BookList L, int i, Book &e) 
{
	if (i<1 || i>L.length) return ERROR;
	e = L.elem[i - 1];
	return OK;
}

int InsertBook(BookList &L, int i) 
{
	int j = 0;
	if ((i<1) || (i > L.length + 1)) return ERROR;
	if (L.length == MAXSIZE) return ERROR;
	for (j = L.length - 1; j >= i - 1; j--)
		L.elem[j + 1] = L.elem[j];

	std::cout << "请输入书号、书名、作者" << endl;
	std::cin >> L.elem[i].isbn >> L.elem[i].name >> L.elem[i].author;
	++L.length;
	Printf(L);

	return OK;
}




void Update(BookList &L)
{
	Book e;
	int i;
	char n;
	while (1)
	{
		std::cout << "请输入要修改的书的序号 ,输入0返回上一级:";
		std::cin >> i;
		if (i == 0) break;
		else if ((i<1) || (i>L.length)) std::cout << "输入的序号不正确" << endl;
		else
		{
			std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl;
			std::cout << "请选择要修改的对象,1:书号,2:书名,3:作者 ,输入#返回上一级" << endl;
			std::cin >> n;
			if (n == '#')
				break;
			switch (n)
			{
			case '1':std::cout << "把其修改为:";
				std::cin >> L.elem[i - 1].isbn;
				std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl; break;
			case '2':std::cout << "把其修改为:";
				std::cin >> L.elem[i - 1].name;
				std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl; break;
			case '3':std::cout << "把其修改为:";
				std::cin >> L.elem[i - 1].author;
				std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl; break;
			default:break;
			}




		}
	}

}


void Create(BookList &L, int n) 
{
	int i;

	for (i = 0; i < n; i++)
	{
		std::cout << "请分别输入第" << i + 1 << "本书的书号、书名、作者" << endl;
		std::cin >> L.elem[i].isbn >> L.elem[i].name >> L.elem[i].author;

		L.length++;
	}
}
void Printf(BookList &L)
{
	int i;
	std::cout << "/---------------------  存在以下图书  ----------------------------------/" << endl;
	std::cout << "   " << setw(10) << left << "序号" << setw(10) << left << "书号" << setw(30) << left << "书名" << setw(10) << left << "作者" << endl << endl;
	for (i = 0; i<L.length; i++)
	{
		std::cout << "   " << setw(10) << left << i + 1 << setw(10) << left << L.elem[i].isbn << setw(30) << left << L.elem[i].name << setw(10) << left << L.elem[i].author << endl;
	}
	std::cout << "/-----------------------------------------------------------------------/" << endl;
}

第四主房梁main的创建

我们将在这一步实现函数的调用和菜单设计,把之前的功能进行串联。

void main()
{
	BookList L;
	Book B;
	char n[20];
	int m = 0;
	char s = 0;
	InitList(L);
	std::cout << "/------------------------欢迎进入图书管理系统---------------------------/" << endl;
	std::cout << "创建图书信息" << endl;
	std::cout << "请输入书本数目:";
	std::cin >> m;
	Create(L, m);
	Printf(L);
	while (1)
	{
		std::cout << "请选择要进行的操作 :1:查找  2: 插入  3: 删除  4:修改  0: 显示:  :" << endl;
		std::cin >> s;
		switch (s)
		{
		case '0': Printf(L); break;
		case '1': LocateBook(L); break;
		case '2': InsertBook(L, L.length); break;
		case '4': Update(L); break;
		case '3':Deletebyname(L); break;
		}
	}

	system("pause");
}

第五main.cpp代码完整版

#include <iomanip>
#include "string"
#include"bookmis.h"
#include"status.h"
#include<iostream>
using namespace std;
void Printf(BookList &L);
int InitList(BookList &L)
{
	L.elem = new Book[MAXSIZE];
	if (!L.elem) exit(OVERFLOW);
	L.length = 0;
	return OK;
}
int GetBook(BookList L, int i, Book &e) 
{
	if (i<1 || i>L.length) return ERROR;
	e = L.elem[i - 1];
	return OK;
}

int InsertBook(BookList &L, int i) 
{
	int j = 0;
	if ((i<1) || (i > L.length + 1)) return ERROR;
	if (L.length == MAXSIZE) return ERROR;
	for (j = L.length - 1; j >= i - 1; j--)
		L.elem[j + 1] = L.elem[j];

	std::cout << "请输入书号、书名、作者" << endl;
	std::cin >> L.elem[i].isbn >> L.elem[i].name >> L.elem[i].author;
	++L.length;
	Printf(L);

	return OK;
}




void Update(BookList &L)
{
	Book e;
	int i;
	char n;
	while (1)
	{
		std::cout << "请输入要修改的书的序号 ,输入0返回上一级:";
		std::cin >> i;
		if (i == 0) break;
		else if ((i<1) || (i>L.length)) std::cout << "输入的序号不正确" << endl;
		else
		{
			std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl;
			std::cout << "请选择要修改的对象,1:书号,2:书名,3:作者 ,输入#返回上一级" << endl;
			std::cin >> n;
			if (n == '#')
				break;
			switch (n)
			{
			case '1':std::cout << "把其修改为:";
				std::cin >> L.elem[i - 1].isbn;
				std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl; break;
			case '2':std::cout << "把其修改为:";
				std::cin >> L.elem[i - 1].name;
				std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl; break;
			case '3':std::cout << "把其修改为:";
				std::cin >> L.elem[i - 1].author;
				std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl; break;
			default:break;
			}




		}
	}

}


void Create(BookList &L, int n) 
{
	int i;

	for (i = 0; i < n; i++)
	{
		std::cout << "请分别输入第" << i + 1 << "本书的书号、书名、作者" << endl;
		std::cin >> L.elem[i].isbn >> L.elem[i].name >> L.elem[i].author;

		L.length++;
	}
}
void Printf(BookList &L)
{
	int i;
	std::cout << "/---------------------  存在以下图书  ----------------------------------/" << endl;
	std::cout << "   " << setw(10) << left << "序号" << setw(10) << left << "书号" << setw(30) << left << "书名" << setw(10) << left << "作者" << endl << endl;
	for (i = 0; i<L.length; i++)
	{
		std::cout << "   " << setw(10) << left << i + 1 << setw(10) << left << L.elem[i].isbn << setw(30) << left << L.elem[i].name << setw(10) << left << L.elem[i].author << endl;
	}
	std::cout << "/-----------------------------------------------------------------------/" << endl;
}
void main()
{
	BookList L;
	Book B;
	char n[20];
	int m = 0;
	char s = 0;
	InitList(L);
	std::cout << "/------------------------欢迎进入图书管理系统---------------------------/" << endl;
	std::cout << "创建图书信息" << endl;
	std::cout << "请输入书本数目:";
	std::cin >> m;
	Create(L, m);
	Printf(L);
	while (1)
	{
		std::cout << "请选择要进行的操作 :1:查找  2: 插入  3: 删除  4:修改  0: 显示:  :" << endl;
		std::cin >> s;
		switch (s)
		{
		case '0': Printf(L); break;
		case '1': LocateBook(L); break;
		case '2': InsertBook(L, L.length); break;
		case '4': Update(L); break;
		case '3':Deletebyname(L); break;
		}
	}

	system("pause");
}

第六执行结果

在这里插入图片描述
记得关注我的博客!!!挽救你们的“幸运之神”。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeLinghu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值