数据结构--Hash查找

来源:互联网 发布:美白面膜有用吗 知乎 编辑:程序博客网 时间:2024/06/05 10:52

//版本:v1.0

//功能:哈希查找法的实现 链表 冲突解决挂链

//运行环境:VC6.0

 

#include

#include

#include

#include

 

usingnamespace std;

 

constMAXNUMOFBASE=5; //数据空间的基

 

const char* menuinterface[]={

               " ",

               "╭─────┬┬┐┌┬┐┌┬┐┌┬┐┌┬┐┌┬┐┌┬┬────╮",

               "         ├数┤├据┤├结┤├构┤├程┤├序┤├集┤       ",

      "├─────┴┴┘└┴┘└┴┘└┴┘└┴┘└┴┘└┴┴────┤",

                  "                      《散列查找》                        ",

      "├──────────────────────────────┤",

                  " 帮助请按(“H”)键                                       ",

      "├──────────────────────────────┤",

                  "                   1.创建原始数据                         ",

      "                   2.重新创建数据                         ",

      "                   3.显示全部数据                         ",

      "                   4.查找数据操作                         ",

                  "                   5.退出本软件                           ",

      "                                                           ",

      "├──────────────────────────────┤",

      "   ╱◥██◣    ¤╭⌒╮╭制作:                       ",

                  "  ︱田︱田田| -------------指导:     ---------------- ",     

                  "  ╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬  ",

                  "╰──────────────────────────────╯"};

const char* helpinterface[]={

               " ",

               "╭─────┬─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┬────╮",

               "         │散││列││查││找││帮││助││栏│       ",

      "├─────┴─┘└─┘└─┘└─┘└─┘└─┘└─┴────┤",

                  "                 哈希存储法和查找法的讨论                 ",

      "├──────────────────────────────┤",

                  "     哈希存储法不能完全做到O1)级的算法效率。哈希存储法  ",

      "  是利用函数计算出数据应该存放的地址,存入数据,之后在需要 ",

      "  查找数据的时候,还使用同样的函数。从表面上看,是O1)级  ",

      "  的查找算法,但是,由于无论哪一种函数,它在计算该地址时, ",

                  "  或多或少都会产生冲突,这就需要通过拉链法或建立一个公共溢 ",

      "  出区来解决,而在查找的过程中,对于冲突的数据,就不能通过 ",

         "  函数一次找到,而还要进行比较,这样,算法就不为O1)级的。│",

      "     虽然哈希存储法不能完全做到O1)级的查找算法,但由于  ",

      "  所选函数往往能保证大部分数据不会发生冲突,冲突的只是少部 ",

                  "  分,最终的查找效率依然是很高的。                         ",     

                  "                                                           ",

                  "╰──────────────────────────────╯"};

 

 

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<<"\b1.创建数据】";

  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<<"\b2.重新创建数据】";

  re_creat_num();

  break;

  case'3':

  cout<<"\b3.显示全部数据】";

  Print_num();

  getch();

  break;

  case'4':

  cout<<"\b4.查找数据操作】";

  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();

 }

}

 

0 0
原创粉丝点击