C-哈希表键的链接列表

时间:2019-05-03 15:52:26

标签: c linked-list hashtable

我尝试创建一个输入哈希表并返回键的链表的函数。 这是列表节点的结构:

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; 
}

2 个答案:

答案 0 :(得分:2)

列表插入逻辑中存在一个错误:

if (node != NULL) {

应该是:

if (list == NULL) {

由于此时node始终不是NULL,因为这是循环的条件,因此您实际上要检查这是否是要插入到新链接列表中的第一个条目(检查是否listNULL将实现此目标)。请注意,您还应该先检查mallocstrdup是否成功,然后再将其添加到列表,清理链接列表(释放列表中分配的部分)并返回某种错误指示(如果没有)没有足够的内存来从表创建列表。

答案 1 :(得分:0)

您在这里的情况是错误的:

// should be list == NULL instead
if ( node != NULL ) {
    list = tail = p;
}