题目描述:
定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据完成图书信息表的创建,然后计算所有图书的平均价格,将所有低于平均价格的图书价格提高20%,所有高于或等于平均价格的图书价格提高10%,最后逐行输出价格修改后的图书信息。
输入:
输入n+1行,前n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1行是输入结束标志:0 0 0(空格分隔的三个0)。其中书号和书名为字符串类型,价格为浮点数类型。
输出:
总计n+1行,第1行是修改前所有图书的平均价格,后n行是价格修改后n本图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。
输入样例1:
9787302257646 Data-Structure 35.00
9787302164340 Operating-System 50.00
9787302219972 Software-Engineer 32.00
9787302203513 Database-Principles 36.00
9787810827430 Discrete-Mathematics 36.00
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00
9787822234110 The-C-Programming-Language 38.00
0 0 0
输出样例1:
43.88
9787302257646 Data-Structure 42.00
9787302164340 Operating-System 55.00
9787302219972 Software-Engineer 38.40
9787302203513 Database-Principles 43.20
9787810827430 Discrete-Mathematics 43.20
9787302257800 Data-Structure 68.20
9787811234923 Compiler-Principles 68.20
9787822234110 The-C-Programming-Language 45.60
解题代码:
#include<iostream>
#include<iomanip>
using namespace std;
typedef struct {
string num; //书号
string name; //书名
double price; //书价
}Book; //定义书目类
typedef struct LNode {
Book data; //调用类
struct LNode *next; //递归创建一个与LNode结点一样的指针
int length; //链表长度
}LNode, *linklist; //定义一个LNode的指针
void InitLNode(linklist& L) { //创建链表
L = new LNode; //申请链表空间
L->next = NULL; //初始化空间
L->length = 0; //初始链表长度
return;
}
void InputLNode(linklist &L) {
string a, b;
double c;
linklist p = L; //记录L头结点的地址
while (cin>>a>>b>>c) { //循环输入数据
if (a != "0" && b != "0" && c != 0) { //判断数据是否合法
linklist q=new LNode;
q->data.num = a;
q->data.name = b;
q->data.price = c;
q->next = NULL;
//头插法
//q->next = p->next;
//p->next = q;
//尾插法
p->next = q;
p = q;
L->length++;
}
else
return;
}
}
void ModifyLNode(linklist & L) { //修改图书信息
linklist p = L;
double aver; //创建平均数变量
aver = 0; //初始化平均值
while (p->next) { //当链表存在
aver = aver + p->next->data.price; //递归加法
p = p->next; //节点后移
}
aver = aver / L->length; //计算价格平均值
cout << fixed<<setprecision(2)<<aver << endl; //限制平均值小数数位
linklist q = L; //临时节点记录链表头节点位置
while (q->next) { //当节点存在时
if (q->next->data.price < aver) { //价格小于平均值
q->next->data.price = q->next->data.price * (1 + 0.2); //将价格提升至原价的20%
}
else if (q->next->data.price >= aver) { //当节点大于平均值
q->next->data.price = q->next->data.price * (1 + 0.1); //将节点价格提升至原价的10%
}
q = q->next; //节点后移,读取后续节点信息
}
}
void OutputLNode(linklist& L) {
//cout << L->length << endl;
linklist p = L; //记录头结点的地址
while (p->next) {
cout << p->next->data.num << " " << p->next->data.name << " " <<fixed<<setprecision(2)<< p->next->data.price << endl;
p = p->next;
}
return;
}
int main() {
linklist L;
InitLNode(L);
InputLNode(L);
ModifyLNode(L);
OutputLNode(L);
}