一、代码
//装箱问题; #include<stdio.h> #include<malloc.h> #define V 10 //一个箱子所能装的最大体积; //物品信息; typedef struct { int gnum; //物品编号; int gv; //物品体积; }Goods; //物品链; typedef struct Node { int gnum; struct Node *next; //连接下一个物品; }GoodsLink; //箱子链; typedef struct Box { int bv; //箱子体积; struct Box *next; //下一个箱子; struct Node *hg; //箱子上的物品结点; }BoxLink; //物品体积降序排列; //冒泡排序法进行排序; Goods *SortGoods(Goods *g,int n) { for(int i=0;i<n-1;i++) { for(int j=0;i+j<n-1;j++) { if(g[j+1].gv>g[j].gv) { Goods t=g[j]; g[j]=g[j+1]; g[j+1]=t; } } } /* //输出降序后的物品信息; printf("降序后的箱子排列顺序为:\n"); for(i=0;i<n;i++) printf("第%d个物品体积为: %d\n",gs[i].gnum,gs[i].gv); printf("\n"); */ return g; } //装箱; BoxLink *CreateBoxLink(Goods *g,int n) { GoodsLink *pg,*qg; BoxLink *pbox,*hbox=NULL,*t; for(int i=0;i<n;i++) { //创建物品结点; pg=(GoodsLink *)malloc(sizeof(GoodsLink)); pg->gnum=g[i].gnum; pg->next=NULL; //判断是否需要创建新的箱子结点; //判断条件:箱子结点不为空&&该物品的体积大于箱子所剩余的体积; for(pbox=hbox;pbox&&(pbox->bv<g[i].gv);pbox=pbox->next); //如果没有找到合适的箱子创建箱子节点; if(!pbox) { //创建新的箱子结点; pbox=(BoxLink *)malloc(sizeof(BoxLink)); pbox->bv=V; pbox->hg=NULL; pbox->next=NULL; if(!hbox) //判断箱子链表是否为空; hbox=t=pbox; else t=t->next=pbox; } //不执行if:表示有箱子可以放的下物品; pbox->bv-=g[i].gv; //用剩余箱子体积减去当前的物品体积; if(!pbox->hg) //在当前箱子上挂物品,判断箱子上是否有物品; pbox->hg=pg; //该物品是这个箱子的第一个物品结点; else { for(qg=pbox->hg;qg->next;qg=qg->next); //找到挂物品所要挂的位置; qg->next=pg; //将物品挂在找到的结点上; } } return hbox; } //输出每个箱子所装的物品; void PrintBox(BoxLink *hbox) { int cnt=0; for(BoxLink *pbox=hbox;pbox;pbox=pbox->next) { printf("第%d个箱子所放的物品编号:",++cnt); for(GoodsLink *pg=pbox->hg;pg;pg=pg->next) printf("%2d",pg->gnum); printf("\n"); } printf("\n"); } int main(void) { int n,v; Goods *g; BoxLink *hbox; printf("请输入物品的个数:"); scanf("%d",&n); printf("\n"); g=(Goods *)malloc(n*sizeof(Goods)); //定义物品信息; //初始化物品信息; for(int i=0;i<n;i++) { printf("请输入第%d件物品体积: ",i+1); scanf("%d",&v); g[i].gv=v; g[i].gnum=i+1; } printf("\n"); g=SortGoods(g,n); //物品体积降序排列; hbox=CreateBoxLink(g,n); //装箱; PrintBox(hbox); //输出每个箱子所装的物品; return 0 ; }

2885

被折叠的 条评论
为什么被折叠?



