北林oj216题基于链式存储结构图书信息表的修改

描述

定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据完成图书信息表的创建,然后计算所有图书的平均价格,将所有低于平均价格的图书价格提高20%,所有高于或等于平均价格的图书价格提高10%,最后逐行输出价格修改后的图书信息。

输入

输入n+1行,前n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第n+1行是输入结束标志:0 0 0(空格分隔的三个0)。其中书号和书名为字符串类型,价格为浮点数类型。

输出

总计n+1行,第1行是修改前所有图书的平均价格,后n行是价格修改后n本图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。

#include
#include
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 <

你可能感兴趣的:(北林oj,c++,数据结构,visual,studio)