我必须在C中为地图创建一个结构,其中包含一个内部存储在一起的char * key和void * value。我没有将链表作为外部结构,而是必须为包含链接指针,键字符串和值的链表单元格分配内存(连续)。
键和值数据必须直接存储在单元格中,并且必须在运行时构造单元格。我得到了这个涉及结构的开头:
struct example {
int count_of_list_elem;
void *list;
}
但我不知道如何可能不使用其他结构来形成链表?
我是否必须在结构本身内创建一些单元格,为其分配内存并将其传递给三个值?我只是不确定它是如何工作的。
编辑:我需要使用void *数组。
答案 0 :(得分:0)
这是在C:
中处理动态大小结构的标准方法struct example {
struct example *next; /* linked list */
int count_of_list_elem;
char data[1];
}
struct example *bigone = malloc (sizeof (struct example) + 10000);
if (!bigone)
// error
bigone -> next = NULL;
bigone -> count_of_list_elem = 10000;
memcpy (bigone -> data, <data source>);
答案 1 :(得分:0)
您可以在定义struct
之前声明它,以便您可以在结构本身中引用它:
typedef struct tagMyStruct* my_struct_pointer;
typedef struct tagMyStruct
{
char* KeyPtr;
void* ValuePtr;
my_struct_pointer NextPtr;
} my_struct;
static my_struct_pointer _listHeadPtr = NULL;
my_struct_pointer AddNewCellToList(char* keyPtr, void* valuePtr)
{
my_struct_pointer newCellPtr = malloc(sizeof(my_struct));
newCellPtr->KeyPtr = keyPtr;
newCellPtr->ValuePtr = valuePtr;
newCellPtr->NextPtr = _listHeadPtr;
_listHeadPtr = newCellPtr;
return(newCellPtr);
}
在致电Key
之前,您需要为Value
和AddNewCellToList
设置适当的存储空间。
答案 2 :(得分:0)
您可以在自己的定义中引用结构类型:
struct example {
int count_of_list_elem;
void *list;
struct example *next;
}
整个链表上的句柄只是指向第一个元素的指针:
struct example *head;
当您创建一个新节点以初始化其next
指向NULL
以指示(最初)之后没有元素时,您将需要小心。