C - 尝试创建一个LinkedList指针数组

时间:2017-11-12 01:27:52

标签: c arrays pointers linked-list hashtable

我试图在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;

1 个答案:

答案 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 *,你就应该很好,并且在你完成时不要忘记释放()。