//
哈希表的基本运算.cpp :
定义控制台应用程序的入口点。
#include "stdafx.h"
typedef int KeyType;
const int NUM = 10;//0-9下表的数组用来存放不同索引值
#include
struct HashTable
{
KeyType
key;
HashTable
*next;
HashTable
*head;//头结点
};
void Initial(KeyType a[],int
n)//初始化数据
{
cout<<"请输入"<<n<<"个测试数据"<<endl;
for (int i =
0; i < n; i++)
{
cin>>a[i];
}
}
void CreateHT(HashTable ht[],KeyType a[],int
n)//采用头插法建立哈希表
{
for (int i =
0; i < NUM; i++)
{
ht[i].head = new HashTable;
ht[i].head->next = NULL;//初始化数据
}
for (int i =
0; i < n; i++)//采用带有头结点的头插法
{
int n = a[i] % NUM;
//HashTable *head = new HashTable;
HashTable * p = new HashTable;
p->key = a[i];
p->next = ht[n].head->next;
ht[n].head->next = p;
//ht[n].head = head;
}
}
void display(HashTable ht[])//输出信息
{
for (int i =
0; i < NUM; i++)
{
cout<<"索引为"<<i<<"的数据有:";
HashTable *p
= ht[i].head->next;
while (p !=
NULL)
{
cout<<p->key<<"
";
p = p->next;
}
cout<<endl;
}
}
void add(HashTable ht[],KeyType
data)//插入数据
{
int n = data
% NUM;
HashTable * p
= new HashTable;
p->key =
data;
p->next =
ht[n].head->next;
ht[n].head->next = p;
}
int Remove(HashTable ht[],KeyType data)
{
int n = data
% NUM;
HashTable *p
= ht[n].head;
while (p !=
NULL)
{
HashTable *q = p;//q用来保存待删点的前一个点
p = p->next;
if(p->key == data)
{
if(p->next == NULL)//如果是所在索引表的最后一个元素
{
q->next = NULL;
}
else
{
q->next = p->next;
}
delete(p);
return 1;//删除成功
}
}
return
0;//删除失败
}
int _tmain(int argc, _TCHAR* argv[])
{
HashTable
ht[NUM];
HashTable
Test[NUM];
int
n;
KeyType
a[20];//假设数组长度不超过20
cout<<"请输入测试数组的个数(这里假设小于20):"<<endl;
cin>>n;
Initial(a,n);
CreateHT(ht,a,n);
cout<<"插入数据前,数据为:"<<endl;
display(ht);
add(ht,5);
cout<<"插入数据5之后,数据为:"<<endl;
display(ht);
cout<<"删除数据5之后,数据为:"<<endl;
Remove(ht,5);
display(ht);
return
0;
}