inventor.h
/************************************************************************/
/* 存货记录的声明 */
/************************************************************************/
//包含零件专用信息的结构
typedef struct{
int cost;
int supplier;
}Partinfo;//属于类型名
//存储装配件专用信息的结构
typedef struct{
int n_parts;
struct SUBASSYPART {
char partno[10];
short quan;
}*part;//*part属于参数列表,指向给结构的一个指针
}Subassyinfo;
//存储记录结构,它是一个变体记录
typedef struct {
char partno[10];
int quan;
enum {PART,SUBASSY} type;//方便删除用
//变体部分,分别指向包装零件和存储装配件的结构,通过info来访问到union部分
union {
Partinfo *part;
Subassyinfo *subassy;
}info;
}Invrec;
invcreate.cpp
/************************************************************************/
/* 用于创建装配件(SUBASSYPART)存货记录的函数
需要申请的是在堆中的内存。
在零件的结构中只需要申请结构本身的内存就可以,结构里面的是会自动创建的。
在装配件的结构中,需要申请一个数组,一个结构。
本函数主要解释了对于装配件如何申请空间。
另外函数传参赋值部分是正常的函数有的。
*/
/************************************************************************/
#include "stdlib.h"
#include "stdio.h"
#include "inventor.h"
Invrec *create_subassy_record(int n_parts){
Invrec *new_rec;
//试图为Invrec部分分配内存
new_rec = malloc(sizeof(Invrec));
if(new_rec != NULL){
//内存分配成功,现在存储
new_rec->info.subassy = malloc(sizeof(Subassyinfo));
if(new_rec->info.subassy != NULL){
//为零件获取一个足够大的数组
new_rec->info.subassy->part =
malloc(n_parts * sizeof(struct SUBASSYPART));
if(new_rec->info.subassy->part != NULL){
//获取内存,填充我们已知值的字段,然后返回
new_rec->type = SUBASSY;//赋值
new_rec->info.subassy->n_parts = n_parts;//赋值
return new_rec;
}
//内存已用完,释放我们原先分配的内存
free(new_rec->info.subassy);
}
free(new_rec);
}
}
invdelet.cpp
#include "stdlib.h"
#include "inventor.h"
void discard_inventory_record(Inverc *record){
//删除记录中的变体部分,就是在堆中的部分
switch(record->type){
case SUBASSY:
free(record->info.subassy->part);
free(record->info.subassy);
break;
case PART:
free(record->info.part);
break;
}
//删除记录的主体部分
free(record);
}