描述
定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据完成图书信息表的创建,然后计算所有图书的平均价格,将所有低于平均价格的图书价格提高20%,所有高于或等于平均价格的图书价格提高10%,最后逐行输出价格修改后的图书信息。
输入
输入n+1行,前n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1行是输入结束标志:0 0 0(空格分隔的三个0)。其中书号和书名为字符串类型,价格为浮点数类型。
输出
总计n+1行,第1行是修改前所有图书的平均价格,后n行是价格修改后n本图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。
#include<iostream>
#include<iomanip>
using namespace std;
typedef struct book {
string id;
string name;
float money;
};
typedef struct node {
book data;
struct node* next;
}node, * linklist;
void innit(linklist& list) {
list = new node;//分配大小为node的空间
list->next = NULL;
list->data.money = 0;//头结点存放链表长度;
}
//尾插法构建单链表(有尾指针)
void creat_linklist(linklist& list) {
node* p = NULL;//插入节点
node* r;//尾指针
innit(list);//初始化链表
r = list;//尾指针指向头结点
string a, b;
float c;
cin >> a >> b >> c;
while (a != "0" && b != "0" && c != 0) {
p = new node;//分配新空间
p->data.id = a;
p->data.name = b;
p->data.money = c;
r->next = p;
r = r->next;
list->data.money++;//链表长度加一
cin >> a >> b >> c;
}
r->next = NULL;
p = NULL;//一定要先置空,再回收指针
r = NULL;
delete p;//回收指针
delete r;
}
//输出
void print(linklist list) {
node* p;
p = list;
while (p->next != NULL) {
p = p->next;
cout << p->data.id << " " << p->data.name << " " << fixed << setprecision(2) << p->data.money << endl;
}
p = NULL;
delete p;
}
//按价格降序-直接插入法215题
void jiangxu(linklist& list) {
node* p = NULL;//正待排序结点
p = new node;
p = list->next;
node* r = NULL;//在有序序列中查找 待排序结点的位置
node* f = NULL;
f = new node;
r = new node;
if (p->next != NULL)//链表不只有一个结点
p = p->next;//第二个结点
list->next->next = NULL;//已有序队列尾端置空
while (p != NULL) {
//p = p->next;
float inserting = p->data.money;//待插入图书价格
r = list->next;//搜索指针前指针
f = list;//搜索指针后指针
node* q = NULL;//临时指针
q = new node;
q = p;
p = p->next;//下一个待插图书信息
while (1) {
float inserted = r->data.money;
if (inserting > inserted) {
//头插,在inserted 前面
q->next = r;
f->next = q;
break;
}
if (inserting < inserted && r->next != NULL) { r = r->next; f = f->next; }
if (inserting == inserted || r->next == NULL) {//相等or最小,后插
q->next = r->next; r->next = q;
break;
}
}
}
}
//修改价格;216题
void price(linklist& list,float &average) {
float sum = 0;
node* p;
p = new node;
p = list;
while (p->next != NULL)//价格总和
{
sum = sum + p->next->data.money;
p = p->next;
}
average = sum / list->data.money;//平均价格
p = list;
while(p->next!=NULL)
{
p = p->next;
if (p->data.money < average) p->data.money = p->data.money * 1.2;//提高20%
else p->data.money = p->data.money * 1.1;//提高10%
}
}
int main() {
linklist list;
float average;
creat_linklist(list);//构造链表
price(list, average);//更改价格
cout <<fixed<<setprecision(2)<<average<<endl;
print(list);//输出
return 0;
}