同一节点中的不同结构链表 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
 }