#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef struct ComputerNode
{
int price; //该型号电脑的价格
int num; //该型号电脑的数量
ComputerNode *next; //指向下一型号电脑的指针
}ComputerNode;
//创建一个 ComputerNode
void CreateComputerNode(ComputerNode *&Computer)
{
Computer=(ComputerNode*)malloc(sizeof(ComputerNode));
Computer->next=NULL;
}
//生成n批不同价格的电脑存入一个数组中
void InfinityComputers(ComputerNode *Computers,int n)
{
int i,num,price;
ComputerNode *r,*s;
r=Computers;
srand((int)time(NULL));
for(i=0;i<n;++i) //n批
{
CreateComputerNode(s);
s->num=rand()%51+50; //每一批次的电脑数量在50-100台之间
s->price=rand()%2001+2000; //每一批次的电脑价格在2000-4000
r->next=s;
r=s;
}
r->next=NULL;
}
//打印链表的值
void OutList(ComputerNode *Computers){
ComputerNode *c;
c=Computers->next;
printf("---------------------------------\n");
printf("价格\t数量\n");
while(c!=NULL)
{
printf("%d\t%d\n",c->price,c->num);
c=c->next;
}
printf("\n");
}
//判断仓库中是否存在该价格的电脑
bool Empty(ComputerNode *Computers,int p)
{
ComputerNode *c;
c=Computers->next;
while(c!=NULL)
{
if(c->price==p) //价格存在
{
return true;
}
c=c->next;
}
return false;
}
//出库:销售m台价格为p的电脑
void DeleteComputer(ComputerNode *&Computers,int m,int p)
{
ComputerNode *c;
c=Computers->next;
while(c!=NULL)
{
if(c->price==p) //价格相等
{
if(c->num>=m) //销售的数量小于等于仓库中的数量
{
c->num=(c->num-m);
}
else
{
printf("【出库失败!】\n该价格的数量最多只能销售%d台,无法销售%d台!\n",c->num,m);
}
}
c=c->next;
}
OutList(Computers); //打印n批电脑的价格和数量
}
//入库:新到m台价格为p的电脑
void InputComputer(ComputerNode *&Computers,int m,int p)
{
ComputerNode *c1,*s;
c1=Computers->next;
if(Empty(Computers,p)) //如果新到的电脑的价格在仓库中存在
{
while(c1!=NULL)
{
if(c1->price==p) //价格相等
{
c1->num=c1->num+m;
}
c1=c1->next;
}
}
else //仓库中没有该价格的电脑
{
printf("仓库中没有该价格的电脑,新建数据元素存入库中!\n");
CreateComputerNode(s); //创建新的结点存入仓库
s->num=m;
s->price=p;
Computers->next=s;
s->next=c1;
c1=s;
}
OutList(Computers); //打印n批电脑的价格和数量
}
//盘点 电脑的总台数、总金额、最高价、最低价、平均价格
void ShowMessege(ComputerNode *Computers)
{
ComputerNode *c;
c=Computers->next;
int cout=0;
int sum=0;
int maxprice=c->price;
int minprice=c->price;
int avprice=0;
while(c!=NULL)
{
cout+=c->num;
sum+=(c->num)*(c->price);
if(maxprice<=c->price)
{
maxprice=c->price;
}
if(minprice>=c->price)
{
minprice=c->price;
}
c=c->next;
}
avprice=sum/cout;
printf("【盘点】电脑的总台数、总金额、最高价、最低价、平均价格分别为:\n%d\t%d\t%d\t%d\t%d\t\n",cout,sum,maxprice,minprice,avprice);
}
int main() {
ComputerNode *C;
CreateComputerNode(C); //初始化单链表
int n;
printf("【初始化】请输入初始化的批次:\n");
scanf("%d",&n);
InfinityComputers(C,n); //初始化n批不同价格不同数量的电脑,存储到单链表中
OutList(C); //打印n批电脑的价格和数量
int m1,p1;
printf("【出库】请输入要销售的电脑的价格及数量:\n");
scanf("%d%d",&p1,&m1);
DeleteComputer(C,m1,p1);
int m2,p2;
printf("【入库】请输入要新加的电脑的价格及数量:\n");
scanf("%d%d",&p2,&m2);
InputComputer(C,m2,p2);
ShowMessege(C);
return 0;
}