#include <stdlib.h>
#include <iostream>
using namespace std;
#define MAX 20
typedef struct {
int gno;
int ver;
}Gnode;
Gnode *bh(int n);
void prinGnode(Gnode *a,int n);
箱子里所装的物品
typedef struct gnode{
int gno;
指向物品
}GGnode;
typedef struct box{
int ver;
GGnode *gnext;
struct box *bnext;
}Box;
Box *OpenBox(void);
GGnode *GreatLink(int gno);
排序
物品放入箱子
处理过程
输出箱子中物品的信息
输出箱子信息
int main(void)
{
Gnode *a,*b;
Box *box;
int n=0;
cout<<"请输入物品个数:";
cin>>n;
if(n){
a=bh(n);
cout<<"排序前";
prinGnode(a,n);
b=SortGno(a,n);
cout<<"排序后";
prinGnode(b,n);
box=PackingBox(b,n);
prinBox(box,a);
free(a);
free(b);
}else{
cout<<"没有物品,不用打开箱子"<<endl;
}
return 0;
}
Gnode *bh(int n)
{
Gnode *a=(Gnode *)malloc(n*sizeof(Gnode));
for(int i=0;i<n;i++){
a[i].gno=i+1;
cout<<"请输入第"<<a[i].gno<<"个物品的体积";
cin>>a[i].ver;
}
cout<<"物品数据库创建成功!!!"<<endl;
cout<<endl;
return a;
}
void prinGnode(Gnode *a,int n)
{
cout<<"物品表输出:"<<endl;
for(int i=0;i<n;i++){
cout<<"编号:"<< a[i].gno<<","<<"体积:"<<a[i].ver<<endl;
}
cout<<endl;
}
Gnode *SortGno(Gnode *a,int n)
{
Gnode *b=(Gnode *)malloc(n*sizeof(Gnode));
Gnode t;
for(int i = 0;i < n; i++){
b[i]=a[i];
}
for(int i=0;i<n;i++){
int max;
for(int j=max=i;j<n;j++){
if(b[j].ver>b[max].ver){
max=j;
}
}
t=b[i];
b[i]=b[max];
b[max]=t;
}
return b;
}
Box *OpenBox(void)
{
Box *head;
head=(Box *)malloc(sizeof(Box));
head->ver=MAX;
head->gnext=NULL;
head->bnext=NULL;
return head;
}
GGnode *Put(int gno)
{
GGnode *gp=(GGnode *)malloc(sizeof(GGnode));
gp->gno=gno;
gp->gnext=NULL;
return gp;
}
装箱
修改箱子容量
GGnode *GreatLink(int gno)
{
GGnode *g=(GGnode *)malloc(sizeof(GGnode));
g->gno=gno;
g->gnext=NULL;
return g;
}
Box *PackingBox(Gnode *a,int n)
{
Box *head=NULL,*p,*tb;
GGnode *gp,*qg,*newg;
for(int i = 0;i < n; i++){
跑箱子
for(p=head;p&&(p->ver<a[i].ver);p=p->bnext);
if(!p){
是否超过箱子最大容量 是 箱子装不下 输出编号
if(a[i].ver > MAX){
cout<<"编号为"<<a[i].gno<<"的物品体积过大"<<endl;
continue;
}
开新箱子
p=OpenBox();
if(!head){
head=tb=p;
}
else{
cout<<1<<p;
挂链
tb->bnext=p;
cout<<2;
tb=tb->bnext;
cout<<3;
}
}
装箱
修改箱子剩余容量
p->ver-=a[i].ver;
放入物品
newg=GreatLink(a[i].gno);
for(qg=p->gnext;qg&&qg->gnext;qg=qg->gnext);
if(!qg){
p->gnext=newg;
}else{
qg->gnext=newg;
}
}
return head;
}
输出箱子中物品的信息
void prinBoxG(Box *p,Gnode *dic)
{
if(p->gnext){
cout<<"箱子中物品有:"<<endl;
for(GGnode *gp=p->gnext;gp;gp=gp->gnext){
cout<<"物品编号"<<gp->gno<<" 物品体积:"<<dic[gp->gno-1].ver<<endl;
}
}else{
cout<<"箱子中没有物品"<<endl;
}
}
输出箱子信息
void prinBox(Box *a,Gnode *dic)
{
int cnt=0;
for(Box *p=a;p;p=p->bnext){
cout<<"箱子编号:"<<++cnt<<" 箱子剩余空间为:"<<p->ver<<endl;
prinBoxG(p,dic);
cout<<endl;
}
cout<<"共打开"<<cnt<<"个箱子"<<endl;
}