我正在尝试在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;
答案 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