0
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 は配列内にあり、リンクされたリスト内でさらに多くの hashLinks がリンクされている場合があります。ポインターへのポインターの操作方法がわかりません。tableSize は、配列内の要素の量です。各配列位置には、最初にリンクされた hashLinks がさらに存在する場合があります。

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

2 に答える 2

0

はい、これは機能しますが、ダングリング ポインターを含むハッシュテーブルになってしまいます。tableSizeまた、Joachim が指摘したように、構造体に含まれる値が正気である、つまり、エントリの数が含まれてtableおり、hashLinks が正しく割り当てられていると仮定する限り、機能します。

リンクの繰り返しは問題なく、テーブル内freeのすべてのhashLinks が正しいです。ただし、ht反復後の状態を考慮してください。の値をまったく変更しないht->table[i]ため、ループを終了した後もポインタはテーブルに格納されたままになります。テーブルを再利用したい場合は、ポインターが不要になったときにポインターを 0 に設定する必要があります。つまり、 のht->table[i] = 0後のどこかに追加しcurrent = ht->table[i];ます。

このメソッドがテーブルの「デストラクタ」の一部である場合 (つまり、 のようなメソッドhashmap_delete(...))、反復が終了した後に単純freeにハッシュマップを作成できます。つまり、 -loopfree(ht);の後に追加できforます。

于 2015-05-29T09:13:33.250 に答える