【问题标题】:Generic List C with Multiple Data Fields具有多个数据字段的通用列表 C
【发布时间】:2016-11-03 16:04:16
【问题描述】:

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

【问题讨论】:

  • 整个文件中的列数是否保持不变?
  • @Saurav Sahu 是的
  • 对于动态结构形成的答案是否定的,因为它的数据类型必须在编译时知道:Checkout stackoverflow.com/questions/6187908/…
  • @Saurav Sahu 哦,好吧,如果我知道有多少列(比如第一个示例中的 3 列),列表可以包含不同类型的变量,对吗?
  • 通常,您会在列表中使用单个void *data;,但您的三元组列表将指向具有三个字段的结构。因此:struct listNode { void *data; struct listNode *next; };struct person { char name[20]; int yob; char country[20]; }; 或附近,而管理的 void * 值将变相为 struct person *。相同的列表代码可以处理单元素、双元素、三元素、四元素、五元素......

标签: c generics


【解决方案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);

附:也许对类型使用 union + enum 而不是对数据使用 void* 会更好。

【讨论】:

  • 抱歉,这似乎是一个基本问题,但如果我的列表是 typedef struct listNode { void *data1; //变成一个字符串 john void *data2; //变成一个 1995 年的 int void *data3; // 变成一个字符串,即 USA struct listNode *next; } 列表节点; data1 可以是 int data2 可以是字符串 data3 可以是 char 还是它们都必须是相同类型的变量
  • @CrispyCashew 当然它们可以是不同的类型。结构的成员可以是任何类型,例如在我的示例中,listNode 有两个成员,第一个是指向 void* 的指针,第二个是 size_t(主要用于计数的无符号 int 类型)。
【解决方案2】:

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

include/linux/list.h

【讨论】:

    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 2011-03-27
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多