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

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

#include 
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;}//删除isbnlong 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;}//删除namestring 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;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部