C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)哈希表詳解_第1頁(yè)
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)哈希表詳解_第2頁(yè)
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)哈希表詳解_第3頁(yè)
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)哈希表詳解_第4頁(yè)
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)哈希表詳解_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論