具有多个数据字段的通用列表C.

时间:2016-10-19 03:24:24

标签: c generics

我正在尝试在C中创建一个包含多个数据字段的通用链接列表

typedef struct listNode {
void *data1;
void *data2;
void *data3;
struct listNode *next;
} listNode;

我需要以格式

读取文件
name YOB  country 
john 1995 USA
Sam  1990 USA
Tim 1889 AUS

所以我的计划是让列表的每个节点存储每行的信息(我已经注意找到每列的变量类型,所以我只需键入转换指针)。例如,在第2行

typedef struct listNode {
void *data1;   //becomes a string that is john
void *data2;   //becomes a int that is 1995
void *data3;   // becomes a string that is USA
struct listNode *next;
} listNode;

我的问题首先是,即使可能,或者列表中的每个元素只能保存一种变量,就像我搜索通用列表一样,示例只有一个空数据*

我的第二个问题是我不知道该文件将包含多少列;有没有办法动态设置数据字段的数量?

//FILE HAS 5 COLUMNS
typedef struct listNode {
void *data1;
void *data2;
void *data3;
void *data4;
void *data5;
struct listNode *next;
} listNode;

//FILE HAS 2 COLUMNS
typedef struct listNode {
void *data1;
void *data2;
struct listNode *next;
} listNode;

2 个答案:

答案 0 :(得分:1)

我没有得到你的第一个问题。也许还有一些解释?

对于第二个,您需要动态分配一些东西来存储所有列,并在列表结构中,指向分配的内存。以下是一个例子:

typedef struct listNode_s {
    void **columns;
    size_t columnsCount;
    struct listNode_s *next;
} listNode;

创建列表节点时:

void **columns = malloc(sizeof(void*) * count);
for(i=0; i < count; ++i) {
    columns[i] = get_column(i);
}
listNode *node = malloc(sizeof(listNode));
node->columns = columns;
node->columnsCount = count;
//Insert the node to your list

//When freeing your node
free(node->columns);
free(node);

P.S。对数据而言,使用union + enum代替void *可能更好。

答案 1 :(得分:-1)

如果要创建一个通用列表,可以参考Linux内核的列表定义。

在include / linux / list.h