リンクされたリストの配列としてハッシュテーブルを作成しています。現在、キーが配列のインデックスで、値が連鎖を実装するための単一リンクリストである単純なハッシュテーブルを作成しようとしています。
これは、ノードを削除するための私のコードです:
基本構造:
struct Node
{
int value;
int page;
struct Node *next;
};
int searchAndDelete(int frame,int page,int delete)
{
struct Node** iter;
iter=&hashtable[(page-1)%7];
struct Node** prev=iter;
for(;*iter;iter=&(*iter)->next)
{
if(page==((*iter)->page))
{
if(frame==((*iter)->value))
{
if(delete)
{
(*prev)->next=(*iter)->next;
free(*iter);
}
return 1;
}
}
prev=iter;
}
return 0;
}
挿入については、こちら、AddNodeをご覧ください。
ノードを削除すると、その値が 0 に変わります。ノードを検索すると、関数からの出力として 0 としてノードがプリセットされていないことが返されます。
自分のコードに考えもしなかった間違いがありますか?メモリ リークやその他の問題が残っていませんか?
編集 次のコードを削除機能に追加しました。
int searchAndDelete(int frame,int page,int delete)
{
struct Node** iter;
iter=&hashtable[(page-1)%7];
struct Node** prev=iter;
struct Node** curr=iter;
for(;*curr;curr=&(*curr)->next)
{
if(page==((*curr)->page))
{
if(frame==((*curr)->value))
{
if(delete)
{
if(curr==iter)
{
iter=(*curr)->next;
free(*curr);
}
else
{
(*prev)->next=(*curr)->next;
free(*curr);
}
}
return 1;
}
}
prev=curr;
}
return 0;
}
私が見ている問題は、初めて削除したときに要素が解放されず、値が0に設定されているが、リンクされたリストにまだ表示されていることです。2 回目の削除では、最後の要素の値がガベージになるため、比較チェックでその要素が削除されることはありません。誰かが私がここで何をしているのかを明らかにできますか?