(实验)自定义数据元素的类型和存储结构(顺序表或链表均可),完成如下的功能:
①录入:从键盘输入(或从文件读入)图书信息表的各个数据元素(至少包含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;
}