【问题标题】:Creating a map without using a struct as linked list在不使用结构作为链表的情况下创建地图
【发布时间】:2014-07-14 17:27:40
【问题描述】:

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

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

struct example {

    int count_of_list_elem;
    void *list;

}

但我不知道这是如何不使用另一个结构来形成链表的?

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

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

【问题讨论】:

    标签: c


    【解决方案1】:

    这是在 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>);
    

    【讨论】:

    • 如果您可以演示使用 void*,那会有所帮助。
    • @marchon:我不明白为什么有必要这样做。 void 指针不能直接使用:它必须转换为实际类型。
    【解决方案2】:

    您可以在定义 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);
    }
    

    在调用AddNewCellToList 之前,您需要为KeyValue 分配适当的存储空间。

    【讨论】:

    • 第一个结构是一些地图,它应该存储单元格的链接列表。我不能引用主结构中的任何结构。
    • @marchon 请你解释一下为什么?您可以使用指向已声明但未定义的结构的指针,如我上面的代码所示,而无需使用void*。例如:typedef struct tagMyCell* cell_pointer; 在 cell.h 头文件中,struct tagMyCell{} 的实现私有地保存在 cell.c 文件中,并且 map 结构中使用的 cell_pointer 类型不知道它指向的内存的实际内容.
    【解决方案3】:

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

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

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

    struct example *head;
    

    在创建新节点以将其 next 指针初始化为 NULL 以指示其后(最初)没有元素时,您需要小心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多