图书信息管理(链式)

#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