#pragma once
#include <iostream>
#define N 10
using namespace std;
typedef struct node
{
int val;
struct node *next;
}Node;
void freeLinklist(Node *&head);
void freeLinklist(Node *&head)
{
if (head==NULL)
{
return;
}
if (head->next==NULL)
{
delete head;
head=NULL;
return;
}
Node *pre=head;
Node *temp=head->next;
while(temp->next!=NULL)
{ delete pre;
pre=temp;
temp=temp->next;
}
delete pre;
head=NULL;
};
class Hash
{
public:
Hash()
{
for(int i=0;i<N;i++)
{
hashTable[i]=NULL;
}
};
~Hash()
{
for (int i=0;i<N;i++)
{
freeLinklist(hashTable[i]);
}
};
Node* find(int val)
{
int index=val%N;
Node *head=hashTable[index];
if (head!=NULL)
{
while(head->next!=NULL&&head->val!=val)
{
head=head->next;
}
if (head->val==val)
{
return head;
}
return NULL;
}
return NULL;
};
Node* insert(int val)
{
int index=val%N;
Node *head=hashTable[index];
if (head!=NULL)
{
while(head->next!=NULL)
{
head=head->next;
}
head->next=new Node;
head->next->val=val;
head->next->next=NULL;
return head->next;
}
head=new Node;
head->next=NULL;
head->val=val;
hashTable[index]=head;
return head;
};
void print()
{
for (int i=0;i<N;i++)
{
Node *head=hashTable[i];
if(head==NULL)
{
cout<<endl;
continue;
}
while(head->next!=NULL)
{
cout<<head->val<<"\t";
head=head->next;
}
cout<<head->val<<endl;
cout<<endl;
}
};
bool deleteNode(int val)
{
Node *obj=find(val);
if (obj==NULL)
{
return true;
}
//說明哈希表中有這個節點
Node *head=hashTable[val%N];
if (head==obj)
{
hashTable[val%N]=obj->next;
delete obj;
deleteNode(val);
return true;
}
while(head->next!=obj&&head->next!=NULL)
{
head=head->next;
}
head->next=obj->next;
delete obj;
deleteNode(val);
return true;
}
private:
Node *hashTable[N];//這是個數組
};
這是哈希表的一種簡單的基於數組的實現,哈希函數選爲取餘,對哈希表的操作就變成了對鏈表的操作
數據結構基礎(三)哈希表的實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.