4

ハッシュテーブルを作成しましたが、リンクリストからノードを削除したいと思います。このコードは、最初のノードを削除するためには機能しますが、他のノードを削除するためには機能しません。

void intHashTable::remove(int num){
int location = ((unsigned)num) % size;
Node * runner = table[location];
int checker;

if(runner->next == NULL){
    if(num == table[location]->num){
        table[location] = NULL;
    }
}else{
    if(table[location]->num == num){
        table[location] = table[location]->next;
    }else{
        //This part doesn't seem to be working.
        Node *temp = runner->next;
        while(temp != NULL){ 
            if(temp->num == num){
                runner->next = temp->next;
                delete(temp);
                break;
            }
        }
    }
}

}

4

2 に答える 2

2

tempループ内の次のアイテムを指すように更新していません。

temp = temp->next;

また、テーブル内のポインタで空の行を表しているように見えますがNULL、コードでこのケースを適切に処理していません。その場合、最初のチェックでアクセスしようとするとクラッシュします。また、ノードの削除に失敗する場合もあります。runnerNULLrunner->next

これらの問題を修正するには、コードを次のように更新します。

void intHashTable::remove(int num)
{
    int location = ((unsigned)num) % size;
    Node * runner = table[location];

    if (runner != NULL) {
        if (runner->num == num) {
            delete runner;
            table[location] = NULL;
        } else {
            while (runner->next != NULL) {
                if (runner->next->num == num) {
                    Node *temp = runner->next;
                    runner->next = runner->next->next;
                    delete temp;
                    break;
                }
                runner = runner->next;
            }
        }
    }
}

deleteまた、C ++キーワードであり、関数ではない括弧をから削除したことにも注意してください。

二重にリンクされたリストを使用する場合(つまり、前のポインターと次のポインターを使用する場合)、このコードを少し単純化できますが、ハッシュテーブルのように一方向にしか反復しない傾向がある場合は、おそらく価値がありません。追加のポインターの費用(64ビットシステムではアイテムごとに追加の8バイト)。

于 2013-01-24T10:53:00.910 に答える
1

ループ内の変数を更新tempしていません:runner

    while(temp != NULL)
    { 
        if(temp->num == num)
        {
            runner->next = temp->next;
            delete temp;
            break;
        }
        runner = temp;     // Keep previous element to change its next pointer when num found
        temp = temp->next; // Advance current pointer to next element
    }
于 2013-01-24T11:01:20.733 に答える