c指针指针如何迭代它

时间:2015-05-29 08:33:07

标签: c pointers struct pointer-to-pointer

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

2 个答案:

答案 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;这很好,因为在释放链接列表后,无论如何它们已经变得陈旧