C-尝试创建LinkedList指针数组

C-尝试创建LinkedList指针数组,c,arrays,pointers,linked-list,hashtable,C,Arrays,Pointers,Linked List,Hashtable,我试图在C中创建一个哈希表,其中每个“bucket”都是指向链接列表的指针。也就是说,我需要创建一个LinkedList指针数组 现在,SomeHashTable->bucket[i]正在返回一个非指针LinkedList。我一直在到处寻找答案,但我什么也找不到。也许我忽略了什么?我在下面给出了我当前的代码 哈希表.h #include "LinkedList.h" typedef struct HashTable { LinkedList* Buckets[1009]; } HashTa

我试图在C中创建一个
哈希表
,其中每个“bucket”都是指向
链接列表的指针
。也就是说,我需要创建一个
LinkedList
指针数组

现在,
SomeHashTable->bucket[i]
正在返回一个非指针
LinkedList
。我一直在到处寻找答案,但我什么也找不到。也许我忽略了什么?我在下面给出了我当前的代码

哈希表.h

#include "LinkedList.h"

typedef struct HashTable
{
  LinkedList* Buckets[1009];
} HashTable;

//Creates new hashtable
HashTable* HashTable_new();

//Hashes and adds a new entry
void HashTable_add(HashTable* Table, int data);
HashTable.c

#include "HashTable.h"
HashTable* HashTable_new()
{
  HashTable* newTable = (HashTable*)malloc(sizeof(HashTable));
  newTable->Buckets = malloc(1009 * sizeof(LinkedList*));

  //Create linked lists
  for (int i = 0; i < 1009; i++)
  {
    newTable->Buckets[i] = LinkedList_new();
  }

  return newTable;
}

void HashTable_add(HashTable* Table, int data)
{
  int index = data % 1009;

  //Get bucket to hash to
  LinkedList* BucketHead = (Table->Buckets[index]);
  //Hash it iiinnnn real good
  LinkedList_add_at_end(BucketHead, data);
}

正如H.S.的评论所提到的,不需要动态地——和静态地分配bucket数组

这一行:

newTable->Buckets = malloc(1009 * sizeof(LinkedList*));
正在覆盖指向静态分配数组的指针,这可能不是您想要的。为了提高可伸缩性,我放弃了静态数组,坚持使用malloc()。这样,您就可以使用HashTable_new()的参数来指定bucket数组的大小,如下所示:

HashTable* HashTable_new(int nBuckets)
{
  HashTable* newTable = (HashTable*)malloc(sizeof(HashTable));
  newTable->Buckets = malloc(nBuckets * sizeof(LinkedList*)); 
  newTable->nBuckets = nBuckets;

  //Create linked lists
  for (int i = 0; i < nBuckets; i++)
  {
    newTable->Buckets[i] = LinkedList_new();
  }

  return newTable;
}

只要LinkedList_new()的返回类型是LinkedList*,您就应该做得很好,并且在完成后不要忘记释放()所有内容。

正如H.s.的评论所提到的,不需要动态和静态地分配bucket数组

这一行:

newTable->Buckets = malloc(1009 * sizeof(LinkedList*));
正在覆盖指向静态分配数组的指针,这可能不是您想要的。为了提高可伸缩性,我放弃了静态数组,坚持使用malloc()。这样,您就可以使用HashTable_new()的参数来指定bucket数组的大小,如下所示:

HashTable* HashTable_new(int nBuckets)
{
  HashTable* newTable = (HashTable*)malloc(sizeof(HashTable));
  newTable->Buckets = malloc(nBuckets * sizeof(LinkedList*)); 
  newTable->nBuckets = nBuckets;

  //Create linked lists
  for (int i = 0; i < nBuckets; i++)
  {
    newTable->Buckets[i] = LinkedList_new();
  }

  return newTable;
}

只要LinkedList_new()的返回类型是LinkedList*,你就应该做得很好,完成后别忘了释放它。

为什么要将内存分配给
bucket
-->newTable->bucket=malloc(1009*sizeof(LinkedList*)
bucket
已经是
1009
类型的
LinkedList*
元素的数组。这是一个很好的读物。很值得一读。耶鲁大学的另一位教授也很有帮助。此外,除非您使用桶的双链接列表有一些无法解释的目的,否则它通常是单向的(例如,单链接实现)。您在初始填充或重新散列时都不会从双链接中获益,以使负载系数低于目标(通常
.7
是可以的)为什么要将内存分配给
bucket
-->
newTable->bucket=malloc(1009*sizeof(LinkedList*))
bucket
已经是
1009
类型的
LinkedList*
元素的数组。这是一个很好的读物。很值得一读。耶鲁大学的另一位教授也很有帮助。另外,除非您使用桶的双链接列表有一些无法解释的目的,否则它通常是单向的(例如,单链接实现)。在初始填充或重新散列中,您不会从双链接中获益,以使负载系数低于目标(通常
.7
是可以的),谢谢!现在好像有用了。我想知道你为什么要把一个小男孩和一个小男孩相提并论。这些桶不应该只是指向链接列表的指针吗?不是双指针?你完全正确。我编辑了答案以反映这一点。请注意,由于malloc()返回void*,并且指针的大小通常与双指针相同,因此没有函数上的差异,因此它可以以任何方式工作。谢谢!现在好像有用了。我想知道你为什么要把一个小男孩和一个小男孩相提并论。这些桶不应该只是指向链接列表的指针吗?不是双指针?你完全正确。我编辑了答案以反映这一点。请注意,由于malloc()返回void*,并且指针的大小通常与双指针相同,因此没有函数上的差异,因此它可以以任何方式工作。