// main.h
/*
*/
typedef struct{
int cost;
int supplier;
}Partinfo;
typedef struct SUBASSYPART{
char partno[10];
short quan;
}subassyinfo;
/*
*/
typedef struct {
int n_parts;
subassyinfo *part;
}Subassyinfo;
/*
*/
typedef struct{
char partno[10];
int quan;
enum {PART,SUBASSY} type;
union{
Partinfo *part;
Subassyinfo *subassy;
}info;
}Invrec;
// main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "main.h"
Invrec *create_subassy_record(int n_parts);
Invrec *create_part_record(int n_partno);
void destory_subassy_record(Invrec *new_rec);
void destory_part_recored(Invrec *new_rec);
//加入析构函数
int main()
{
char b[10]={'a','b','c','d','e','f'};
Invrec* a;
a = (Invrec*)malloc(sizeof(Invrec));
if(a != NULL)
{
a = create_subassy_record(10);
a->info.subassy->part->quan=100;
a->quan=100;
memcpy(a->partno,b,sizeof(b));
memcpy(a->info.subassy->part->partno,b,sizeof(b));
}
printf("%d\r\n",a->info.subassy->n_parts);
destory_subassy_record(a);
if(a != NULL){
a = create_part_record(100);
}
printf("%d\r\n",a->info.part->cost);
destory_part_recored(a);
return 0;
}
Invrec *create_subassy_record(int n_partno)
{
Invrec *new_rec;
new_rec = (Invrec*)malloc(sizeof(Invrec));
if(new_rec != NULL){
new_rec->info.subassy = (Subassyinfo*)malloc(sizeof(Subassyinfo));
if(new_rec->info.subassy != NULL){
new_rec->type = SUBASSY;
new_rec->info.subassy->n_parts = n_partno;
new_rec->info.subassy->part = (subassyinfo*)malloc(sizeof(subassyinfo));
if(new_rec->info.subassy->part != NULL)
{
return new_rec;
}
free(new_rec->info.subassy->part);
}
free(new_rec->info.subassy);
}
free(new_rec);
return NULL;
}
void destory_subassy_record(Invrec* a)
{
if(a->type == SUBASSY)
{
free(a->info.subassy->part);
free(a->info.subassy);
free(a);
}
}
Invrec* create_part_record(int cost)
{
Invrec *new_rec;
new_rec = (Invrec*)malloc(sizeof(Invrec));
if(new_rec != NULL){
new_rec->info.part = (Partinfo*)malloc(sizeof(Partinfo));
if(new_rec->info.part != NULL)
{
new_rec->type = PART;
new_rec->info.part->cost = cost;
return new_rec;
}
free(new_rec->info.part);
}
free(new_rec);
return NULL;
}
void destory_part_recored(Invrec *a)
{
if(a->type == PART)
{
free(a->info.part);
free(a);
}
}