数据结构课程设计——实验一 图书信息管理系统的设计与实现

图书信息管理系统的设计与实现

文章目录


前言

本文主要阐述图书信息管理系统的设计与实现的逻辑和物理设计,主要由算法说明和伪代码组成。

一、实验内容

设计并实现一个图书信息管理系统。根据实验要求设计该系统的菜单和交互逻辑,并编码实现增删改查的各项功能。 该系统至少包含以下功能:
(1)根据指定图书个数,逐个输入图书信息;
(2)逐个显示图书表中所有图书的相关信息;
(3)能根据指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置;
(4)根据指定的待出库的旧图书的位置,将该图书从图书表中删除;
(5)能统计表中图书个数;
(6)实现图书信息表的图书去重;
(7)实现最爱书籍查询,根据书名进行折半查找,要求使用非递归算法实现,成功返回此书籍的书号和价格;
(8)图书信息表按指定条件进行批量修改;
(9)利用快速排序按照图书价格降序排序;
(10)实现最贵图书的查找;

二、程序设计

由于本实验较为简单,没有什么特别的算法说明,将主要以代码说明为主。

1.图书信息的基本结构体定义

代码如下:

typedef struct {
    string no;   //8位书号
    string name; //书名
    double price;     //价格
}Book;
//顺序表的定义:
typedef struct LNode {
    Book   data;       //数据域
    struct LNode* next;   //指针域
}LNode;
typedef  struct {
    LNode* first;     //指向数据元素的基地址
    int  length;       //线性表的当前长度   
}SqList;
//链表的定义

2.基于链式存储结构的图书信息表的创建和输出

该代码总体基于类Library实现

通过不断循环输入和创建新节点来增加新的数目
实现输入的代码如下:

Library() {
        sq.length = 0;LNode* first = new LNode; sq.first = first;
        Book book;  first->next = NULL; LNode* r =first; LNode* ln = new LNode;
        while (1) {
            ln = new LNode;
            cin >> ln->data.no >> ln->data.name >> ln->data.price;
            
            if (ln->data.no == "0" && ln->data.name == "0"&&ln->data.price==0 ) {
                break;
            }
            else {
                r->next = ln; r = ln;
                sq.length++;
            }
        }
        r->next = NULL;
    }

遍历输出所有书目
实现输出的代码如下:

void ShowBooks() {
        LNode* p = sq.first;
        cout << "书号   " << "书名   " << "价格" << endl;
        while (p->next != NULL) {
            p = p->next;
            cout << p->data.no << " " << p->data.name << " " << p->data.price << endl;
        }
    }

3.基于链式存储结构的图书信息表的修改

遍历所有书目将小于和大于平均数的分别修改为1.2和1.1倍。(不论大于小于平均数都抬高价格,奸商啊)
代码实现如下:

 void ChangePrice() {
        int average = 0; LNode* p = sq.first;
        while (p->next != NULL) {
            p = p->next;
            average = average + p->data.price;
        }
        average = average / sq.length;
        p = sq.first;
        while (p->next != NULL) {
            p = p->next;
            if (p->data.price >= average)
                p->data.price = p->data.price * 1.1;
            else p->data.price = p->data.price * 1.2;
        }
        cout << "修改价格后的书目为:" << endl;
        ShowBooks();
    }

4.基于链式存储结构的图书信息表的最贵图书的查找

读入相应的图书信息表,然后查找价格最高的图书,输出相应图书的信息。
代码实现如下:

void FindTheMostexpensive() {
        int most = 0; LNode* p = sq.first; int count = 0;
        while (p->next != NULL) {
            p = p->next;
            if (p->data.price > most)
                most = p->data.price;
        }
        p = sq.first;
        while (p->next != NULL) {
            p = p->next;
            if (p->data.price == most) 
                count++;
        }
        cout << "最贵的书共有" << count << "本" << endl;
        p = sq.first;
        while (p->next != NULL) {
            p = p->next;
            if (p->data.price == most)
                cout << p->data.no << " " << p->data.name << " " << p->data.price << endl;
        }
    }

5.基于链式存储结构的图书信息表的最爱图书的查找

读入相应的图书信息表,然后根据指定的最爱图书的名字,输出相应图书的信息。
实现的代码如下:

void FindTheBook() {
        cout << "请输入您最爱的图书的名字" << endl;
        string book;
        cin >> book;
        LNode* p = sq.first; int count = 0;
        while (p->next != NULL) {
            p = p->next;
            if (p->data.name==book)
                count++;
        }
        if (count == 0) {
            cout << "抱歉,没有你的最爱!" << endl;
            return;
        }
        cout << "您最爱的图书共有" << count << "本" << endl;
        p = sq.first;
        while (p->next != NULL) {
            p = p->next;
            if (p->data.name == book)
                cout << p->data.no << " " << p->data.name << " " << p->data.price << endl;
        }
    }

6.基于链式存储结构的图书信息表的新书入库

读入指定的待入库的新图书的位置和信息,将新图书插入到图书表中指定的位置上,最后输出新图书入库后所有图书的信息。
实现的代码如下:

void InsertBook() {
        LNode* p = sq.first; int x; LNode* ln = new LNode;
        cout << "请输入要插入图书的位置" << endl;
        cin >> x;
        if (x > sq.length + 1 || x <= 0) {
            cout << "抱歉,入库位置非法!" << endl;
            return;
        }
        cout << "请输入要插入书目的信息(以0 0 0表示输入完毕)" << endl;
        for(int i=0;i<x-1;i++)
            p = p->next;
        while (1) {
            ln = new LNode;
            cin >> ln->data.no >> ln->data.name >> ln->data.price;
            if (ln->data.no == "0" && ln->data.name == "0" && ln->data.price == 0) {
                break;
            }
            else {
                ln->next = p->next;
                p->next = ln; 
                p = ln;
                sq.length++;
            }
        }
        cout << "插入图书完成,所有图书信息为:" << endl;
        ShowBooks();
    }

7.基于链式存储结构的图书信息表的旧书出库

读入指定的待出库的旧图书的书号,将该图书从图书表中删除,最后输出旧图书出库后所有图书的信息。
实现的代码如下:

void DeleteBook() {
        LNode* p = sq.first; string s; LNode* ln = new LNode; LNode* q; bool find = 0;
        cout<< "请输入要删除书目的书号" << endl;
        cin >> s;    
        while (p->next != NULL) {
            p = p->next;
            if (p->next->data.no == s) {
                q = p->next;
                cout << "删除书目的信息如下:" << endl;
                cout << q->data.no << " " << q->data.name << " " << q->data.price << endl;
                p->next = p->next->next;
                delete q;
                sq.length--;
                find = 1;
            }
        }
        if (find == 0) {
            cout << "出库失败,未找到该图书!" << endl;
            return;
        }
        cout << "删除图书完成" << endl;
    }

8基于链式存储结构的图书信息表的图书去重

出版社出版的任何一本图书的书号(ISBN)都是唯一的,即图书表中不允许包含书号重复的图书。读入相应的图书信息表(事先加入书号重复的记录),然后进行图书的去重,即删除书号重复的图书(只留第一本),最后输出去重后所有图书的信息。
实现的代码如下:

void DeleteDuplicate() {
        cout << "将删除重复的书目" << endl;
        LNode* p = sq.first; LNode* q = sq.first; LNode* s;
        while (p->next != NULL) {
            q = p->next;
            p = p->next;
            while (q->next != NULL) {                
                if (p->data.no == q->next->data.no) {
                    s = q->next;
                    q->next = q->next->next;
                    delete s;
                    sq.length--;
                    continue;
                }
                q = q->next;
            }
        }
        cout << "去重完毕,去重后图书书目为:" << sq.length << endl;
        cout << "去重后的图书信息为:" << endl;
        ShowBooks();
    }

三、完整代码

#include <iostream>
using namespace std;
typedef struct {
    string no;   //8位书号
    string name; //书名
    double price;     //价格
}Book;
//顺序表的定义:
typedef struct LNode {
    Book   data;       //数据域
    struct LNode* next;   //指针域
}LNode;
typedef  struct {
    LNode* first;     //指向数据元素的基地址
    int  length;       //线性表的当前长度   
}SqList;
//链表的定义
class Library {
private:
    SqList sq;
public:
    void Begin() {
        char x; bool finish = 1;
        while (finish) {
            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 << "————————————————————————" << endl;
            cin >> x;
            switch (x) {
            case '1':
                ShowBooks();
                break;
            case '2':
                ChangePrice();
                break;
            case '3':
                FindTheMostexpensive();
                break;
            case '4':
                FindTheBook();
                break;
            case '5':
                InsertBook();
                break;
            case '6':
                DeleteBook();
                break;
            case '7':
                DeleteDuplicate();
                break;
            default:    
                finish = 0;
                cout << "使用结束,感谢您的使用" << endl;
            }
        }
    }
    Library(int a) {
        cout << "请输入创建图书馆的书目:" << endl;
        sq.length = 0; LNode* first = new LNode; sq.first = first;
        Book book;  first->next = NULL; LNode* r = first; LNode* ln = new LNode;
        while (1) {
            ln = new LNode;
            cin >> ln->data.no >> ln->data.name >> ln->data.price;
            if (ln->data.no == "0" && ln->data.name == "0" && ln->data.price == 0) {
                break;
            }
            else {
                r->next = ln; r = ln;
                sq.length++;
            }
        }
        r->next = NULL;
        Begin();
    }
    void ShowBooks() {
        LNode* p = sq.first;
        cout << "书号   " << "书名   " << "价格" << endl;
        while (p->next != NULL) {
            p = p->next;
            cout << p->data.no << " " << p->data.name << " " << p->data.price << endl;
        }
        cout << "————————————————————————" << endl;
    }
    void ChangePrice() {
        int average = 0; LNode* p = sq.first;
        while (p->next != NULL) {
            p = p->next;
            average = average + p->data.price;
        }
        average = average / sq.length;
        p = sq.first;
        while (p->next != NULL) {
            p = p->next;
            if (p->data.price >= average)
                p->data.price = p->data.price * 1.1;
            else p->data.price = p->data.price * 1.2;
        }
        cout << "修改价格后的书目为:" << endl;
        ShowBooks();
    }
    void FindTheMostexpensive() {
        double most = 0; LNode* p = sq.first; int count = 0;
        while (p->next != NULL) {
            p = p->next;
            if (p->data.price > most)
                most = p->data.price;
        }
        p = sq.first;
        while (p->next != NULL) {
            p = p->next;
            if (p->data.price == most)
                count++;
        }
        cout << "最贵的书共有" << count << "本" << endl;
        p = sq.first;
        while (p->next != NULL) {
            p = p->next;
            if (p->data.price == most)
                cout << p->data.no << " " << p->data.name << " " << p->data.price << endl;
        }
        cout << "————————————————————————" << endl;
    }
    void FindTheBook() {
        cout << "请输入您最爱的图书的名字" << endl;
        string book;
        cin >> book;
        LNode* p = sq.first; int count = 0;
        while (p->next != NULL) {
            p = p->next;
            if (p->data.name==book)
                count++;
        }
        if (count == 0) {
            cout << "抱歉,没有你的最爱!" << endl;
            return;
        }
        cout << "您最爱的图书共有" << count << "本" << endl;
        p = sq.first;
        while (p->next != NULL) {
            p = p->next;
            if (p->data.name == book)
                cout << p->data.no << " " << p->data.name << " " << p->data.price << endl;
        }
        cout << "————————————————————————" << endl;
    }
    void InsertBook() {
        LNode* p = sq.first; int x; LNode* ln = new LNode;
        cout << "请输入要插入图书的位置" << endl;
        cin >> x;
        if (x > sq.length + 1 || x <= 0) {
            cout << "抱歉,入库位置非法!" << endl;
            return;
        }
        cout << "请输入要插入书目的信息(以0 0 0表示输入完毕)" << endl;
        for(int i=0;i<x-1;i++)
            p = p->next;
        while (1) {
            ln = new LNode;
            cin >> ln->data.no >> ln->data.name >> ln->data.price;
            if (ln->data.no == "0" && ln->data.name == "0" && ln->data.price == 0) {
                break;
            }
            else {
                ln->next = p->next;
                p->next = ln; 
                p = ln;
                sq.length++;
            }
        }
        cout << "插入图书完成,所有图书信息为:" << endl;
        ShowBooks();
    }
    void DeleteBook() {
        LNode* p = sq.first; string s; LNode* ln = new LNode; LNode* q; bool find = 0;
        cout<< "请输入要删除书目的书号" << endl;
        cin >> s;    
        while (p->next != NULL) {
            p = p->next;
            if (p->next->data.no == s) {
                q = p->next;
                cout << "删除书目的信息如下:" << endl;
                cout << q->data.no << " " << q->data.name << " " << q->data.price << endl;
                p->next = p->next->next;
                delete q;
                sq.length--;
                find = 1;
            }
        }
        if (find == 0) {
            cout << "出库失败,未找到该图书!" << endl;
            return;
        }
        cout << "删除图书完成" << endl;
        cout << "————————————————————————" << endl;
    }
    void DeleteDuplicate() {
        cout << "将删除重复的书目" << endl;
        LNode* p = sq.first; LNode* q = sq.first; LNode* s;
        while (p->next != NULL) {
            q = p->next;
            p = p->next;
            while (q->next != NULL) {                
                if (p->data.no == q->next->data.no) {
                    s = q->next;
                    q->next = q->next->next;
                    delete s;
                    sq.length--;
                    continue;
                }
                q = q->next;
            }
        }
        cout << "去重完毕,去重后图书书目为:" << sq.length << endl;
        cout << "去重后的图书信息为:" << endl;
        ShowBooks();
    }
};
int main() {
    int a = 0;
    cout << "欢迎使用图书管理系统^_^" << endl;
    Library li(a);
    return 0;
}

总结

本次实验以链式实现,目的是提高自己对于链式存储的掌握。
以上就是图书信息管理系统的设计与实现,由于本实验确实没有特别好说明的算法,所以本文以代码实现的说明为主。
感谢您的阅读。

上一篇:22.带头结点的两个有序链表产生新的包含公共节点的链表


下一篇:14.带头结点单链表头插法逆序输出