#include <stdio.h> #include <stdlib.h> #define N 6 #define V 100 typedef struct box // 使用 typedef 来为用户自定义的数据类型box取一个新的名字BOX { int no; int size; struct box* next; }BOX; // 使用访问结构的指针访问结构的成员 void init_list(BOX** H) // 声明了一个指向 BOX 类型指针的指针 *H为一级指针,&(*H)为一级指针的地址,即将一级指针的地址赋值给二级指针H *H = (BOX*)malloc(sizeof(BOX)); // H表示一级指针的地址,*H表示一级指针的值,**H表示普通变量的值,由于一级指针指向结构体BOX,故可以通过一级指针访问结构的成员 (*H)->no = 0; (*H)->size = 0; (*H)->next = NULL; } BOX* find_p(BOX* H, int volume, int v) { BOX* p = H->next; // 一开始,由于H->next为NULL,故p为空指针.第二轮,由于H->next不为空,故将p指针指向H->next指针指向的对象即(1,60,NULL) while(p!=NULL) { if(p->size+volume <= v) // 60+45>100,不执行 break; p = p->next; //第二轮,p=NULL } return p; } //让q指针指向H指针指向的对象,通过q指针访问H指针指向的对象的成员,由于H指针指向对象的成员也是一个BOX类型的指针,然后让H指针指向对象的成员next指向p指针指向的对象(1,60,NULL) void add_list_tail(BOX* H, BOX* p) // H,p均为一级指针,H指针指向(0,0,NULL),p指针指向(1,60,NULL) { BOX* tmp = H->next; // H->next为NULL,此时tmp为空指针 BOX* q = H; // q指针指向H指针指向的对象 while(tmp!=NULL) { q = tmp; tmp = tmp->next; } q->next = p; //q为一级指针,q->next表示结构体的成员,即一级指针指向p指针指向的对象,此时两个对象相连 } void print_list(BOX* H) { BOX* p = H->next; while(p!=NULL) { printf("%d:%d\n", p->no, p->size); p = p->next; } } int add_box(int volume[], int v) { int count = 0; int i; BOX* H = NULL; //定义一个Box型的指针,指针的值为NULL,即空指针 init_list(&H); for(i=0;i<N;i++) { BOX* p = find_p(H, volume[i], v); // 一级指针p指向结构体 if(p==NULL) { count++; p = (BOX*)malloc(sizeof(BOX)); p->no = count; // 通过一级指针给结构体成员赋值 1 p->size = volume[i]; // 60 p->next = NULL; //NULL,此时p指针指向(1,60,NULL)结构体,H指针指向(0,0,NULL) add_list_tail(H, p); //此时H指向的对象的成员next指向p指针指向的成员 } else { p->size += volume[i]; //第二轮,将两个数相加 } } print_list(H); return count; } int main(int argc, char *argv[]) { int ret; int volumes[] = {60, 45, 35, 20, 20, 20}; ret = add_box(volumes, V); printf("%d\n", ret); system("PAUSE"); return 0; }
装箱问题注意事项:
1、n中物品要从大到小排号序。
2、先装大的,再从大到小装小的,两个数相加不大于100即可。
3、每只箱子所装物品用链表来表示,