C - Связанный список ключей хеш-таблицы - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь создать функцию, которая вводит хеш-таблицу и возвращает связанный список ключей. Это структура узла списка:

struct hash_table_key_list_node_s {
  char *key;
  struct hash_table_key_list_node_s* next;
};

typedef struct hash_table_key_list_node_s hash_table_key_list_node_t;
typedef hash_table_key_list_node_t* hash_table_key_list_t;

Я не понимаю, почему список содержит только один элемент, а хэш-таблица содержит 330 элементов. Это код функции:

hash_table_key_list_t hash_table_keys(hash_table_t hash_table) {



hash_table_key_list_t list, tail, p;
  list = tail = NULL;

  if ( hash_table != NULL && hash_table->slots != NULL ) {

    size_t index = 0;
    while ( index < hash_table->capacity ) {

      hash_table_list_node_t *node = hash_table->slots[index].head;
      while ( node != NULL ) {

        p = malloc(sizeof(hash_table_key_list_node_t));
        p->key = strdup(node->key);

        if ( node != NULL ) {
          list = tail = p;
        }
        else { 
          tail->next = p;
          tail = p;
        }

        node = node->next;
      }

      index++;
    }
  }

  return list; 
}

1 Ответ

2 голосов
/ 03 мая 2019

В логике вставки списка есть ошибка:

if (node != NULL) {

Должно быть:

if (list == NULL) {

Поскольку node всегда не NULL на данный момент, так как это условиедля вас цикл, и вы действительно хотите проверить, является ли это первая запись, которая будет вставлена ​​в новый список ссылок (проверка, достигнет ли list NULL этого).Обратите внимание, что вы также должны проверить, успешны ли ваши malloc и strdup, прежде чем добавлять их в список, очищать список ссылок (освобождая выделенную часть списка) и возвращать какую-то индикацию ошибки, если не хватает памятисоздать список из таблицы.

...