Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不使用结构作为链表创建地图_C - Fatal编程技术网

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

C 不使用结构作为链表创建地图,c,C,我必须为C语言中的映射创建一个结构,它包含一个char*键和void*值,这两个值在内部存储在一起。我必须为包含链接指针、键字符串和值的链表单元格分配内存,而不是将链表作为外部结构 键和值数据必须直接存储在单元格中,并且单元格必须在运行时构建。我得到了这个的开始,它将涉及一个结构,如: struct example { int count_of_list_elem; void *list; } 但我不知道如何才能使用另一个结构来形成链表 我是否需要在结构本身中创建一些单元格

我必须为C语言中的映射创建一个结构,它包含一个char*键和void*值,这两个值在内部存储在一起。我必须为包含链接指针、键字符串和值的链表单元格分配内存,而不是将链表作为外部结构

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

struct example {

    int count_of_list_elem;
    void *list;

}
但我不知道如何才能使用另一个结构来形成链表

我是否需要在结构本身中创建一些单元格,为其分配内存并向其传递三个值?我只是不确定它会如何工作


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

这是在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>);
您可以在定义结构之前声明它,以便在结构本身中引用它:

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);
}

在调用AddNewCellToList之前,您需要为键和值指定适当的存储空间。

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

struct example {
    int count_of_list_elem;
    void *list;
    struct example *next;
}
整个链表上的句柄只是指向第一个元素的指针:

struct example *head;

在创建新节点以初始化其下一个指向NULL的指针以指示其后面最初没有元素时,您需要小心。

如果您能演示如何使用void*,那会有所帮助。@marchon:我不明白为什么需要这样做。无效指针不能直接使用:它必须转换为实际类型。第一个结构是某个映射,它应该存储单元格的链接列表。我不能引用主结构中的任何结构。@marchon请解释一下原因好吗?您可以使用指向已声明但未定义的结构的指针,如上面的代码所示,而无需求助于void*。例如:typedef struct tagMyCell*单元格指针;在cell.h头文件中,以及在cell.c文件中私有保存的struct tagMyCell{}的实现中,以及映射结构中使用的cell_指针类型中,不知道它指向的内存的实际内容。