




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、哈希查找算法的源代碼 c語言【問題描述】針對自己的班集體中的“人名”設(shè)計(jì)一個(gè)哈希表,使得平均查找長度不超過R,完成相應(yīng)的建表和查表程序。基本要求假設(shè)人名為中國姓名的漢語拼音形式。待填入哈希表的人名共有30個(gè),取平均查找長度的上限為2。哈希函數(shù)用除留余數(shù)法構(gòu)照,用鏈表法處理沖突。測試數(shù)據(jù)讀取熟悉的30個(gè)人的姓名。#include <fstream>#include <iostream>#include <cmath>using namespace std;#define Maxsize 57 struct record char name20;char tel
2、20;char add20;typedef record * precord;struct HashTable int elemMaxsize; /存放數(shù)組a的下標(biāo)int count; ;typedef HashTable * pHashTable;int Number; /統(tǒng)計(jì)當(dāng)前數(shù)組a中的記錄總數(shù)void Getdata(precord a) /從文件telphone.txt中讀取數(shù)據(jù)存放到數(shù)組a Number=0;ifstream infile("telphone.txt",ios:in|ios:binary);if(!infile) cout<<&quo
3、t;文件打開失敗!n" exit(1);while(!infile.eof() && infile.get()!=EOF) /文件不為空并且文件指針沒有指到結(jié)束符infile.seekg(Number*sizeof(aNumber),ios:beg); /定位文件指針infile.read(char *)&aNumber,sizeof(aNumber);Number+;infile.close();void Add(precord a) /添加記錄 int i,num;cout<<"當(dāng)前文件內(nèi)已有"<<Number&
4、lt;<"條記錄n"cout<<"請輸入添加的個(gè)數(shù):"cin>>num;ofstream ofile("telphone.txt",ios:app);if(! ofile) cout<<"文件打開失敗!" exit(1); for(i=0;i<num;i+) cout<<"請輸入第"<<Number+1<<"個(gè)人的姓名"<<endl;cin>>aN;
5、 cout<<"請輸入第"<<Number+1<<"個(gè)人的電話"<<endl;cin>>aNumber.tel; cout<<"請輸入第"<<Number+1<<"個(gè)人的地址"<<endl;cin>>aNumber.add; ofile.seekp(ios:end);ofile.write(char *)&aNumber,sizeof(aNumber);Number+;ofile.clos
6、e();void Print(precord a) /顯示所有記錄 int i;for(i=0;i<Number;i+)cout<<"第"<<i+1<<"個(gè)人的信息為:n"cout<<" 姓名:"<<<<endl;cout<<" 電話:"<<ai.tel<<endl;cout<<" 地址:"<<ai.add<<endl;int Has
7、h(char str) /除留取余 long val=0;char p20,*p1;strcpy(p,str);p1=p;while(*p1!='0')val=val+*p1+; /將字符串中的所有字符對應(yīng)的ASCII值相加return(val%Maxsize);int derter; /線性增量int Line_Sollution(int address) /采用線性探測解決沖突 derter+;if(derter=Maxsize) return(-1);else return(address+derter)%Maxsize);int n;int Square_Solluti
8、on(int address) /采用平方探測法解決沖突 int j;derter+;if(derter=Maxsize) return -1;n=n*(-1);j=(int(pow(derter,2)*n+address)%Maxsize;return(j);void Init_Hash(pHashTable h) /初始化哈希表 int i;for(i=0;i<Maxsize;i+)h->elemi=-1;int menu;void Creathash_Name(pHashTable h,precord a)/以用戶名為關(guān)鍵字創(chuàng)建哈希表 cout<<"-n
9、"cout<<" 1-以線性探測建表n"cout<<" 2-以平方探測建表n"cout<<"-n"int i,address;cin>>menu;Init_Hash(h);for(i=0;i<Number;i+) derter=0;n=-1;address=Hash();while(h->elemaddress!=-1)if(menu=1) address=Line_Sollution(address);else address=Square_Soll
10、ution(address);if(address=-1) break;if(address!=-1) h->elemaddress=i; h->count+;cout<<"姓名哈希表已成功建立!n"void Search_Name(pHashTable h,precord a) /查找并顯示指定姓名的記錄 cout<<"請輸入要查找的姓名:"char nam20;int address,i=1;cin>>nam;address=Hash(nam);derter=0;n=-1;while(h->ele
11、maddress!=-1 && strcmp(nam,ah->)!=0) if(menu=1) address=Line_Sollution(address);else address=Square_Sollution(address);i+;if(address=-1) break;if(h->elemaddress!=-1 && strcmp(nam,ah->)=0) cout<<"你要查找的信息為:n"cout<<" 姓名
12、:"<<ah-><<endl;cout<<" 電話:"<<ah->elemaddress.tel<<endl;cout<<" 地址:"<<ah->elemaddress.add<<endl;cout<<"比較次數(shù)為"<<i<<endl;else cout<<"無此姓名,查找失敗!"void Creathash_te
13、l(pHashTable h,precord a) /以電話號為關(guān)鍵字創(chuàng)建哈希表 cout<<"-n"cout<<" 1-以線性探測建表n"cout<<" 2-以平方探測建表n"cout<<"-n"int i,address;cin>>menu;Init_Hash(h);for(i=0;i<Number;i+) derter=0;n=-1;address=Hash(ai.tel);while(h->elemaddress!=-1)if(menu
14、=1) address=Line_Sollution(address);else address=Square_Sollution(address);if(address=-1) break;if(address!=-1) h->elemaddress=i; h->count+;cout<<"電話號哈希表已成功建立!n"void Search_tel(pHashTable h,precord a)/查找并顯示指定電話號的記錄 cout<<"請輸入要查找的電話:"char telphone20;int address,i
15、=1; /i統(tǒng)計(jì)比較次數(shù)cin>>telphone;address=Hash(telphone);derter=0; n=-1; /初始化線性增量while(h->elemaddress!=-1 && strcmp(telphone,ah->elemaddress.tel)!=0) if(menu=1) address=Line_Sollution(address);else address=Square_Sollution(address);i+;if(address=-1) break;if(h->elemaddress!=-1 &&a
16、mp; strcmp(telphone,ah->elemaddress.tel)=0) cout<<"你要查找的信息為:n"cout<<" 姓名:"<<ah-><<endl;cout<<" 電話:"<<ah->elemaddress.tel<<endl;cout<<" 地址:"<<ah->elemaddress.add<<endl;cout&
17、lt;<"比較次數(shù)為"<<i<<endl;else cout<<"無此電話,查找失敗!"void Menu() /功能菜單函數(shù)for(int i=1;i<=5;i+)cout<<endl;cout<<" 電話號碼查詢系統(tǒng)n"cout<<'n'cout<<" n"cout<<" 0-退出 n"cout<<" 1-添加 n"cout<<
18、;" 2-顯示所有 n" cout<<" 3-以性命建立哈希表 n"cout<<" 4-以電話建立哈希表 n"cout<<" 5-按用戶名查找 n"cout<<" 6-按電話號查找 n"cout<<" n"cout<<" 使用說明:n"cout<<" 1.添加新紀(jì)錄后,如要進(jìn)行查找請先進(jìn)行3或4操作n"cout<<" 2.按用戶名查
19、找之前,請先進(jìn)行3操作建立用戶名哈希表n"cout<<" 3.按用戶名查找之前,請先進(jìn)行4操作建立電話號哈希表n"void exit() int i;for(i=1;i<=4;i+)cout<<endl;cout<<" n"cout<<" n"cout<<" 電 話 號 碼 查 詢 系 統(tǒng) n"cout<<" n"cout<<" 謝 謝 您 的 使 用 ! n"cout<<" n"cout<<" n"int main() record aMaxsize;pHashTable H=new HashTable;Getdata(a); /將文件中的數(shù)據(jù)讀入到數(shù)組a中start:Menu();int menu1;cin>>menu1;switch(menu1) case 0:system(&q
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)構(gòu)圖課件教學(xué)
- ppp教學(xué)模式課件
- 日語試講教學(xué)課件模板
- 攀枝花市應(yīng)急信息化建設(shè)趨勢及行業(yè)投資可行性研究報(bào)告
- 古代羅馬教學(xué)課件
- 音標(biāo)教學(xué)課件小學(xué)四年級
- 教師教學(xué)課件比賽
- 教育懲戒主題班會課件
- 弈秋 教學(xué)課件
- 春晚文化惠民活動(dòng)方案
- 危重病例管理制度和報(bào)告制度
- 除臭系統(tǒng)操作培訓(xùn)
- 2025年南外小升初測試題及答案
- 幼兒園一日活動(dòng)保教細(xì)則培訓(xùn)
- GB/T 45236-2025化工園區(qū)危險(xiǎn)品運(yùn)輸車輛停車場建設(shè)規(guī)范
- 瓦楞紙板銷售培訓(xùn)課件
- DBJ04T 432-2022 建設(shè)工程全過程造價(jià)咨詢標(biāo)準(zhǔn)
- FANUC機(jī)器人ARC Mate 120iD和M-20iD機(jī)械結(jié)構(gòu)手冊
- 慢病管理中心工作匯報(bào)
- 居間協(xié)議書居間協(xié)議書
- 廣西博物館2025事業(yè)單位招聘通過歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
評論
0/150
提交評論