2021-06-30

                                             简单图书信息管理系统实现代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
using namespace std;
#define getpch(type) (type*)malloc(sizeof(type))
typedef struct {
    char no[14];     //13位书号
    char name[41];  //20位书名
    double price;      //价格
}Book;
//链表的定义:
typedef struct LNode {
    Book data;            //数据域
    struct LNode *next;   //指针域
}*LinkList;
void inputBook(LinkList Head, LinkList &Rear) {     //录入图书
    LinkList test;
    char ch;
    int n = 1;
    while (true) {
        test = getpch(LNode);
        cout << "请输入第" << n << "本书的书号:";
        cin >> test->data.no;
        cout << "请输入第" << n << "本书的书名:";
        cin >> test->data.name;
        cout << "请输入第" << n << "本书的价格:";
        cin >> test->data.price;
        test->next = NULL;
        Rear->next = test;
        Rear = test;                 //尾插法
        n++;
        cout << "是否继续录入?y/n";
        cin >> ch;
        if (ch != 'y')break;
    }
}
void printBook(LinkList Head) {            //显示所有图书的信息
    LinkList p = Head->next;
    cout << "=====图书列表=====" << endl;
    while (p != NULL) {         //遍历链表,输出数据
        printf("%s%c%s%c%.2f%c", p->data.no, ' ', p->data.name, ' ', p->data.price, '\n');
        p = p->next;
    }
    cout << "0 0 0" << endl;
}
void insetBook(LinkList Head, LinkList Rear) {      //插入图书
    LinkList test, p = Head;
    char ch;
    int n, tag = 0;
    bool t = true;
    while (t) {
        cout << "请输入插入的位置:";
        cin >> n;
        if (n < 1) {
            cout << "位置错误,请重新插入!";
            continue;
        }
        for (int i = 1; i < n; i++) {
            p = p->next;
            if (p == NULL) {
                cout << "抱歉,入库位置非法!" << endl;
                p = Head;
                tag = 1;
                i = n;
            }
        }
        if (tag == 1) {     //标记位置错误,结束本次循环,开始重新插入
            tag = 0;
            continue;
        }
        test = getpch(LNode);
        cout << "请输入书号:";
        cin >> test->data.no;
        cout << "请输入书名:";
        cin >> test->data.name;
        cout << "请输入价格:";
        cin >> test->data.price;
        test->next = NULL;
        test->next = p->next;
        p->next = test;
        if (p == Rear)Rear = test;
        cout << "是否继续插入?y/n";
        cin >> ch;
        if (ch != 'y')t = false;          //输入y表示继续输入,否则结束输入
    }
}
void deleteBook(LinkList Head, LinkList Rear) {          //删除某一书号的图书
    LinkList p = Head;
    char ch;
    char num[14];
    bool t = true;
    int tag = 0;
    while (t) {
        if (p->next == NULL) {
            cout << "暂无图书,删除失败!" << endl;
            return;
        }
        cout << "请输入待删除图书的书号:";
        cin >> num;
        while (p->next != NULL) {
            if (strcmp(p->next->data.no, num) == 0) {
                tag = 1;
                if (p->next == Rear)Rear = p;
                p->next = p->next->next;
            }
            else p = p->next;
        }
        if (tag == 1) {
            tag = 0;
            printBook(Head);
        }
        else cout << "出库失败,未找到该图书!" << endl;
        cout << "是否继续删除?y/n";
        cin >> ch;
        if (ch != 'y')t = false;          //输入y表示继续删除,否则结束删除
    }
}
int numBook(LinkList Head) {             //统计数量
    LinkList p = Head->next;
    int n = 0;
    while (p != NULL) {
        n++;
        p = p->next;
    }
    cout << "当前存有" << n << "本书" << endl;
    return n;
}
void deleteRepetitionBook(LinkList Head, LinkList Rear) {       //图书去重
    LinkList p = Head->next, q;              //双指针遍历链表
    while (p) {
        q = p;
        while (q->next) {
            if (strcmp(p->data.no, q->next->data.no) == 0) {     //判断图书书名是否相同
                if (q->next == Rear)Rear = q;
                q->next = q->next->next;
            }
            else q = q->next;
        }
        p = p->next;
    }
    numBook(Head);
    printBook(Head);
}
int favoriteBook(LinkList Head) {           //按书名查找
    LinkList p = Head->next;
    int n = 0, tag = 0;
    char num[20];
    cout << "请输入最爱图书的书名:";
    cin >> num;
    while (p) {
        if (strcmp(p->data.name, num) == 0) {
            printf("%s%c%s%c%.2f%c", p->data.no, ' ', p->data.name, ' ', p->data.price, '\n');
            tag = 1;
            n++;
        }
        p = p->next;
    }
    if (tag == 0)cout << "抱歉,没有你的最爱!" << endl;
    return n;
}
void changepriceBook(LinkList Head) {         //图书信息表价格的修改
    LinkList p = Head->next;
    double allprice = 0;                   //平均价格
    while (p) {
        allprice += p->data.price;
        p = p->next;
    }
    allprice /= numBook(Head);
    p = Head->next;
    while (p) {
        if (p->data.price < allprice)p->data.price *= 1.2;   //小于平均价格价格上涨20%
        else p->data.price *= 1.1;                           //大于等于平均价格上涨10%
        p = p->next;
    }
    printBook(Head);
}
void quicksortBook(LinkList Head, LinkList Rear) {           //递归法根据价格快速排序(降序)
    if (Head == NULL || Head == Rear)         //如果头指针为空或者链表为空,直接返回  
        return;
    Book temp;
    LinkList p = Head->next;                  //用来遍历的指针  
    LinkList small = Head;
    while (p) {
        if (p->data.price > small->data.price) {      //对于小于轴的元素放在左边  
            temp = small->data;                  //交换small和p的数据项
            small->data = p->data;
            p->data = temp;
            small = small->next;
        }
        p = p->next;
    }
    quicksortBook(Head, small);
    quicksortBook(small->next, Rear);
}
void expensiveBook(LinkList Head) {             //最贵图书的查找
    LinkList p = Head->next;
    double maxprice = 0;             //最贵图书的价格
    while (p) {
        if (p->data.price > maxprice)maxprice = p->data.price;
        p = p->next;
    }
    p = Head->next;
    while (p) {
        if (p->data.price == maxprice)    //若价格与最贵价格相等则打印信息
            printf("%s%c%s%c%.2f%c", p->data.no, ' ', p->data.name, ' ', p->data.price, '\n');
        p = p->next;
    }
}
int main() {
    LinkList Head = getpch(LNode), Rear = Head;  //链表的头结点和尾结点
    Head->next = NULL;
    int ch;              //储存用户的输入
    bool t = true;         //控制程序的退出
    while (t) {
        system("cls");         //防止页面过于繁杂,执行一次清屏
        cout << "请输入要实现的功能:\n";
        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 << "11.退出系统" << endl;
        cin >> ch;
        switch (ch) {
        case 1:inputBook(Head, Rear); break;   //录入图书
        case 2:printBook(Head); break;         //显示所有图书的信息
        case 3:insetBook(Head, Rear); break;   //插入图书
        case 4:deleteBook(Head, Rear); break;  //删除某一书号的图书
        case 5:numBook(Head); break;           //统计数量
        case 6:deleteRepetitionBook(Head, Rear); break;  //图书去重
        case 7:cout << favoriteBook(Head) << endl; break;   //按书名查找
        case 8:changepriceBook(Head); break;   //图书信息表价格的修改
        case 9:quicksortBook(Head->next, Rear); printBook(Head); break;  //根据价格快速排序(降序)
        case 10:expensiveBook(Head); break;    //最贵图书的查找
        case 11:t = false; break;              //退出系统
        default:cout << "输入失败,请重新输入";  //输入失败
        }
        system("pause");
    }
    cout << "程序结束。" << endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值