//版本:v1.0
//功能:哈希查找法的实现 链表 冲突解决挂链
//运行环境:VC6.0
#include
#include
#include
#include
usingnamespace std;
constMAXNUMOFBASE=5; //数据空间的基
const char* menuinterface[]={
" ",
"╭─────┬┬┐┌┬┐┌┬┐┌┬┐┌┬┐┌┬┐┌┬┬────╮",
"│ ├数┤├据┤├结┤├构┤├程┤├序┤├集┤ │",
"├─────┴┴┘└┴┘└┴┘└┴┘└┴┘└┴┘└┴┴────┤",
"│ 《散列查找》 │",
"├──────────────────────────────┤",
"│ 帮助请按(“H”)键 │",
"├──────────────────────────────┤",
"│ 1.创建原始数据 │",
"│ 2.重新创建数据 │",
"│ 3.显示全部数据 │",
"│ 4.查找数据操作 │",
"│ 5.退出本软件 │",
"│ │",
"├──────────────────────────────┤",
"│ ╱◥██◣ ¤╭⌒╮╭制作: │",
"│ ︱田︱田田| ╰-------------指导: ---------------- │",
"│ ╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬ │",
"╰──────────────────────────────╯"};
const char* helpinterface[]={
" ",
"╭─────┬─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┬────╮",
"│ │散││列││查││找││帮││助││栏│ │",
"├─────┴─┘└─┘└─┘└─┘└─┘└─┘└─┴────┤",
"│ 哈希存储法和查找法的讨论 │",
"├──────────────────────────────┤",
"│ 哈希存储法不能完全做到O(1)级的算法效率。哈希存储法 │",
"│ 是利用函数计算出数据应该存放的地址,存入数据,之后在需要 │",
"│ 查找数据的时候,还使用同样的函数。从表面上看,是O(1)级 │",
"│ 的查找算法,但是,由于无论哪一种函数,它在计算该地址时, │",
"│ 或多或少都会产生冲突,这就需要通过拉链法或建立一个公共溢 │",
"│ 出区来解决,而在查找的过程中,对于冲突的数据,就不能通过 │",
"│ 函数一次找到,而还要进行比较,这样,算法就不为O(1)级的。│",
"│ 虽然哈希存储法不能完全做到O(1)级的查找算法,但由于 │",
"│ 所选函数往往能保证大部分数据不会发生冲突,冲突的只是少部 │",
"│ 分,最终的查找效率依然是很高的。 │",
"│ │",
"╰──────────────────────────────╯"};
const char* endinterface[]={
" ",
"╭─────╮ ╭─╮╭─╮ ╭─╮╭─╮ ╭─────╮",
"│★★★★★├☆☆┤软││件├☆☆☆┤结││束├☆☆┤★★★★★│",
"├─────╯ ╰─╯╰─╯ ☆ ╰─╯╰─╯ ╰─────┤",
"├───────────────☆───────────────┤",
"├───────────────────────────────┤",
"│ 谢谢您的使用 │",
"╰───────────────────────────────╯"};
classnode
{
public:
int data; //数据域
node *next; //结点指针
};
classHash_Search
{
public:
Hash_Search();
~Hash_Search();
voidbegin_program();
private:
voidend_face();
voidprocess_face();
voidquestion_face();
int Set_Hash_Search();
voidset_maxnum();
voidre_creat_num();
voidPrint_num();
voiddestroy_num();
voidPrint_Result();
voidcreat_num();
intsetnum();
boolIsEmpty();
node*number[MAXNUMOFBASE],*cpynumber[MAXNUMOFBASE],*p,*q;
intnum;
intfind_number;
};
Hash_Search::Hash_Search()
{
for(inti=0;i
number[i]=NULL;
}
voidHash_Search::Print_num()
{
cout<<endl;
if(IsEmpty())
cout<<"\t对不起,数据为空,请先创建数据。"<<endl;
else
{
for(int i=0;i
{
cout<<"\t"<<i1<<"【-】-> ";
number[i]=number[i]->next;
while(number[i])
{
cout<<number[i]->data;
if (number[i]->next)cout<<"-->";
number[i]=number[i]->next;
}
cout<<endl;
number[i]=cpynumber[i];
}
}
}
boolHash_Search::IsEmpty()
{
if(number[1]==NULL&&number[2]==NULL&&number[3]==NULL&&number[4]==NULL&&number[0]==NULL)
returntrue;
else
returnfalse;
}
voidHash_Search::process_face()
{
system("cls");
for(intj=0;j<19;j )
{
cout<<"\t"<<menuinterface[j]<<endl;
Sleep(10);
}
}
voidHash_Search::question_face()
{
system("cls");
for(intj=0;j<18;j )
{
cout<<"\t"<<helpinterface[j]<<endl;
Sleep(10);
}
cout<<'\t';
system("PAUSE");
}
voidHash_Search::end_face()
{
system("cls");
for(intj=0;j<8;j )
{
cout<<"\t"<<endinterface[j]<<endl;
Sleep(50);
}
system("PAUSE");
}
voidHash_Search::set_maxnum()
{
cout<<"\n\t请输入数据个数:";
cin>>num;
if(num<=0)
cout<<"\t你输入的数据有问题,怎么可以输入"<<num<<"个数据呢?"<<endl;
}
voidHash_Search::destroy_num()
{
for(inti=0;i
{
node*p;
while (number[i]->next!=NULL )
{
p=number[i];
number[i]=number[i]->next;
delete p;
}
number[i]=NULL;
}
}
Hash_Search::~Hash_Search()
{
destroy_num();
}
intHash_Search::setnum()
{
int d=0;
cout<<"\t请输入数据:";
cin>>d;
returnd;
}
voidHash_Search::creat_num()
{
int j,k;
for(j=0;j
{
number[j]=newnode;
cpynumber[j]=number[j];
number[j]->data=0;
number[j]->next=NULL;
}
set_maxnum();
if(num>0)
{
for(inti=0;i
{
k=setnum();
q=new node;
q->data=k;
q->next=NULL;
while(number[k%MAXNUMOFBASE]->next)
number[k%MAXNUMOFBASE]=number[k%MAXNUMOFBASE]->next;
number[k%MAXNUMOFBASE]->next=q;
}
for(j=0;j
number[j]=cpynumber[j];
cout<<"\t数据已经创建成功。"<<endl;
}
else
{
destroy_num();
}
getch();
}
voidHash_Search::re_creat_num()
{
if(IsEmpty())
{
cout<<"\n\t您还没有创建数据,请先创建数据。"<<endl;
getch();
}
else
{
destroy_num();
creat_num();
}
}
intHash_Search::Set_Hash_Search()
{
p=number[find_number%MAXNUMOFBASE];
int i=0;
p=p->next;
while(1)
{
i ;
if(!p)
{
cout<<"\t一共查找了"<<i<<"次"<<endl;
return-1;
break;
}
else
{
if(p->data==find_number)
{
cout<<"\t一共查找了"<<i<<"次"<<endl;
return 1;
break;
}
else
p=p->next;
}
}
}
voidHash_Search::Print_Result()
{
if(IsEmpty())
{
cout<<"\n\t您还没有创建数据,请先创建数据。"<<endl;
getch();
}
else
{
intk=0;
node *q;
cout<<"\n\t请输入您要查找的数据:";
cin>>find_number;
k=Set_Hash_Search();
if(k==1)
cout<<"\t该数据存在"<<endl;
else
{
q=new node;
q->data=find_number;
q->next=NULL;
while(number[find_number%MAXNUMOFBASE]->next)
number[find_number%MAXNUMOFBASE]=number[find_number%MAXNUMOFBASE]->next;
number[find_number%MAXNUMOFBASE]->next=q;
cout<<"\t该数据不存在,挂链成功"<<endl;
number[find_number%MAXNUMOFBASE]=cpynumber[find_number%MAXNUMOFBASE];
}
}
}
voidHash_Search::begin_program()
{
charchos;
while(chos!='5')
{
process_face();
cout<<"\t请输入您的操作:";
chos=getche();
switch(chos)
{
case'1':
cout<<"\b【1.创建数据】";
if(IsEmpty())
{
creat_num();
}
else
{
cout<<"\n\t数据已经存在,是否重新创建(Y/N):";
chos=getche();
cout<<endl;
if(chos=='Y'||chos=='y')
{
re_creat_num();
}
}
break;
case'2':
cout<<"\b【2.重新创建数据】";
re_creat_num();
break;
case'3':
cout<<"\b【3.显示全部数据】";
Print_num();
getch();
break;
case'4':
cout<<"\b【4.查找数据操作】";
Print_Result();
getch();
break;
case'5':
end_face();
exit(0);
break;
case'H':
case'h':
cout<<"\b【显示帮助信息】";
question_face();
break;
default:
cout<<"\n\t您的输入有误,请重新输入:\n\t";
system("pause");
}
}
destroy_num();
}
voidmain()
{
Hash_Searchsearchnow;
while(1)
{
searchnow.begin_program();
}
}