#include <iostream>
#include <cstring>
#include <windows.h>
using namespace std;
//图书信息的定义
typedef struct {
char no[8]; //8位书号
char name[20]; //书名
double price; //价格
}Book;
//链表的定义 采用链表便于删除插入
typedef struct LNode {
Book data; //数据域
struct LNode* next; //指针域
}LNode, * LinkList;
//类实现功能的操作
class LibraryMS {
private:
LNode* first; //链表头结点
public:
//无参默认构造函数构造函数
LibraryMS(){
first = new LNode();
first->next = NULL; //创建头结点
}
//有参默认构造函数构造函数
LibraryMS(Book book[], int n);
//逐个显示图书表中所有图书相关信息
void bookPrint();
//能根据指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置
void bookInsert(Book book, int n);
//根据指定的待出库的旧图书的位置,将该图书从图书表中删除;
void bookDelete(char no[]);
//能统计表中图书个数;
int bookNumber();
//实现图书信息表的图书去重;
void bookSameDelete();
//实现最爱书籍查询,根据书名进行折半查找,要求使用非递归算法实现,成功返回此书籍的书号和价格;
void bookLoveFind(char name[]);
//图书信息表按指定条件进行批量修改;
void bookModify();
//利用快速排序按照图书价格降序排序;
void bookSort();
//实现最贵图书的查找;
void bookExpensive();
};
//菜单
void Menu() {
cout << "********图书管理系统********" << endl;
cout << "****1.输出所有图书信息" << endl;
cout << "****2.插入指定位置" << endl;
cout << "****3.根据书号删除" << endl;
cout << "****4.统计书的个数" << endl;
cout << "****5.图书去重" << endl;
cout << "****6.批量修改" << endl;
cout << "****7.最爱书查找" << endl;
cout << "****8.价格排序" << endl;
cout << "****9.最贵书查找" << endl;
cout << "****10.退出" << endl;
cout << " 请输入选项: " << endl;
}
//
int Main() {
//初始化图书信息
Book book[50];
int length=0;
while (1) {
cout << "请输入书号,书名和价格(中间以空格符隔开)" << endl;
cin >> book[length].no;
cin >> book[length].name;
cin >> book[length].price;
if (strcmp(book[length].name ,"0")==0 && strcmp(book[length].no, "0") == 0 && book[length].price == 0){
cout << "录入完毕!" << endl;
Sleep(1000); //延时 显示 防止清屏
break;
}
length++;
}
//建立类的对象lib
LibraryMS lib(book, length);
//功能选择
int op;
while (1) {
system("cls");
Menu();
cin >> op;
switch (op) {
case 1:{
lib.bookPrint();
break;
}
case 2: {
cout << "请输入插入位置以及书号,书名,价格:" <<"(现有图书数量为"<<lib.bookNumber()<<")"<< endl;
Book book; int n;//插入位置
cin >> n;
while (n <= 0 && n > lib.bookNumber()) {
cout << "输入位置有误,请重新输入!" << endl;
cin >> n;
}
cout << "请输入书号:" << endl;
cin >> book.no;
cout << "请输入书名:" << endl;
cin >> book.name;
cout << "请输入价格:" << endl;
cin >> book.price;
lib.bookInsert(book,n);
break;
}
case 3:{
char no[8];
cout << "请输入书号!" << endl;
cin >> no;
lib.bookDelete(no);
break;
}
case 4: {
cout << "图书的个数为:" << ' ' << lib.bookNumber() << endl << endl;
break;
}
case 5:{
lib.bookSameDelete();
break;
}
case 6:{
lib.bookModify();
break;
}
case 7:{
char name[20];
cout << "请输入最喜爱书的名字:" << endl;
cin >> name;
lib.bookLoveFind(name);
break;
}
case 8:{
lib.bookSort();
break;
}
case 9:{
lib.bookExpensive();
break;
}
case 10:
return 0;
default:
cout << "输入数据有误,请重新输入!" << endl;
}
system("pause");
}
}
//主函数
int main() {
return Main();
}
//------------------------------------------------------------------------//类函数定义
//有参构造函数
LibraryMS::LibraryMS(Book book[], int n) {
first = new LNode();
first->next = NULL;
LNode* p = first, * r;
for (int i = 0; i < n; i++) { //尾插法初始化数据
r = new LNode();
r->data = book[i];
r->next = NULL;
p->next = r;
p = r;
}
p->next = NULL;
}
//逐个显示图书表中所有图书相关信息
void LibraryMS::bookPrint() {
LNode* p = first->next;
while (p) {
cout << p->data.no << ' ' << p->data.name << ' ' << p->data.price << endl;
p = p->next;
}
}
//能根据指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置
void LibraryMS::bookInsert(Book book, int n) {
LNode* p = first, * r;
int i = 0;
bool tag = false;
while (i < n - 1 && p) { //找到第n-1个位置
p = p->next;
i++;
}
if (!p) cout << "抱歉,入库位置非法" << endl << endl;
else {
r = new LNode();
r->data = book;
r->next = p->next;
p->next = r;
tag = true;
}
if (tag) { //判断是否插入成功
bookPrint();
cout << "插入成功!" << endl << endl;
}
}
//根据指定的待出库的旧图书的位置,将该图书从图书表中删除
void LibraryMS::bookDelete(char no[]) {
LNode* p = first, * r;
Book book;
while (p->next->data.no != no && p) { //找到第n-1个位置
p = p->next;
}
if (!p || !p->next)cout << "出库失败,未找到该图书!" << endl;
else {
r = p->next;
book = r->data;
p->next = r->next;
delete r;
bookPrint();
cout << "删除成功!" << endl << endl;
}
}
//能统计表中图书个数;
int LibraryMS::bookNumber() {
int length = 0;
LNode* p = first->next;
while (p) {
length++;
p = p->next;
}
return length;
}
//实现图书信息表的图书去重;
void LibraryMS::bookSameDelete() {
LNode* p = first->next, * r;
while (p) {
r = p->next;
while (r) {
if (strcmp(p->data.no, r->data.no) == 0)
{
LNode* s = first;
while (s->next != r)s = s->next;//找到前一个位置
s->next = r->next; //删除
r = s;//回到表上
}
r = r->next;
}
p = p->next;
}
bookPrint();
cout << "去重完成!" << endl << endl;
}
//实现最爱书籍查询,根据书名进行折半查找,要求使用非递归算法实现,成功返回此书籍的书号和价格;
void LibraryMS::bookLoveFind(char name[]) {
LNode* p = first->next;
int bookNum = 0;
Book book[20];
while (p) {
if (strcmp(p->data.name, name) == 0) {//判断书名
book[bookNum++] = p->data;
}
p = p->next;
}
if (bookNum == 0)cout << "抱歉,没有你的最爱!" << endl << endl;
else {
cout << bookNum << endl;
for (int j = 0; j < bookNum; j++) {
cout << book[j].no << ' ' << book[j].name << ' ' << book[j].price << endl;
}
cout << "查询完成!" << endl << endl;
}
}
//图书信息表按指定条件进行批量修改;
void LibraryMS::bookModify() {
double average = 0;
LNode* p = first->next;
while (p) {
average += p->data.price; //先求和
p = p->next;
}
average /= bookNumber(); //再取平均值
p = first->next; //回到第一个
while (p) {
if (p->data.price < average)p->data.price += (p->data.price * 0.2);
else p->data.price += (p->data.price * 0.1);
p = p->next;
}
bookPrint();
cout << "批量修改成功!" << endl << endl;
}
//利用快速排序按照图书价格降序排序;
void LibraryMS::bookSort() {//wrong
if (first->next == NULL)//判断链表是否为空
return;
LNode* p, * s, * t;
LNode* first1 = new LNode();
first1->next = NULL;
//先插入一个
p = first->next;
first->next = p->next;//断开
p->next = first1->next;
first1->next = p;
while (first->next) { //快速排序
p = first->next;
first->next = p->next;//断开
//找位置
t = first1->next;
while (t->data.price > p->data.price && t->next) {
t = t->next;
}
//保存t的前一个位置
s = first1;
while (s->next && s->next != t)s = s->next;
//插入
p->next = t;
s->next = p;
}
first = first1;
bookPrint();
cout << "排序完成!" << endl << endl;
}
//实现最贵图书的查找;
void LibraryMS::bookExpensive() {
LNode* p = first->next;
int bookNum = 0; double max = 0;
Book book[20];
while (p) {
if (p->data.price > max) {
max = p->data.price;
bookNum = 0; //找到更贵的 之前去掉
book[bookNum++] = p->data;
}
else if (p->data.price == max) //等于max加上
book[bookNum++] = p->data;
p = p->next;
}
if (bookNum == 0)cout << "没有图书剩余!" << endl << endl;
else {
cout << bookNum << endl;
for (int j = 0; j < bookNum; j++) {
cout << book[j].no << ' ' << book[j].name << ' ' << book[j].price << endl;
}
cout << "查找完成!" << endl << endl;
}
}
实验一源代码
最新推荐文章于 2024-09-28 09:18:19 发布