ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-06-19 22:05:25  阅读:241  来源: 互联网

标签:课程设计 LNode ln price next 信息管理系统 数据结构 data 图书


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

文章目录


前言

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

一、实验内容

设计并实现一个图书信息管理系统。根据实验要求设计该系统的菜单和交互逻辑,并编码实现增删改查的各项功能。 该系统至少包含以下功能:
(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;
}

总结

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

标签:课程设计,LNode,ln,price,next,信息管理系统,数据结构,data,图书
来源: https://blog.csdn.net/m0_52625385/article/details/118026110

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有