#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];//这是个数组
};
这是哈希表的一种简单的基于数组的实现,哈希函数选为取余,对哈希表的操作就变成了对链表的操作