欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ 實現(xiàn)哈希表的實例

 更新時間:2017年08月28日 17:16:49   投稿:lqh  
這篇文章主要介紹了C++ 實現(xiàn)哈希表的實例的相關資料,這里使用C++實現(xiàn)哈希表的實例幫助大家徹底理解哈希表的原理,需要的朋友可以參考下

C++ 實現(xiàn)哈希表的實例

該散列表的散列函數采用了除法散列函數、乘法散列函數、全域散列函數,每一個槽都是使用有序單向鏈表實現(xiàn)。

實現(xiàn)代碼:

LinkNode.h



#include<iostream> 
using namespace std; 
class Link; 
class LinkNode 
{ 
private: 
  int key; 
  LinkNode* next; 
  friend Link; 
public: 
  LinkNode():key(-1),next(NULL){} 
  LinkNode(int num):key(num),next(NULL){} 
  int Getkey() 
  { 
    return key; 
  } 
 
}; 

 Link.h

#include"LinkNode.h" 
class Hash; 
class Link 
{ 
private: 
  friend Hash; 
  LinkNode* head; 
  int length; 
public: 
  Link():head(NULL),length(0) 
  {} 
  Link(LinkNode* node):head(node) 
  { 
    length+=1; 
  } 
  ~Link() 
  { 
    MakeEmpty(); 
  } 
  void MakeEmpty() 
  { 
    if(head==NULL) 
      return ; 
    LinkNode* p=head; 
    while(p) 
    { 
      head=head->next; 
      delete p; 
      p=head; 
    } 
  } 
  int GetLength() 
  { 
    return length; 
  } 
  void Insert(int num) 
  { 
    length++; 
    LinkNode* p=new LinkNode(num); 
    if(head==NULL) 
    { 
      head=p; 
      return ; 
    } 
    LinkNode* q=head,*t=head->next; 
    if(q->key>num) 
    { 
      head=p; 
      head->next=q; 
      return ; 
    } 
    while(t) 
    { 
      if(t->key>=num) 
      { 
        q->next=p; 
        p->next=t; 
        return ; 
      } 
      else 
      { 
        q=t; 
        t=t->next; 
      } 
    } 
    q->next=p; 
  } 
  bool Delete(int num) 
  { 
    if(head==NULL) 
    { 
      cout<<"the link is empty!"<<endl; 
      return 0; 
    } 
    LinkNode* p=head,*t=head->next; 
    if(p->key==num) 
    { 
      head=head->next; 
      delete p; 
      length--; 
      return 1; 
    } 
    while(t) 
    { 
      if(t->key==num) 
      { 
        p->next=t->next; 
        delete t; 
        length--; 
        return 1; 
      } 
      else if(t->key<num) 
      { 
        p=t; 
        t=t->next; 
      } 
    } 
    return 0; 
  } 
  int Search(int num) 
  { 
    LinkNode* p=head; 
    while(p) 
    { 
      if(p->key==num) 
      { 
        return num; 
      } 
      else if(p->key<num) 
      { 
        p=p->next; 
      } 
      else 
      { 
        return 0; 
      } 
    } 
    return 0; 
  } 
  bool IsEmpty() 
  { 
    if(head==NULL) 
    { 
      return 1; 
    } 
    else 
      return 0; 
  } 
  void Print(int num) 
  { 
    if(head==NULL) 
    { 
      cout<<"the"<<num<<"th link is null!"<<endl; 
    } 
    LinkNode* p=head; 
    while(p) 
    { 
      cout<<p->key<<" "; 
      p=p->next; 
    } 
    cout<<endl; 
  } 
}; 

 Hash.h

Hash表中每一個元素存儲一個鏈表

#include"Link.h" 
class Hash 
{ 
private: 
  Link*Table; 
public: 
  Hash(int num):Table(new Link [num]){} 
  ~Hash() 
  { 
    delete [] Table; 
  } 
  //除法散列法 
  int H1(int num,int m) 
  { 
    return num%m; 
  } 
  //乘法散列法 
  int H2(int num,float A,int m) 
  { 
    float fnum=(float)num; 
    float re=((fnum*A)-(int)(fnum*A))*m; 
    return (int)re; 
  } 
  //全域散列 
  int H3(int num,int p,int m) 
  { 
    int a,b; 
    a=rand()%p; 
    b=rand()%p; 
    return ((a*num+b)%p)%m; 
  } 
  void Insert(int num,int n) 
  { 
    int key; 
     
    if(n==1) 
    { 
      key=H1(num,17); 
    } 
    else if(n==2) 
    { 
      key=H2(num,0.618033,17); 
    } 
    else 
    { 
      key=H3(num,701,17); 
    } 
    Table[key].Insert(num); 
  } 
  bool Delete(int num,int n) 
  { 
    int key;   
    if(n==1) 
    { 
      key=H1(num,17); 
    } 
    else if(n==2) 
    { 
      key=H2(num,0.618033,17); 
    } 
    else 
    { 
      key=H3(num,701,17); 
    } 
    return Table[key].Delete(num); 
  } 
  int Search(int num,int n) 
  { 
    int key; 
     
    if(n==1) 
    { 
      key=H1(num,17); 
    } 
    else if(n==2) 
    { 
      key=H2(num,0.618033,17); 
    } 
    else 
    { 
      key=H3(num,701,17); 
    } 
      if(Table[key].Search(num)!=0) 
      { 
        return key+1; 
      } 
      else 
        return -1; 
  } 
  void Print(int num) 
  { 
    int i; 
    for(i=0;i<num;i++) 
    { 
      if(Table[i].IsEmpty()) 
        continue; 
      Table[i].Print(i); 
    } 
  } 
}; 

 main.h

#include"Hash.h" 
int main() 
{ 
  Hash hash(1000),ha(100),sh(100); 
  int a[15]={15,6,9,4,7,32,569,419,78,125,635,46,456,16,457}; 
  int i; 
  for(i=0;i<15;i++) 
  { 
    hash.Insert(a[i],1); 
  } 
   
  for(i=0;i<15;i++) 
  { 
    ha.Insert(a[i],2); 
  } 
  cout<<endl; 
  for(i=0;i<15;i++) 
  { 
    sh.Insert(a[i],3); 
  } 
  hash.Print(1000); 
  cout<<endl; 
  ha.Print(100); 
  cout<<endl; 
  sh.Print(100); 
  cout<<endl; 
  cout<<hash.Search(46,1)<<endl; 
  if(hash.Delete(125,1)) 
  { 
    cout<<hash.Search(125,1)<<endl; 
  } 
} 


以上就是C++實現(xiàn)哈希表的實例,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • linux系統(tǒng)中c++寫日志文件功能分享

    linux系統(tǒng)中c++寫日志文件功能分享

    這篇文章主要介紹了linux系統(tǒng)中c++寫日志文件功能,簡化了glog,只保留了寫日志文件的功能,只是改寫了linux版本,需要的朋友可以參考下
    2014-03-03
  • C語言冒泡排序法的實現(xiàn)(升序排序法)

    C語言冒泡排序法的實現(xiàn)(升序排序法)

    這篇文章主要介紹了C語言冒泡排序法的實現(xiàn)(升序排序法),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • 探討數組與字符串輸入的問題(C++版)

    探討數組與字符串輸入的問題(C++版)

    本文對C++數組與字符串輸入的問題進行了探討,需要的朋友可以參考下
    2015-07-07
  • C語言實現(xiàn)學生學籍管理系統(tǒng)

    C語言實現(xiàn)學生學籍管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)學生學籍管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++ 智能指針的魅力你都了解嗎

    C++ 智能指針的魅力你都了解嗎

    智能指針使用和普通指針類似。解引用一個智能指針返回它指向的對象。如果在一個條件判斷中使用智能指針,效果就是檢測它是否為空,本文給大家介紹C++ 智能指針的相關知識,感興趣的朋友一起看看吧
    2021-06-06
  • C++實現(xiàn)希爾排序算法實例

    C++實現(xiàn)希爾排序算法實例

    大家好,本篇文章主要講的是C++實現(xiàn)希爾排序算法實例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • c++如何實現(xiàn)歸并兩個有序鏈表

    c++如何實現(xiàn)歸并兩個有序鏈表

    這篇文章主要介紹了c++如何實現(xiàn)歸并兩個有序鏈表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語言實現(xiàn)簡單的三子棋小游戲

    C語言實現(xiàn)簡單的三子棋小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的三子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • C語言進階二叉樹的基礎與銷毀及層序遍歷詳解

    C語言進階二叉樹的基礎與銷毀及層序遍歷詳解

    朋友們好,這篇播客我們繼續(xù)C++的初階學習,現(xiàn)在對我們對C++的二叉樹基礎oj與二叉樹銷毀和層序遍歷進行練習,讓我們相互學習,共同進步
    2022-06-06
  • C++ 中滾動條的滾動問題

    C++ 中滾動條的滾動問題

    本文主要通過一個示例,給大家介紹了C++中滾動條的滾動問題,以及相關參數的解釋,非常的詳細,有需要的小伙伴可以參考下。
    2015-06-06

最新評論