#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct book {
char no[20];
char name[50];
float price;
};
struct linkList {
book date;
linkList *next;
};
void InitList(linkList * &L) {//初始化链表;
L = new linkList;
L->next = NULL;
}
void Clean(linkList * &L) {//将链表清空;
linkList *p = L->next ,*q;
L->next = NULL;
while (p) {
q = p;
p = p->next;
delete q;
}
}
void Create(linkList * &L) {//输入0 0 0结束输入的链表创建
linkList *p=L, *q=new linkList;
cout << "输入书号 书名 书价\n";
cin >> q->date.no >> q->date.name >> q->date.price;
while (q->date.no != "0"&& q->date.name != "0"&& q->date.price != 0) {
q->next = p->next;
p->next = q;
p = q;
q = new linkList;
cin >> q->date.no >> q->date.name >> q->date.price;
}
cout << endl;
}
void Create_n(linkList * &L) {//指定要输入的图书书目的链表创建
linkList *p = L, *q;
int n;
cout << "输入图书的数目\n";
cin >> n;
cout << "输入图书的书号 书名 价格\n";
for (int i = 0; i < n; i++) {
q = new linkList;
cin >> q->date.no >> q->date.name >> q->date.price;
q->next = p->next;
p->next = q;
p = q;
}
cout << endl;
}
void Print(linkList * L) {//输出图书信息;
linkList *p = L->next;
int count = 0;
while (p) {
count++;
p = p->next;
}
cout <<"共"<< count <<"本书"<< endl;
p = L->next ;
while (p) {
printf("%s %s %.2f\n", p->date.no,p->date.name ,p->date.price);
p = p->next;
}
cout << endl;
}
void Sort(linkList * &L) {//降序输出;
Create(L);
linkList *p = L;
int count = 0;
while (p->next) {
count++;
p = p->next;
}
p = L;
for (int i = 1; i <= count - 1; i++) {//使用冒泡排序
int temp = 0;
for (int j = 1; j <= count - i; j++) {
linkList *q = p->next->next;
if (p->next->next->date.price > p->next->date.price) {
p->next->next = q->next;
q->next = p->next;
p->next = q;
temp = 1;
}
p = p->next;
}
if (temp == 0)break;
p = L;//指针回溯;
}
p = L->next;
while (p) {
printf("%s %s %.2f\n", p->date.no, p->date.name, p->date.price);
p = p->next;
}
cout << endl;
}
void Modify(linkList * &L) {//修改图书信息;
Create(L);
float count = 0, average,n=0;
linkList *p = L->next,*q=L->next;
while (p) {
count += p->date.price;
p = p->next;
n++;
}
average = count / n;//求均值
while (q) {//修改价格
if (q->date.price < average)q->date.price *= 1.2;
else q->date.price *= 1.1;
q = q->next;
}
printf("%.2f\n", average);
p = L->next;
while (p) {
printf("%s %s %.2f\n", p->date.no, p->date.name, p->date.price);
p = p->next;
}
cout << endl;
}
void Reverse(linkList * &L) {//图书逆序排列;
Create_n(L);
linkList *p = L->next;
L->next = NULL;
while (p) {//使用前插法;
linkList *q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
p = L->next ;
while (p) {
printf("%s %s %.2f\n", p->date.no, p->date.name, p->date.price);
p = p->next;
}
cout << endl;
}
void Insert(linkList * &L) {//插入新图书;
Create_n(L);
linkList *p=L,*q = new linkList;
int j = 0, m;
cout << "输入入库图书的位置\n";
cin >> m;
cout << "输入新书的书号 书名 价格\n";
cin >> q->date.no >> q->date.name >> q->date.price;
while (p &&j < m-1) {//定位;
++j;
p = p->next;
}
if (!p||j>m-1)cout << "抱歉,入库位置非法\n";
else {
q->next = p->next;
p->next = q;
p = L->next;
while (p) {
printf("%s %s %.2f\n", p->date.no, p->date.name, p->date.price);
p = p->next;
}
}
cout << endl;
}
void Delete(linkList * &L) {//删除旧图书;
Create_n(L);
linkList *p = L, *q;
int j = 0,m;
cout << "输入要删除的图书序号\n";
cin >> m;
while (p->next &&j < m - 1) {
++j;
p = p->next;
}
if (!p->next || j > m - 1)cout << "抱歉,出库位置非法\n";
else {
q = p->next;
p->next = q->next ;
delete q;
p = L->next ;
while (p) {
printf("%s %s %.2f\n", p->date.no, p->date.name, p->date.price);
p = p->next;
}
}
cout << endl;
}
void Remove_same(linkList * &L) {//图书去重;
Create_n(L);
linkList *p =L, *q,*k;
while (p->next) {
q = p->next;
while (q->next ) {
if (strcmp(p->next->date.no, q->next->date.no) == 0) {
k=q->next;
q->next = k->next;
delete k;
}
q = q->next;
if (q == NULL)break;//如果最后一个结点被删除则q->next提前变成了NULL,
} //故q=q->next之后q=NULL,不能再判断q->NULL;
p = p->next;
}
Print(L);
}
---------------------------------------------
int main() {
linkList *L;
InitList(L);
cout << " Welcome To The Library\n\n\n"
<< "请输入您需要进行的操作序号,输入0结束操作\n"
<< "1:创建并输出书籍信息\n"
<< "2:创建后按价格降序排列后输出书籍信息\n"
<< "3:创建和修改并输出修改后的书籍信息\n"
<< "4:创建并逆序输出书籍信息\n"
<< "5:创建后再插入新书并输出插入后的书籍信息\n"
<< "6:创建后删除指定旧书并输出删除后的书籍信息\n"
<< "7:创建后删除书号重复的书籍,保留重复书籍第一本,输出书籍信息\n\n";
int operate;
while (cin >> operate, operate != 0)
switch (operate) {
case 1:Create(L); Print(L); Clean(L); break;
case 2:Sort(L); Clean(L); break;
case 3:Modify(L); Clean(L); break;
case 4:Reverse(L); Clean(L); break;
case 5:Insert(L); Clean(L); break;
case 6:Delete(L); Clean(L); break;
case 7:Remove_same(L); Clean(L); break;
default:cout << "操作序号输入错误\n";
}
return 0;
}
图书信息管理(链式)
猜你喜欢
转载自blog.csdn.net/qq_41033241/article/details/79872554
今日推荐
周排行