C++ 實(shí)現(xiàn)哈希表的實(shí)例
C++ 實(shí)現(xiàn)哈希表的實(shí)例
該散列表的散列函數(shù)采用了除法散列函數(shù)、乘法散列函數(shù)、全域散列函數(shù),每一個(gè)槽都是使用有序單向鏈表實(shí)現(xiàn)。
實(shí)現(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表中每一個(gè)元素存儲(chǔ)一個(gè)鏈表
#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++實(shí)現(xiàn)哈希表的實(shí)例,如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)快速排序圖文示例
這篇文章主要為大家介紹了C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)快速排序圖文示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
C++實(shí)現(xiàn)圖書管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C語(yǔ)言游戲項(xiàng)目球球大作戰(zhàn)實(shí)現(xiàn)流程
這篇文章主要為大家詳細(xì)介紹了如何用C語(yǔ)言實(shí)現(xiàn)流行游戲球球大作戰(zhàn),文中示例代碼介紹的非常詳細(xì),如果過(guò)程中有問(wèn)題在文末還有視頻講解,感興趣的小伙伴們可以參考一下2022-01-01
C++中多態(tài)的定義及實(shí)現(xiàn)詳解
這篇文章主要給大家介紹了關(guān)于C++中多態(tài)的定義及實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
c++使用單例模式實(shí)現(xiàn)命名空間函數(shù)案例詳解
這篇文章主要介紹了c++使用單例模式實(shí)現(xiàn)命名空間函數(shù),本案例實(shí)現(xiàn)一個(gè)test命名空間,此命名空間內(nèi)有兩個(gè)函數(shù),分別為getName()和getNameSpace(),本文結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2023-04-04
C語(yǔ)言實(shí)現(xiàn)線索二叉樹的定義與遍歷示例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)線索二叉樹的定義與遍歷,結(jié)合具體實(shí)例形式分析了基于C語(yǔ)言的線索二叉樹定義及遍歷操作相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2017-06-06
C++ 輸入一行數(shù)字(含負(fù)數(shù))存入數(shù)組中的案例
這篇文章主要介紹了C++ 輸入一行數(shù)字(含負(fù)數(shù))存入數(shù)組中的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12

