C 保存通用链表的哈希集

C 保存通用链表的哈希集,c,generics,hash,linked-list,void-pointers,C,Generics,Hash,Linked List,Void Pointers,这是我在课堂上做的作业的数据结构。我应该实现一个哈希集,该哈希集包含一系列链表。每个单独的链表都包含一个int。我的列表是通用的,如果它有效的话,使用如下(void*数据): typedef struct NodeStruct { void *data; struct NodeStruct* next; struct NodeStruct* prev; } NodeStruct; // Rename NodeStruct* as NodePtr type

这是我在课堂上做的作业的数据结构。我应该实现一个哈希集,该哈希集包含一系列链表。每个单独的链表都包含一个int。我的列表是通用的,如果它有效的话,使用如下(void*数据):

 typedef struct NodeStruct {
     void *data;
     struct NodeStruct* next;
     struct NodeStruct* prev;
 } NodeStruct;

 //  Rename NodeStruct* as NodePtr
 typedef NodeStruct* NodePtr;

 typedef struct ListStruct {
     int elementType;
     NodePtr first;
     NodePtr last;
     NodePtr current;
 } ListStruct;

 //  ListHndl is just a ListStruct* renamed.
第一个问题:现在,我正在使用
memcpy(list->data,data,list->elementType)
。 我在想..可以直接存储吗,比如
list->data=data

这是我的哈希集结构:

 typedef struct HashStruct {
     int size;
     int load;
     ListHndl *chain; //An array of Linked Lists.
 } HashStruct;

typedef HashStruct* HashHandle

 HashHandle new_hashset(int size) {
     HashHandle tempHash = malloc (sizeof (HashStruct));
     assert (tempHash != NULL);
     tempHash->size = size;
     tempHash->load = 0;
     tempHash->chain = malloc (sizeof (ListHndl) * size);
     assert(tempHash->chain != NULL);
     for (int i = 0; i < size; i++) {
         tempHash->chain[i] = newList(sizeof(char*));
         tempHash->chain[i]->data = malloc(sizeof (ListHndl)); // Error here
     }
     return tempHash;
 }
第二个问题:我不确定应该如何为这些链表分配内存,这可能就是我出现此错误的原因

我是否正确地实现了这个数据结构?如果需要更多信息,请告诉我。谢谢!

第一个问题:现在,我正在使用memcpy(list->data,data,list->elementType)。我在想。。可以直接存储吗,如list->data=data?

这取决于“数据”指向什么。当“data”指向从堆中分配的内存时,
list->data=data
非常常见


第二个问题:我不确定应该如何为这些链表分配内存,这可能就是我出现此错误的原因。

对于问题中概述的typedef,您需要为以下各项分配内存:

  • 每个新节点:
    newNode=malloc(sizeof(NodeStruct))
  • 每个节点负载:
    newNode->data=malloc(sizeof(int))


我是否正确实现了此数据结构?


由于提供的代码有限,很难说清楚。当然,完成指定任务的方法有很多;包括那些更容易理解的方式,以及那些专门为性能而调整的方式。

[风格提示]摆脱typedef;他们唯一的目的就是迷惑你。
hash.c: In function ‘new_hashset’:
hash.c:28:27: error: dereferencing pointer to incomplete type
         tempHash->chain[i]->data = malloc(sizeof (ListHndl));
                           ^