同一节点中的不同结构链表 C
Different structs in the same node Linked Lists C
我的作业有点困难,想知道是否有人能为我指明正确的道路。
我想创建一个支持使用不同节点的链表,因为我需要使用不同的数据集。
目前我正在使用三个结构:
struct equipment_data {
char EquipID[4+1]; /* 4 Max */
char EquipName[31+1]; /* 31 Max */
unsigned TotalNumber;
};
struct member_data {
unsigned MemberID;
char LastName[31+1]; /* 31 Max */
char FirstName[31+1]; /* 31 Max */
};
struct loan_data {
unsigned MemberID;
char EquipID[4+1]; /* 4 Max */
unsigned Number;
};
我需要以某种方式在同一个节点中使用它。
struct ets {
struct node *equipment_data;
struct node *member_data;
struct node *loan_data;
unsigned equip_count;
unsigned member_count;
unsigned loan_count;
};
struct node {
void *data;
struct node *next;
};
看来我需要创建一个 ADT 链表。能否请你帮忙?谢谢!
我会为您需要支持的类型创建结构,然后在链表节点中使用类型指示符进行联合:
typedef struct { int a, b, c; } Type1;
typedef struct { char buf[80]; } Type2;
typedef struct { int a; float b; } Type3;
typedef union {
Type1 t1,
Type2 t2,
Type3 t3;
} Anytype;
typedef struct node {
int thistype; // 1 for type1, 2 for type2 etc.
Anytype data;
struct node *next;
} Listnode;
只需确保在每个 Listnode
中正确设置 thistype
。
Listnode *node = malloc(sizeof(Listnode));
node->thistype = 1; // example: Type1, the 3 ints
node->t1.a = 1;
node->t1.b = 2;
node->t1.c = 3;
node->next = someothernode;
您可以使用 switch
访问数据:
Listnode *node;
switch (node->thistype) {
case 1:
// do stuff with node->t1.a, node->t1.b, node->t1.c
break
case 2:
// do stuff with node->t2.buf
break;
case 3:
// do stuff with node->t3.a, node.t3.b
break
}
您可能应该创建一个指向各种结构的节点。
struct node {
struct equipment_data *eq_data; // This pointers to equipment struct
struct member_data * me_data; // ......
struct load_data * lo_data; // .....
unsigned equip_count;
unsigned member_count;
unsigned loan_count;
struct node* next_node; // this points to the next node in the
};
您可以将结构 ets 的变量放在结构节点中。
struct node {
void *data;
struct ets *var;
struct node *next;
};
现在您可以访问所有结构了。
枚举要存储的数据类型
typedef enum type{ equipment, member,loan,ets} type;
typedef struct lnk_lst
{
type data_type;
void* data;
struct lnk_lst* next;
} lnk_lst ;
初始化会像
equipment_data e1;
lnk_lst* node=(lnk_lst*)malloc(sizeof(lnk_lst));
node->data_type=equipment;
//if created dynamically
node->data=malloc(sizeof(equipment_data));
//just to point existing equipment_data
node->data=(void*)(&e1);
node->next=NULL;
评估列表会像
switch(node->data_type)
{
case equipment:
printf("%d",((equipment_data*)(node->data))->TotalNumber);
puts( ((equipment_data*)(node->data))->EquipID );
puts( ((equipment_data*)(node->data))->EquipName );
case member:
//code to read member_data
case loan:
//code to read loan_data
case ets:
//code to read ets
}
我的作业有点困难,想知道是否有人能为我指明正确的道路。
我想创建一个支持使用不同节点的链表,因为我需要使用不同的数据集。
目前我正在使用三个结构:
struct equipment_data {
char EquipID[4+1]; /* 4 Max */
char EquipName[31+1]; /* 31 Max */
unsigned TotalNumber;
};
struct member_data {
unsigned MemberID;
char LastName[31+1]; /* 31 Max */
char FirstName[31+1]; /* 31 Max */
};
struct loan_data {
unsigned MemberID;
char EquipID[4+1]; /* 4 Max */
unsigned Number;
};
我需要以某种方式在同一个节点中使用它。
struct ets {
struct node *equipment_data;
struct node *member_data;
struct node *loan_data;
unsigned equip_count;
unsigned member_count;
unsigned loan_count;
};
struct node {
void *data;
struct node *next;
};
看来我需要创建一个 ADT 链表。能否请你帮忙?谢谢!
我会为您需要支持的类型创建结构,然后在链表节点中使用类型指示符进行联合:
typedef struct { int a, b, c; } Type1;
typedef struct { char buf[80]; } Type2;
typedef struct { int a; float b; } Type3;
typedef union {
Type1 t1,
Type2 t2,
Type3 t3;
} Anytype;
typedef struct node {
int thistype; // 1 for type1, 2 for type2 etc.
Anytype data;
struct node *next;
} Listnode;
只需确保在每个 Listnode
中正确设置 thistype
。
Listnode *node = malloc(sizeof(Listnode));
node->thistype = 1; // example: Type1, the 3 ints
node->t1.a = 1;
node->t1.b = 2;
node->t1.c = 3;
node->next = someothernode;
您可以使用 switch
访问数据:
Listnode *node;
switch (node->thistype) {
case 1:
// do stuff with node->t1.a, node->t1.b, node->t1.c
break
case 2:
// do stuff with node->t2.buf
break;
case 3:
// do stuff with node->t3.a, node.t3.b
break
}
您可能应该创建一个指向各种结构的节点。
struct node {
struct equipment_data *eq_data; // This pointers to equipment struct
struct member_data * me_data; // ......
struct load_data * lo_data; // .....
unsigned equip_count;
unsigned member_count;
unsigned loan_count;
struct node* next_node; // this points to the next node in the
};
您可以将结构 ets 的变量放在结构节点中。
struct node {
void *data;
struct ets *var;
struct node *next;
};
现在您可以访问所有结构了。
枚举要存储的数据类型
typedef enum type{ equipment, member,loan,ets} type;
typedef struct lnk_lst
{
type data_type;
void* data;
struct lnk_lst* next;
} lnk_lst ;
初始化会像
equipment_data e1;
lnk_lst* node=(lnk_lst*)malloc(sizeof(lnk_lst));
node->data_type=equipment;
//if created dynamically
node->data=malloc(sizeof(equipment_data));
//just to point existing equipment_data
node->data=(void*)(&e1);
node->next=NULL;
评估列表会像
switch(node->data_type)
{
case equipment:
printf("%d",((equipment_data*)(node->data))->TotalNumber);
puts( ((equipment_data*)(node->data))->EquipID );
puts( ((equipment_data*)(node->data))->EquipName );
case member:
//code to read member_data
case loan:
//code to read loan_data
case ets:
//code to read ets
}