




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)哈希表詳解/*
*程序名:hash.c,此程序演示哈希表的實(shí)現(xiàn),數(shù)據(jù)元素單鏈表帶頭結(jié)點(diǎn)。
#includestdio.h
#includestdlib.h
#includestring.h
//哈希表中數(shù)據(jù)元素的結(jié)構(gòu)體。
typedefstructElement
unsignedintkey;//關(guān)鍵字。
intvalue;//數(shù)據(jù)元素其它數(shù)據(jù)項(xiàng),可以是任意數(shù)據(jù)類型。
//charvalue[1001];//數(shù)據(jù)元素其它數(shù)據(jù)項(xiàng),可以是任意數(shù)據(jù)類型。
}Element;
//數(shù)據(jù)元素單鏈表。
typedefstructNode
Elementelem;//數(shù)據(jù)元素。
structNode*next;//next指針。
}Node;
//哈希表
typedefstructHashTable
structNode*head;//數(shù)據(jù)元素存儲(chǔ)基址,動(dòng)態(tài)分配數(shù)組。
inttablesize;//哈希表當(dāng)前大小,即表長(zhǎng)。
intcount;//哈希表中數(shù)據(jù)元素的個(gè)數(shù)。
}HashTable;
//初始化哈希表,tablesize為哈希表的表長(zhǎng),返回哈希表的地址。
HashTable*InitHashTable(constunsignedinttablesize)
//分配哈希表。
HashTable*hh=(HashTable*)malloc(sizeof(HashTable));
hh-tablesize=tablesize;//哈希表長(zhǎng)。
//分配和初始化數(shù)據(jù)元素單鏈表的頭結(jié)點(diǎn)。
hh-head=(Node*)malloc((hh-tablesize)*sizeof(Node));
memset(hh-head,0,(hh-tablesize)*sizeof(Node));
hh-count=0;//哈希表中數(shù)據(jù)元素個(gè)數(shù)置為0。
returnhh;
//哈希函數(shù)。
unsignedintHash(HashTable*hh,unsignedintkey)
returnkey%hh-tablesize;//對(duì)表長(zhǎng)取余。
//在哈希表中查找關(guān)鍵字,成功返回單鏈表結(jié)點(diǎn)的地址,失敗返回空。
Node*LookUp(HashTable*hh,unsignedintkey)
intii;
ii=Hash(hh,key);//獲取關(guān)鍵key的哈希地址。
Node*pp=hh-head[ii].next;
//遍歷單鏈表。
while((pp!=NULL)(pp-elem.key!=key))
pp=pp-next;
returnpp;
//從哈希表中刪除關(guān)鍵及其數(shù)據(jù),成功返回1,如果關(guān)鍵字不存在返回0。
intDelete(HashTable*hh,unsignedintkey)
intii;
ii=Hash(hh,key);//獲取關(guān)鍵key的哈希地址。
Node*pp=hh-head[ii];
//遍歷單鏈表,pp指針停留在待刪除關(guān)鍵key的前一結(jié)點(diǎn)。
while((pp-next!=NULL)(pp-next-elem.key!=key))
pp=pp-next;
if(pp-next==NULL)return0;//查找失敗。
Node*tmp=pp-next;//tmp為將要?jiǎng)h除的結(jié)點(diǎn)。
pp-next=pp-next-next;//寫成p-next=tmp-next更簡(jiǎn)潔。
free(tmp);//釋放結(jié)點(diǎn)。
hh-count--;//表中元素個(gè)數(shù)減1。
return1;
//向哈希表中插入數(shù)據(jù)元素,成功返回1,如果數(shù)據(jù)元素關(guān)鍵字已存在,返回0。
intInsert(HashTable*hh,Element*ee)
//查找關(guān)鍵字是否已存在,如果存在,插入失敗。
Node*pp=LookUp(hh,ee-key);
if(pp!=NULL){printf("關(guān)鍵字%d已存在。\n",ee-key);return0;}
Node*qq=(Node*)malloc(sizeof(Node));
memcpy(qq-elem,ee,sizeof(Element));
//用頭插法插入新數(shù)據(jù)元素。
intii=Hash(hh,ee-key);
qq-next=hh-head[ii].next;
hh-head[ii].next=qq;
hh-count++;//表中元素個(gè)數(shù)加1。
return1;
//銷毀哈希表
voidFreeHashTable(HashTable*hh)
intii;
Node*pp,*qq;
//釋放全部的單鏈表。
for(ii=0;iihh-tablesize;ii++)
pp=hh-head[ii].next;
while(pp)
qq=pp-next;
free(pp);
pp=qq;
//釋放全部單鏈表的頭結(jié)點(diǎn)數(shù)組。
free(hh-head);
free(hh);//釋放哈希表。
//打印哈希表。
voidPrintTable(HashTable*hh)
intii;
for(ii=0;iihh-tablesize;ii++)
Node*pp=hh-head[ii].next;
while(pp)
printf("[%d-%d]",pp-elem.key,pp-elem.value);
//printf("[%d-%s]",pp-elem.key,pp-elem.value);
pp=pp-next;
printf("^\n");
printf("\n");
intmain()
//初始化哈希表。
HashTable*hh=InitHashTable(10);
Elementee;
//插入數(shù)據(jù)元素,關(guān)鍵字從10到20。
ee.key=10;ee.value=110;Insert(hh,ee);
ee.key=11;ee.value=111;Insert(hh,ee);
ee.key=12;ee.value=112;Insert(hh,ee);
ee.key=13;ee.value=113;Insert(hh,ee);
ee.key=14;ee.value=114;Insert(hh,ee);
ee.key=15;ee.value=115;Insert(hh,ee);
ee.key=16;ee.value=116;Insert(hh,ee);
ee.key=17;ee.value=117;Insert(hh,ee);
ee.key=18;ee.value=118;Insert(hh,ee);
ee.key=19;ee.value=119;Insert(hh,ee);
//插入數(shù)據(jù)元素,關(guān)鍵字從20到30。
ee.key=20;ee.value=120;Insert(hh,ee);
ee.key=21;ee.value=121;Insert(hh,ee);
ee.key=22;ee.value=122;Insert(hh,ee);
ee.key=23;ee.value=123;Insert(hh,ee);
ee.key=24;ee.value=124;Insert(hh,ee);
ee.key=25;ee.value=125;Insert(hh,ee);
ee.key=26;ee.value=126;Insert(hh,ee);
ee.key=27;ee.value=127;Insert(hh,ee);
ee.key=28;ee.value=128;Insert(hh,ee);
ee.key=29;ee.value=129;Insert(hh,ee);
//插入數(shù)據(jù)元素,關(guān)鍵字從30到32。
ee.key=30;ee.value=130;Insert(hh,ee);
ee.key=31;ee.value=131;Insert(hh,ee);
ee.key=32;ee.value=132;Insert(hh,ee);
printf("count=%d\n",hh-count);
PrintTable(hh);//打印哈希表
Delete(hh,12);//刪除哈希表中關(guān)鍵字為12的數(shù)據(jù)元素。
printf("count=%d\n",hh-count);
PrintTable(hh);//打印哈希表
//在哈希表中查找關(guān)鍵字18。
Node*pp=LookUp(hh,18);
if(pp==0)printf("LookUp(18)failed.\n");
else
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 裝修墊資工程合同協(xié)議
- 裝修購(gòu)買協(xié)議書模板范本
- 苗木灌溉維修合同協(xié)議
- 裝修找熟人監(jiān)工合同協(xié)議
- 船租賃合同協(xié)議
- 設(shè)計(jì)思維的多維度分析試題及答案
- 整合營(yíng)銷中的廣告設(shè)計(jì)作用深度研究試題及答案
- 國(guó)際美術(shù)設(shè)計(jì)師考試多樣性試題及答案
- 胸腔外科面試題及答案
- 織物水洗穩(wěn)定性試驗(yàn)的標(biāo)準(zhǔn)試題及答案
- 2.4.1基于解析算法的問題解決課件人教-中圖版高中信息技術(shù)必修1
- 國(guó)測(cè)省測(cè)四年級(jí)勞動(dòng)質(zhì)量檢測(cè)試卷
- 2023年-2024年《西方經(jīng)濟(jì)學(xué)》考試題庫(kù)及答案
- 匠作匠場(chǎng)手風(fēng)滇南“一顆印”民居大木匠作調(diào)查研究
- 《道德經(jīng)》的智慧啟示智慧樹知到期末考試答案2024年
- 黔靈山景區(qū)介紹
- 交警酒駕案件培訓(xùn)課件
- 建筑企業(yè)材料成本管理
- 人衛(wèi)官方預(yù)防醫(yī)學(xué)課件下載
- 《雷達(dá)干擾技術(shù)概述》課件
- 中韓勞動(dòng)法比較研究
評(píng)論
0/150
提交評(píng)論