我试图在C中创建一个HashTable
,其中每个'桶'是指向LinkedList
的指针。也就是说,我需要创建一个LinkedList
指针数组。
截至目前,SomeHashTable->Buckets[i]
正在返回非指针LinkedList
。我到处都在找答案,我什么都找不到。也许我忽略了什么?我已经在下面提供了我当前的代码。
HashTable.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);
}
链接列表结构参考:
typedef struct LinkedListNode {
int data;
struct LinkedListNode *next;
struct LinkedListNode *prev;
} LinkedListNode;
typedef struct LinkedList {
struct LinkedListNode *first;
struct LinkedListNode *last;
} LinkedList;
答案 0 :(得分:0)
正如H.S。的评论所提到的,没有必要动态地 - 并且 - 静态地分配Buckets数组。
这一行:
newTable->Buckets = malloc(1009 * sizeof(LinkedList*));
正在覆盖指向静态分配数组的指针,这可能不是你想要的。对于可伸缩性,我会抛弃静态数组并坚持使用malloc()。这样你可以使用HashTable_new()的参数来指定桶数组的大小,如下所示:
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;
}
请注意,newTable-&gt; Buckets正被分配为指向LinkedList(LinkedList **)的指针。您需要跟踪Buckets []的大小,因此请将变量添加到结构中,如下所示:
typedef struct HashTable
{
int nBuckets;
LinkedList **Buckets;
} HashTable;
只要LinkedList_new()的返回类型是LinkedList *,你就应该很好,并且在你完成时不要忘记释放()。