实验一源代码

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值