Как я могу создать динамический массив хэш-таблицы в C - PullRequest
1 голос
/ 13 января 2012

У меня есть следующая структура записи корзины и настроенная хеш-таблица

typedef struct Hash_Entry
{
    struct Hash_Entry *next;    
    void        *key_Data;  
    unsigned    key_hash;   
    char        key[5]; 
} Hash_Entry;

typedef struct Hash_Table 
{
    struct Hash_Entry **bucketPtr;  /* Buckets in the table */
    int         size;       /* Actual size of array. */
    int         numEntries; /* Number of entries in the table. */
    int         mask;       /* Used to select bits for hashing. */
} Hash_Table;

Я хочу создать массив (или динамический массив) этого Hash_Table, чтобы, когда я чувствую, что таблица заполнена, я могусоздать другую таблицу вместо изменения ее размера

Ответы [ 2 ]

1 голос
/ 13 января 2012

Что-то вроде:

void hash_table_init(Hash_Table *table, size_t entries)
{
  size_t i;

  table->size = 0;
  table->numEntries = entries;
  table->bucketPtr = malloc(table->numEntries * sizeof *table->bucketPtr);
  for(i = 0; i < table->numEntries; i++)
    table->bucketPtr[i] = NULL;
  table->mask = 0; /* Not sure how to initialize this. */
}

Я не совсем вижу смысла оставлять начальные корзины в качестве указателей, я, вероятно, просто сделаю

typedef struct {
  ...
  Hash_Entry *buckets;
  ...
} Hash_Table;

Предполагая, что большинство контейнеров будет фактически использовано, так почему бы их не иметь. :)

1 голос
/ 13 января 2012

вы можете создать массив, используя malloc из stdlib

Hash_Table* array = (Hash_Table*)malloc(sizeof(Hash_Table) * 100);

и когда массив заполнен, вы можете сделать realloc.

Вы можете взглянуть на:

Создание массива динамического размера пользовательской структуры

...