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



