#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、每只箱子所装物品用链表来表示,

posted on 2020-10-03 13:26  周文豪  阅读(681)  评论(0编辑  收藏  举报