基于链式存储结构的图书信息表的修改题⽬
描述
定义⼀个包含图书信息(书号、书名、价格)的链表,读⼊相应的图书数据完成图书信息表的创建,然后计算所有图书的平均价格,将所有低于平均价格的图书价格提⾼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;
#define MAXSIZE 10000
typedef struct
{
string no;
string name;
typedef struct LNode
{
Book data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_R(LinkList &L)
{
//尾指针rear
LinkList r;
//新节点指针p
LinkList p;
//头节点存在的意义:链表的第⼀个节点的插⼊和删除操作是⽐较特殊的,把真实顺序下的第⼀个节点空着不⽤,把它后⾯的节点作为实际利⽤的第⼀个节点,这样, //头节点初始化
L=new LNode;
//头节点(L)初始化:指向空
L->next=NULL;
//初始,尾指针指向头节点
r=L;
int i=0;
while(1)
{
//新节点指针负责创建新节点
p=new LNode;
//新节点(p)初始化:指向空
p->next=NULL;
string a,b;
double c;
cin>>a>>b>>c;
if(a=="0"&&b=="0"&&c==0) break;
p-&=a;
p->data.name=b;
p->data.price=c;
//尾指针指向的节点(r->next)指向新节点(p)
r->next=p;
//尾指针(r)指向新节点(p)
r=p;
}
}
void Show(LinkList &L)
{
LinkList p=L->next;
while(p)
{
cout<<p-&<<" "<<p->data.name<<" ";
cout<<fixed<<setprecision(2)<<p->data.price<<endl;//保存⼩数点后两位
p=p->next;
}
}
int ListLength(LinkList L)
{
/
/遍历链表⽤的指针,存放当前遍历节点的地址
LinkList p;
//头节点不⽤,所以越过头节点,使p指向第⼀个结点
//遍历链表统计的结点个数
int i=0;
while(p)
{
i++;
//使指针指向下⼀个节点(存放下⼀个节点的地址)
p=p->next;
}
return i;
}
//链表排序代码大全书籍
void Sort(LinkList &L)
{
//获取链表长度
int n=ListLength(L);
//遍历链表⽤的指针,存放当前遍历节点的地址
LinkList p;
//从头到尾,每两两⽐较完⼀轮,⼀定能在n-1-i范围内选出⼀个极⼤值,后⾯就多了⼀个确定位置的数 //n个元素要⽐较n-1轮
//i代表已经⽐好的,位于末尾的元素个数
for(int i=0;i<n-1;i++)
{
//头节点不⽤,所以越过头节点,从第⼀个结点开始
p=L->next;
//每运⾏完⼀次⼤循环,后⾯就有⼀个数确定位置,⽆需⽐较,下⼀次只需要⽐较前⾯n-1-i个即可 //⼩循环遍历次数计数器,每⽐较完⼀轮⼩循环,计数器j归零
int j=0;
while(p&&j<n-1-i)
{
//⽐较两个相邻节点数据域的⼤⼩,把⼤的放在前⾯
if(p->data.price<p->next->data.price)
{
Book t=p->data;
p->data=p->next->data;
p->next->data=t;
}
//指向下⼀节点
p=p->next;
j++;
}
}
return;
}
double Aver(LinkList &L)
{
//遍历链表⽤的指针,存放当前遍历节点的地址
LinkList p;
//头节点不⽤,所以越过头节点,从第⼀个结点开始
p=L->next;
//链表节点平均值,和
double aver=0,sum=0;
//链表节点计数
int num=0;
//求和
while(p)
{
sum=sum+p->data.price;
num++;
//求平均
aver=sum/num;
//保留两位⼩数输出
cout<<setiosflags(ios::fixed)<<setprecision(2)<<aver<<endl; return aver;
}
void Alter(LinkList &L)
{
double aver=Aver(L);
LinkList p;
p=L->next;
while(p)
{
if(p->data.price<aver)
p->data.price=1.2*p->data.price;
else if(p->data.price>=aver)
p->data.price=1.1*p->data.price;
p=p->next;
}
}
int main()
{
LinkList L;
CreateList_R(L);
Alter(L);
Show(L);
return 0;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论