不使用结构作为链表创建地图

时间:2014-07-14 17:27:40

标签: c

我必须在C中为地图创建一个结构,其中包含一个内部存储在一起的char * key和void * value。我没有将链表作为外部结构,而是必须为包含链接指针,键字符串和值的链表单元格分配内存(连续)。

键和值数据必须直接存储在单元格中,并且必须在运行时构造单元格。我得到了这个涉及结构的开头:

struct example {

    int count_of_list_elem;
    void *list;

}

但我不知道如何可能不使用其他结构来形成链表?

我是否必须在结构本身内创建一些单元格,为其分配内存并将其传递给三个值?我只是不确定它是如何工作的。

编辑:我需要使用void *数组。

3 个答案:

答案 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之前,您需要为ValueAddNewCellToList设置适当的存储空间。

答案 2 :(得分:0)

您可以在自己的定义中引用结构类型:

struct example {
    int count_of_list_elem;
    void *list;
    struct example *next;
}

整个链表上的句柄只是指向第一个元素的指针:

struct example *head;

当您创建一个新节点以初始化其next指向NULL以指示(最初)之后没有元素时,您将需要小心。