實現雜湊表
- #include<stdio.h>
- #include<iostream>
- #include<conio.h>
- using namespace std;
- #define HASH_LEN 50 //雜湊表的長度
- #define M 47 //隨機數
- int NAME_NO=34; //城市名的個數
- typedef struct
- {
- char *py; //名字的拼音
- int k; //拼音所對應的整數
- }NAME;
- NAME NameList[HASH_LEN]; //全域性變數NAME
- typedef struct //雜湊表
- {
- char *py; //名字的拼音
- int k; //拼音所對應的整數
- int si; //查詢長度
- }HASH;
- HASH HashList[HASH_LEN]; //全域性變數HASH
- void InitNameList() //姓名(結構體陣列)初始化
- {
- char *f;
- int r,s0,i;
- NameList[0].py="harbin";
- NameList[1].py="shijiazhuang";
- NameList[2].py="lanzhou";
- NameList[3].py="kunming";
- NameList[4].py="chengdu";
- NameList[5].py="changchun";
- NameList[6].py="shenyang";
- NameList[7].py="xining";
- NameList[8].py="xian";
- NameList[9].py="zhengzhou";
- NameList[10].py="jinan";
- NameList[11].py="taiyuan";
- NameList[12].py="hefei";
- NameList[13].py="wuhan";
- NameList[14].py="changsha";
- NameList[15].py="nanjing";
- NameList[16].py="guiyang";
- NameList[17].py="nanning";
- NameList[18].py="hangzhou";
- NameList[19].py="nanchang";
- NameList[20].py="guangzhou";
- NameList[21].py="fuzhou";
- NameList[22].py="taipei";
- NameList[23].py="haikou";
- NameList[24].py="huhhot";
- NameList[25].py="yinchuan";
- NameList[26].py="urumqi";
- NameList[27].py="lahsa";
- NameList[28].py="macau";
- NameList[29].py="beijing";
- NameList[30].py="shanghai";
- NameList[31].py="hongkong";
- NameList[32].py="tianjin";
- NameList[33].py="chongqing";
- for (i=0;i<NAME_NO;i++)
- {
- s0=0;
- f=NameList[i].py;
- for (r=0;*(f+r)!='\0';r++)
- /* 方法:將字串的各個字元所對應的ASCII碼相加,所得的整數做為雜湊表的關鍵字*/
- s0=*(f+r)+s0;
- NameList[i].k=s0;
- }
- }
- void CreateHashList() //建立雜湊表
- {
- int i;
- for (i=0; i<HASH_LEN;i++)
- {
- HashList[i].py="";
- HashList[i].k=0;
- HashList[i].si=0;
- }
- for (i=0;i<HASH_LEN;i++)
- {
- int sum=0;
- int adr=(NameList[i].k)%M; //雜湊函式
- int d=adr;
- if(HashList[adr].si==0) //如果不衝突
- {
- HashList[adr].k=NameList[i].k;
- HashList[adr].py=NameList[i].py;
- HashList[adr].si=1;
- }
- else //衝突
- {
- do
- {
- d=(d+NameList[i].k%10+1)%M; //偽隨機探測再雜湊法處理衝突
- sum=sum+1; //查詢次數加1
- }while (HashList[d].k!=0);
- HashList[d].k=NameList[i].k;
- HashList[d].py=NameList[i].py;
- HashList[d].si=sum+1;
- }
- }
- }
- int FindList() //查詢
- {
- char name[20]={0};
- int s0=0,r,sum=1,adr,d;
- printf("\n請輸入城市名稱:");
- scanf("%s",name);
- for (r=0;r<20;r++) //求出姓名的拼音所對應的整數(關鍵字)
- s0+=name[r];
- adr=s0%M; //使用雜湊函式
- d=adr;
- if(HashList[adr].k==s0) //分3種情況進行判斷
- {
- printf("\n名稱:%s 關鍵字:%d 查詢長度為: 1",HashList[d].py,s0);
- cout<<endl;
- return 0;
- }
- else if (HashList[adr].k==0)
- {
- printf("無此記錄!");
- cout<<endl;
- return 1;
- }
- else
- {
- int g=0;
- do
- {
- d=(d+s0%10+1)%M; //偽隨機探測再雜湊法處理衝突
- sum=sum+1;
- if (HashList[d].k==0)
- {
- printf("無此記錄! ");
- cout<<endl;
- g=1;
- return 1;
- }
- if (HashList[d].k==s0)
- {
- printf("\n名稱:%s 關鍵字:%d 查詢長度為:%d",HashList[d].py,s0,sum);
- cout<<endl;
- g=1;
- return 0;
- }
- }while(g==0);
- }
- }
- void Display() // 顯示雜湊表
- {
- int i;
- float average=0;
- for(i=0; i<HASH_LEN; i++)
- {
- if(HashList[i].k%M==0)
- HashList[i].py="";
- }
- printf("\n\n地址\t關鍵字\t\t搜尋長度\tH(key)\t 名稱\n"); //顯示的格式
- for(i=0; i<HASH_LEN; i++)
- {
- printf("%d ",i);
- printf("\t%d ",HashList[i].k);
- printf("\t\t%d ",HashList[i].si);
- printf("\t\t%d ",HashList[i].k%M);
- printf("\t %s ",HashList[i].py);
- //cout<<" "<<HashList[i].py<<endl;
- printf("\n");
- //cout<<i<<" "<<HashList[i].k<<" "<<HashList[i].si<<" "<<HashList[i].k%M<<" "<<HashList[i].py<<endl;
- }
- for (i=0;i<HASH_LEN;i++)
- average+=HashList[i].si;
- average/=NAME_NO;
- printf("\n\n平均查詢長度:ASL(%d)=%f \n\n",NAME_NO,average);
- }
- void DeleteList()
- {
- char name[20]={0};
- int s0=0,r,sum=1,adr,d;
- printf("\n請輸入城市名稱:");
- scanf("%s",name);
- for (r=0;r<20;r++) //求出姓名的拼音所對應的整數(關鍵字)
- s0+=name[r];
- adr=s0%M; //使用雜湊函式
- d=adr;
- if(HashList[adr].k==s0) //分3種情況進行判斷
- {
- printf("\n名稱:%s 關鍵字:%d 查詢長度為: 1",HashList[d].py,s0);
- cout<<endl;
- cout<<"刪除成功!"<<endl;
- s0=0;
- HashList[d].py=""; //名字的拼音
- HashList[d].k=0; //拼音所對應的整數
- HashList[d].si=0;
- }
- else if (HashList[adr].k==0)
- printf("無此記錄!無法執行刪除操作!");
- else
- {
- int g=0;
- do
- {
- d=(d+s0%10+1)%M; //偽隨機探測再雜湊法處理衝突
- sum=sum+1;
- if (HashList[d].k==0)
- {
- printf("無此記錄!無法執行刪除操作!");
- g=1;
- }
- if (HashList[d].k==s0)
- {
- printf("\n名稱:%s 關鍵字:%d 查詢長度為:%d",HashList[d].py,s0,sum);
- cout<<endl;
- cout<<"已刪除成功!"<<endl;
- s0=0;
- HashList[d].py=""; //名字的拼音
- HashList[d].k=0; //拼音所對應的整數
- HashList[d].si=0;
- //Display();
- g=1;
- }
- }while(g==0);
- }
- }
- void EnterList()
- {
- /*char name[20]={0};
- int s0=0,r,sum=1,adr,d,h;
- printf("\n請輸入姓名的拼音:");
- scanf("%s",name);
- for (r=0;r<20;r++) //求出姓名的拼音所對應的整數(關鍵字)
- s0+=name[r];*/
- char st[20];
- char *xin;
- xin=st;
- int s0=0,r,sum=1,adr,d,h;
- printf("\n請輸入城市名稱的拼音:");
- cin>>xin;
- //cout<<xin<<endl;
- for (r=0;*(xin+r)!='\0';r++)
- {
- /* 方法:將字串的各個字元所對應的ASCII碼相加,所得的整數做為雜湊表的關鍵字*/
- s0=(int)(*(xin+r))+s0;
- }
- //cout<<s0<<endl;
- adr=s0%M; //使用雜湊函式
- d=adr;
- if(HashList[adr].k==s0) //分3種情況進行判斷
- {
- printf("\n名稱:%s 關鍵字:%d 查詢長度為: 1",HashList[d].py,s0);
- cout<<endl;
- cout<<"已存在於表中,無需插入!"<<endl;
- }
- else if (HashList[d].k==0)
- {
- printf("插入成功!");
- HashList[d].py=xin;
- HashList[d].k=s0;
- HashList[d].si=1;
- h=1;
- cout<<endl;
- }
- else
- {
- int g=0,h=0;
- do
- {
- d=(d+s0%10+1)%M; //偽隨機探測再雜湊法處理衝突
- sum=sum+1;
- if (HashList[d].k==0)
- {
- printf("插入成功!");
- HashList[d].py=xin;
- HashList[d].k=s0;
- HashList[d].si=sum;
- h=1;
- cout<<endl;
- g=1;
- }
- if (HashList[d].k==s0)
- {
- printf("\n名稱:%s 關鍵字:%d 查詢長度為:%d",HashList[d].py,s0,sum);
- cout<<endl;
- cout<<"已存在於表中,無需插入!"<<endl;
- g=1;
- }
- }while(g==0);
- }
- if(h==0)
- return;
- else
- {
- NAME_NO++;
- NameList[NAME_NO-1].py=xin;
- int sum=0;
- int adr=(NameList[NAME_NO-1].k)%M; //雜湊函式
- int d=adr;
- if(HashList[adr].si==0) //如果不衝突
- {
- HashList[adr].k=NameList[NAME_NO-1].k;
- HashList[adr].py=NameList[NAME_NO-1].py;
- HashList[adr].si=1;
- }
- else //衝突
- {
- do
- {
- d=(d+NameList[NAME_NO-1].k%10+1)%M; //偽隨機探測再雜湊法處理衝突
- sum=sum+1; //查詢次數加1
- }while (HashList[d].k!=0);
- HashList[d].k=NameList[NAME_NO-1].k;
- HashList[d].py=NameList[NAME_NO-1].py;
- HashList[d].si=sum+1;
- }
- }
- }
- void main()
- {
- char ch1;
- printf("\n 雜湊表\n");
- printf(" *-------------------------------------------*\n");
- printf(" | D. 顯示雜湊表 |\n");
- printf(" | F. 查詢 |\n");
- printf(" | S. 刪除 |\n");
- printf(" | E. 插入 |\n");
- printf(" | Q. 退出 |\n");
- printf(" *-------------------------------------------*\n");
- InitNameList();
- CreateHashList ();
- while(1)
- {
- printf("\n Option-:");
- fflush(stdin);
- ch1=getchar();
- if (ch1=='D'||ch1=='d')
- Display();
- else if (ch1=='F'||ch1=='f')
- FindList();
- else if (ch1=='S'||ch1=='s')
- DeleteList();
- else if (ch1=='E'||ch1=='e')
- EnterList();
- else if (ch1=='Q'||ch1=='q')
- return;
- else
- {
- printf("\n請輸入正確的選擇!");
- }
- }
- }
相關文章
- JAVA 實現 - 雜湊表Java
- 深入理解雜湊表(JAVA和Redis雜湊表實現)JavaRedis
- 雜湊表的兩種實現
- 雜湊表(雜湊表)詳解
- 用Objective-C實現雜湊表Object
- 雜湊表的程式碼實現(Java)Java
- Python 雜湊表的實現——字典Python
- PHP7 雜湊表實現原理PHP
- Redis雜湊表的實現要點Redis
- 雜湊表(雜湊表)原理詳解
- 實現鍵值對儲存(五):雜湊表實現
- 雜湊表
- 【尋跡#3】 雜湊與雜湊表
- 資料結構與演算法——雜湊表類的C++實現(探測雜湊表)資料結構演算法C++
- 字串雜湊表字串
- 6.7雜湊表
- 查詢(3)--雜湊表(雜湊查詢)
- 資料結構與演算法——雜湊表類的C++實現(分離連結雜湊表)資料結構演算法C++
- JavaScript資料結構——字典和雜湊表的實現JavaScript資料結構
- [CareerCup] 8.10 Implement a Hash Table 實現一個雜湊表
- 雜湊表應用
- 雜湊表的原理
- 淺談雜湊表
- 符號表與雜湊表符號
- 雜湊表的C實現(三)---傳說中的暴雪版
- C語言實現的資料結構之------雜湊表C語言資料結構
- 資料結構 - 雜湊表,三探之程式碼實現資料結構
- 幾道和雜湊(雜湊)表有關的面試題面試題
- R語言——雜湊表R語言
- 【閱讀筆記:雜湊表】Javascript任何物件都是一個雜湊表(hash表)!筆記JavaScript物件
- Qt 中實現非同步雜湊器QT非同步
- 雜湊技術【雜湊表】查詢演算法 PHP 版演算法PHP
- 雜湊表:如何實現word編輯器的拼寫檢查?
- 【資料結構與演算法學習】雜湊表(Hash Table,雜湊表)資料結構演算法
- 資料結構——雜湊表資料結構
- freeswitch APR庫雜湊表
- 談談面試--雜湊表系列面試
- 雜湊表(Hash)的應用