struct hashLink
{
KeyType key; /*the key is what you use to look up a hashLink*/
ValueType value; /*the value stored with the hashLink, an int in our case*/
struct hashLink *next; /*notice how these are like linked list nodes*/
};
struct hashMap
{
hashLink ** table; /*array of pointers to hashLinks*/
int tableSize; /*number of buckets in the table*/
int count; /*number of hashLinks in the table*/
};
我正在尝试使用hashLinks遍历hashMap。这是正确的方法吗? hashLinks在一个数组中,并且在链表中可能有更多的hashLink链接到它们。我只是不明白如何使用指针指针。 tableSize是数组中元素的数量。在每个数组位置,可能有更多的hashLink链接到第一个。
for(int i = 0; i < ht->tableSize; i ++)
{
hashLink *current;
if (ht->table[i] != 0)
{
current = ht->table[i];
while(current->next !=0)
{
hashLink *next;
next = current->next;
free(current->key);
free(current);
current = next;
}
free(current->key);
free(current);
}
else
{
continue;
}
counter++;
}
}
答案 0 :(得分:0)
是的,这确实有效,但最终会得到一个包含悬空指针的哈希表。此外,正如Joachim所指出的那样,只要您假设结构中包含的值是合理的,即tableSize
包含table
中的条目数且hashLink
具有free
已正确分配。
您对链接的迭代很好,并且表格中的所有hashLink
都是ht
。但是,请考虑迭代后ht->table[i]
的状态。您根本不更改ht->table[i] = 0
的值,因此在离开循环后,指针仍将存储在表中。如果要重用该表,则应在不再需要时将指针设置为0,即在current = ht->table[i];
之后的某处添加hashmap_delete(...)
。
如果此方法是表的“析构函数”的一部分(即某些方法,如free
),那么在完成迭代后,您可以简单地free(ht);
散列图,即添加{在for
- 循环之后{1}}。
答案 1 :(得分:0)
简化为:
for(int i=0; i < ht->tableSize; i++)
{
hashLink *current;
while (ht->table[i] != NULL) {
current = ht->table[i];
ht->table[i] = current->next;
free(current->key);
free(current);
}
}
它可以进一步简化为只有一个循环,但这是留给读者的练习......
注意:作为副作用,这会将ht-&gt; table []中的所有指针设置为NULL;这很好,因为在释放链接列表后,无论如何它们已经变得陈旧。