数据结构实验-图书信息表

(实验)自定义数据元素的类型和存储结构(顺序表或链表均可),完成如下的功能:
①录入:从键盘输入(或从文件读入)图书信息表的各个数据元素(至少包含isbn号,书名,作者,价格,出版社);
②查找:可按isbn号,书名查找图书,找到后输出图书的完整信息。
③插入:在表中第i个元素前插入新的图书;
④删除:按照序号、isbn号删除指定图书,删除前需用户再次确认。
⑤输出:输出所有图书信息;
⑥排序:可按某属性对所有图书进行排序。

#include <iostream>
using namespace std;
//图书信息结构体
struct Book {
    int id;            //序列
    long isbn;        //isbn号
    string name;      //书名
    string author;      //作者
    int price;        //价格
    string press;   //出版社
};

//单链表的存储结构
typedef struct LNode {
    Book data;           //节点的数据项
    struct LNode* next;     //节点的指针域
}LNode, * LinkList;           //LinkList为指向结构体LNode的指针类型

//单链表的初始化
LinkList InitList(LinkList& L) {
    L = new LNode;          //生成头结点
    L->next = NULL;         //头结点的指针域置为空
    return L;
}

//单链表的创建
int CreatList(LinkList& L, int n) {
    L->next = NULL;
    int a = 0;
    char s = 'y';
    while (s != 'n')
    {
        LNode* p = new LNode;
        p->data.id = ++n;
        a = n;//isbn号,书名,作者,价格,出版社
        cout << "序列:" << n << endl;
        cout << "isbn号:" << endl;
        cin >> p->data.isbn;
        cout << "书名:" << endl;
        cin >> p->data.name;
        cout << "作者:" << endl;
        cin >> p->data.author;
        cout << "价格:" << endl;
        cin >> p->data.price;
        cout << "出版社:" << endl;
        cin >> p->data.press;
        p->next = L->next;
        L->next = p;
        cout << "是否要继续添加  y或n" << endl;
        cin >> s;
    }
    return a;
}


//取链表中的值
LNode* GetBook(LinkList L, int i) {
    LinkList p = L;
    int j = 0;
    while (p && j <= i)
    {
        p = p->next;
        ++j;
    }
    return p;
}

//根据ibsn号查找
LNode* queryById(LinkList L, long qisbn) {
    LinkList p = L->next;
    while (p && p->data.isbn != qisbn)
    {
        p = p->next;
    }
    if (!p)
    {
        cout << "查无此书!";
        p = NULL;
    }
    return p;
}

//根据书名查找
LNode* queryByName(LinkList L, string qname) {
    LinkList p = L->next;
    while (p && p->data.name != qname)
    {
        p = p->next;
    }
    if (!p)
    {
        cout << "查无此书!";
        p = NULL;
    }
    return p;
}


//插入新的书籍信息
bool addStudent(LinkList& L, int i, Book e,int n) {
    LinkList p = L;
    int j = 0;
    while (p && (j < i - 1))
    {
        p = p->next;
        ++j;
    }
    if (!p || i <= 0)
    {
        cout << "插入失败!";
        return false;
    }
    LNode* s = new LNode;
    s->data = e;
    s->next = p->next;
    p->next = s;

    return true;
}

//删除对应isbn号的书籍信息
bool DeleteBook(LinkList& L, long deleteId) {
    LNode* p = GetBook(L, queryById(L, deleteId)->data.id-1);
    LNode* q = new LNode;

    q = p->next;
    p->next = q->next;
    delete q;

    return true;
}

//删除对应书名的书籍信息
bool DeleteByName(LinkList& L, string deletename) {
    LNode* p = GetBook(L, queryByName(L, deletename)->data.id-1);
    LNode* q = new LNode;
    q = p->next;
    p->next = q->next;
    delete q;
    return true;
}

void Sort(LinkList L) { //采用头插法
    LNode* p = L->next, * pre;
    LNode* r = p->next;
    p->next = NULL;
    p = r;
    while (p != NULL) {
        r = p->next;
        pre = L;
        while (pre->next != NULL && pre->next->data.isbn < p->data.isbn) {
            pre = pre->next;
        }
        p->next = pre->next;
        pre->next = p;
        p = r;
    }
}


int main() {

    //新建
    LinkList L;
    L = InitList(L);
    int num = 0;
    num = CreatList(L, num);
    cout << num;

    //输出
    cout << "输出所有书籍" << endl;
    for (int i = 0; i < num; i++)
    {
        Book q = GetBook(L, i)->data;
        cout << "序列:" << q.id << endl;
        cout << "isbn号:" << q.isbn << endl;
        cout << "书名:" << q.name << endl;
        cout << "作者:" << q.author << endl;
        cout << "价格:" << q.price << endl;
        cout << "出版社:" << q.press << endl;
    }
    
    //查找
    cout << "按isbn号查找图书的完整信息" << endl;
    cout << "请输入isbn号" << endl;
    int qisbn;
    cin >> qisbn;
    Book s = queryById(L, qisbn)->data;
    cout << "序列:" << s.id << endl;
    cout << "isbn号:" << s.isbn << endl;
    cout << "书名:" << s.name << endl;
    cout << "作者:" << s.author << endl;
    cout << "价格:" << s.price << endl;
    cout << "出版社:" << s.press << endl;


    //查找
    cout << "按书名查找图书的完整信息" << endl;
    cout << "请输入书名" << endl;
    string qname;
    cin >> qname;
    Book b = queryByName(L, qname)->data;
    cout << "序列:" << b.id << endl;
    cout << "isbn号:" << b.isbn << endl;
    cout << "书名:" << b.name << endl;
    cout << "作者:" << b.author << endl;
    cout << "价格:" << b.price << endl;
    cout << "出版社:" << b.press << endl;

    //插入
    cout << "在表中第i个元素前插入新的书籍信息" << endl;
    cout << "请输入要插入的书籍信息" << endl;
    Book s1;

    s1.id = ++num;
    cout << "序列:" << s1.id << endl;
    cout << "isbn号:" << endl;
    cin >> s1.isbn;
    cout << "书名:" << endl;
    cin >> s1.name;
    cout << "作者:" << endl;
    cin >> s1.author;
    cout << "价格:" << endl;
    cin >> s1.price;
    cout << "出版社:" << endl;
    cin >> s1.press;

    bool add = false;
    int n;
    while (add == false)
    {
        cout << "请输入要在第几个插入" << endl;
        cin >> n;
        add = addStudent(L, n, s1,num);
        if (add == false)
        {
            cout << "插入失败!请重新在表中第i个元素前插入新的图书信息" << endl;
        }
    }
    cout << "插入成功!" << endl;





    //输出
    cout << "输出所有书籍" << endl;
    for (int i = 0; i < num; i++)
    {
        Book q1 = GetBook(L, i)->data;
        cout << "序列:" << q1.id << endl;
        cout << "isbn号:" << q1.isbn << endl;
        cout << "书名:" << q1.name << endl;
        cout << "作者:" << q1.author << endl;
        cout << "价格:" << q1.price << endl;
        cout << "出版社:" << q1.press << endl;
    }

    //删除isbn
    long deleteId;
    bool del = false;
    while (del == false)
    {
        cout << "请输入要删除的图书的isbn号" << endl;
        cin >> deleteId;
        del = DeleteBook(L, deleteId);
        if (del == false)
        {
            cout << "删除失败!请重新输入要删除的图书的isbn号" << endl;
        }
    }
    cout << "删除成功!" << endl;
    num--;

    //输出
    cout << "输出所有书籍" << endl;
    for (int i = 0; i < num; i++)
    {
        Book q2 = GetBook(L, i)->data;
        cout << "序列:" << q2.id << endl;
        cout << "isbn号:" << q2.isbn << endl;
        cout << "书名:" << q2.name << endl;
        cout << "作者:" << q2.author << endl;
        cout << "价格:" << q2.price << endl;
        cout << "出版社:" << q2.press << endl;
    }

    //删除name
    string deleteName;
    bool del2 = false;
    while (del2 == false)
    {
        cout << "请输入要删除的图书的名字" << endl;
        cin >> deleteName;
        del2 = DeleteByName(L, deleteName);
        if (del2 == false)
        {
            cout << "删除失败!请重新输入要删除的图书的isbn号" << endl;
        }
    }
    cout << "删除成功!" << endl;
    num--;

    Sort(L);

    //输出
    cout << "输出所有书籍" << endl;
    for (int i = 0; i < num; i++)
    {
        Book q3 = GetBook(L, i)->data;
        cout << "序列:" << q3.id << endl;
        cout << "isbn号:" << q3.isbn << endl;
        cout << "书名:" << q3.name << endl;
        cout << "作者:" << q3.author << endl;
        cout << "价格:" << q3.price << endl;
        cout << "出版社:" << q3.press << endl;
    }
    return 1;
}
  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值