版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
計(jì)算機(jī)科學(xué)與技術(shù)系哈希表得設(shè)計(jì)與實(shí)現(xiàn)項(xiàng)目報(bào)告專業(yè)名稱計(jì)算機(jī)科學(xué)與技術(shù)項(xiàng)目課程數(shù)據(jù)結(jié)構(gòu)與算法項(xiàng)目名稱哈希表得設(shè)計(jì)與實(shí)現(xiàn)班級(jí)項(xiàng)目人員錢海峰,鄭秀娟,王傳敏,楊青,凌波實(shí)驗(yàn)日期2015、12、9目錄一.設(shè)計(jì)目得…………3二.問題分析…………3三.設(shè)計(jì)環(huán)境…………3四.人員分配…………3五。詳細(xì)設(shè)計(jì)與編碼…………………4六。實(shí)驗(yàn)分析…………71測(cè)試分析……………………72性能分析……………………11附錄……………………12參考書目………………17一.設(shè)計(jì)目得(1)掌握散列結(jié)構(gòu)與散列函數(shù)得相關(guān)概念(2)掌握散列結(jié)構(gòu)得存儲(chǔ)結(jié)構(gòu)得相關(guān)概念(2)掌握散列沖突得處理方法(3)運(yùn)用散列解決沖突問題。二.問題分析要完成如下要求:設(shè)計(jì)哈希表實(shí)現(xiàn)整數(shù)查詢系統(tǒng).實(shí)現(xiàn)本項(xiàng)目需要解決以下問題:(1)如何設(shè)計(jì)一個(gè)哈希表。(2)如何在哈希表中插入記錄.(3)如何刪除哈希表中得記錄.(4)如何查找并顯示記錄。(5)如何解決沖突問題.三.設(shè)計(jì)環(huán)境⒈硬件:計(jì)算機(jī)每人一臺(tái)。⒉軟件:Windows操作系統(tǒng)與MicrosoftVisualVC++6、0編譯器.四。人員分配負(fù)責(zé)人負(fù)責(zé)內(nèi)容錢海峰showHashTable(),menu()鄭秀娟insert(),search()王傳敏Sanlibiao、h,main、c,項(xiàng)目文檔楊青Hash(),createHashTable()凌波dele(),initHashTable()五。詳細(xì)設(shè)計(jì)與編碼1、定義結(jié)點(diǎn)結(jié)構(gòu)類型在鏈地址法中,每個(gè)結(jié)點(diǎn)對(duì)應(yīng)一個(gè)鏈表結(jié)點(diǎn),由3個(gè)域組成,結(jié)構(gòu)如圖9—1所示。其中,key為關(guān)鍵字域,存放結(jié)點(diǎn)關(guān)鍵字;data為數(shù)據(jù)域,存放結(jié)點(diǎn)數(shù)據(jù)信息;next為鏈域,存放指向下一個(gè)同義詞結(jié)點(diǎn)得指針.Keydatanext圖9—1鏈地址法結(jié)點(diǎn)結(jié)構(gòu)鏈地址數(shù)據(jù)結(jié)構(gòu)類型如下:#defineMAX_LENGTH50typedefstructnode{ intdata;?structnode*next;}ElemNode;typedefstruct{?ElemNode*first;}ElemHeader,HashTable[MAX_LENGTH];#include<stdio、h>2、對(duì)哈希函數(shù)得定義設(shè)計(jì)一個(gè)Hash()函數(shù),本設(shè)計(jì)中對(duì)散列函數(shù)選擇得就是除留余數(shù)法,即對(duì)關(guān)鍵字進(jìn)行模運(yùn)算,將運(yùn)算結(jié)果所得得余數(shù)作為關(guān)鍵字(或結(jié)點(diǎn))得存儲(chǔ)地址,即i=htmodn,本設(shè)計(jì)n由用戶自己輸入,然后將計(jì)算出來得結(jié)果返回。具體設(shè)計(jì)如下:intHash(intht){?inti;?i=ht%n; returni;}3、初始化散列鏈表初始化鏈地址散列算法只需要把散列表中所有表頭結(jié)點(diǎn)得指針域置為NULL。初始化散列鏈表得算法如下:voidinitHashTable(HashTableht,intn){?inti;?for(i=0;i<n;i++){ ht[i]、first=NULL;}}4、創(chuàng)建哈希表在整個(gè)設(shè)計(jì)中,創(chuàng)建哈希表必須就是第一步要做得,結(jié)點(diǎn)之前應(yīng)先輸入結(jié)點(diǎn)得個(gè)數(shù),利用鏈地址法解決沖突.添加結(jié)點(diǎn)實(shí)際就是調(diào)用了插入結(jié)點(diǎn)函數(shù)insert(),需要利用哈希函數(shù)計(jì)算出地址,其次將結(jié)點(diǎn)插入以關(guān)鍵字為地址得鏈表后。建立結(jié)點(diǎn)應(yīng)包括動(dòng)態(tài)申請(qǐng)內(nèi)存空間,想地址中輸入信息,同時(shí)最后一個(gè)結(jié)點(diǎn)中得next指針等于NULL.具體實(shí)現(xiàn)如下:intcreat(yī)eHashTable(HashTableht){?HashTable*p=ht;?intad[MAX_LENGTH]={0};?inti;?printf(”請(qǐng)輸入插入個(gè)數(shù)n:"); scanf(”%d”,&n);?printf("\n請(qǐng)輸入插入%d個(gè)整數(shù):",n);?for(i=0;i〈n;i++) ?scanf(”%d",&ad[i]); initHashTable(p,n);?for(i=0;i<n;i++) ?insert(p,ad[i]);?return1;5、散列鏈表插入結(jié)點(diǎn)算法將一個(gè)結(jié)點(diǎn)插入到散列鏈表中,其算法分為以下幾步:根據(jù)結(jié)點(diǎn)關(guān)鍵字計(jì)算散列地址;根據(jù)散列地址找到表頭結(jié)點(diǎn),并將結(jié)點(diǎn)插入到對(duì)應(yīng)得鏈表中.鏈地址法散列表得插入算法如下:voidinsert(HashTableht,intele){?inti; ElemNode*p;?i=Hash(ele); p=(ElemNode*)malloc(sizeof(ElemNode));?p—〉data=ele; p-〉next=ht[i]、first;?ht[i]、first=p;}6、散列鏈表查找結(jié)點(diǎn)算法在散列鏈表中查找一個(gè)結(jié)點(diǎn),其算法分為以下幾步:根據(jù)待查找關(guān)鍵字計(jì)算散列地址;在散列地址所指向得單鏈表中順序查找待查找關(guān)鍵字;如果找到待查關(guān)鍵字,則返回指向該結(jié)點(diǎn)得指針;否則返回NULL。散列鏈表中查找結(jié)點(diǎn)得算法如下:ElemNode*search(HashTableht,intele){ inti;?ElemNode*p; i=Hash(ele);?p=ht[i]、first;?while(p!=NULL&&p->data!=ele){?p=p—〉next; }?if(p?。剑蜺LL) { printf(”數(shù)據(jù)%d得位置為%d\n",ele,i); returnp;?}?else { printf("哈希表中無%d\n”,ele); returnp;?}}?7、散列鏈表刪除結(jié)點(diǎn)算法在散列表中刪除一個(gè)結(jié)點(diǎn),其算法分為兩步:查找要?jiǎng)h除得結(jié)點(diǎn);如果找到則刪除,否則顯示提示信息.在散列表中刪除一個(gè)結(jié)點(diǎn)得算法如下:voiddele(HashTableht,intele){//刪除指定數(shù)據(jù) inti;?ElemNode*p,*q;?i=Hash(ele); p=ht[i]、first; if(p==NULL){ ?printf("erroroccurred!"); } if(p—>data==ele){? ht[i]、first=p—>next;?}?else{ ?q=p->next; ?while(q!=NULL&&q—>data!=ele){???p=q;?? q=q—>next;??}??if(q==NULL){ printf(”erroroccurred?。?;? }? else{ ?p-〉next=q->next; free(q); } }}六。實(shí)驗(yàn)分析1、測(cè)試分析(1)建立哈希表(2)插入一個(gè)結(jié)點(diǎn)并顯示:查找結(jié)點(diǎn):在哈希表中沒有3這個(gè)數(shù),會(huì)輸出一行提示信息。刪除一個(gè)結(jié)點(diǎn)并顯示:2、性能分析散列法本質(zhì)上就是一種通過關(guān)鍵字直接計(jì)算存儲(chǔ)地址得方法。在理想情況下,散列函數(shù)可以把結(jié)點(diǎn)均勻地分布在散列表中,不發(fā)生沖突,則查找過程無需比較,其時(shí)間復(fù)雜度O(1)。但在實(shí)際使用過程中,為了將范圍廣泛得關(guān)鍵字映射到一組連續(xù)得存儲(chǔ)空間,往往會(huì)發(fā)生同義詞沖突,這時(shí)就需要進(jìn)行關(guān)鍵字比較. 能夠把關(guān)鍵字盡可能均勻地分布到散列表中得函數(shù)就是“好"得散列函數(shù)。好得散列函數(shù)可以有效地降低沖突得得發(fā)生,從而提高查找性能。但好得散列函數(shù)與關(guān)鍵字得數(shù)字特征有關(guān),因此不存在對(duì)任何結(jié)點(diǎn)都好得散列函數(shù).?對(duì)于同一種散列函數(shù),采用不同得沖突處理方法將產(chǎn)生不同得效果,例如線性探測(cè)法容易導(dǎo)致“二次聚集”,而拉鏈法可以從根本上杜絕二次聚集,從而提高查找性能。不過也會(huì)“浪費(fèi)”一部分散列表得空間。附錄****************************程序源代碼*********************************//頭文件sanlibiao、h#include<stdio、h>#include<stdlib、h>#defineMAX_LENGTH50typedefstructnode{?intdata;?structnode*next;}ElemNode;typedefstruct{?ElemNode*first;}ElemHeader,HashTable[MAX_LENGTH];intn;//存儲(chǔ)哈希表長(zhǎng)度voidinitHashTable(HashTableht,intn);voidinsert(HashTableht,intele);ElemNode*search(HashTableht,intele);voiddele(HashTableht,intele);intHash(intht);intcreateHashTable(HashTableht);voidshowHashTable(HashTableht);voidmenu(HashTableht);//菜單//功能函數(shù)sanlibiao、c#include"sanlibiao、h"voidinitHashTable(HashTableht,intn){//初始化 inti;?for(i=0;i〈n;i++){ ?ht[i]、first=NULL;?}}voidinsert(HashTableht,intele){//插入 inti; ElemNode*p; i=Hash(ele); p=(ElemNode*)malloc(sizeof(ElemNode));// p->key=ele; p->data=ele; p—〉next=ht[i]、first; ht[i]、first=p;}ElemNode*search(HashTableht,intele){//查找 inti;?ElemNode*p;?i=Hash(ele);?p=ht[i]、first;?while(p!=NULL&&p-〉data!=ele){ ?p=p->next; }?if(p?。絅ULL) { printf("數(shù)據(jù)%d得位置為%d\n",ele,i);? returnp;?}?else?{??printf("哈希表中無%d\n",ele);??returnp; }}?voiddele(HashTableht,intele){//刪除指定數(shù)據(jù) inti;?ElemNode*p,*q;?i=Hash(ele); p=ht[i]、first; if(p==NULL){ ?printf("erroroccurred!”);?}?if(p—>data==ele){ ht[i]、first=p->next; }?else{??q=p—〉next; while(q!=NULL&&q->data?。絜le){ ?p=q;???q=q—>next; }??if(q==NULL){?? printf(”erroroccurred!"); ?} else{? ?p—>next=q->next; ? free(cuò)(q);??} }}intHash(intht){//哈希函數(shù)?inti;?i=ht%n; returni;}intcreateHashTable(HashTableht)//創(chuàng)建哈希表{?HashTable*p=ht; intad[MAX_LENGTH]={0};?inti;?printf("請(qǐng)輸入插入個(gè)數(shù)n:");?scanf(”%d",&n); printf(”\n請(qǐng)輸入插入%d個(gè)整數(shù):",n);?for(i=0;i<n;i++)??scanf("%d",&ad[i]); initHashTable(p,n);?for(i=0;i<n;i++) ?insert(p,ad[i]);?return1;}voidshowHashTable(HashTableht)//顯示哈希表{?inti;?ElemNode*p;?//i=Hash(ele); for(i=0;i〈n;i++)?{ p=ht[i]、first;??if(p!=NULL)printf("位置%d上得數(shù)據(jù):",i); while(p!=NULL) ?{ ?printf("%d",p->data);? p=p->next; ?} if(ht[i]、first!=NULL)printf("\n"); }}voidmenu(HashTableht){?intp,h;//p菜單選擇;?do?{//??system("cls”);//清屏 printf("★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆\n”); printf(”☆★☆★\n”); printf("★☆**************?dú)g迎來到哈希表系統(tǒng)!***************★☆\n");? printf("☆★合肥學(xué)院?? ☆★\n");? printf(”★☆計(jì)算機(jī)科學(xué)與技術(shù)★☆\n”);??printf(”☆★錢海峰,鄭秀娟,王傳敏,楊青,凌波☆★\n”);? printf("☆★☆★\n”); ?printf("☆★※※※※※※※☆★\n");??printf("★☆※菜單※★☆\n”);? printf("☆★※※※※※※※☆★\n”);? printf(”☆★☆★\n”); ?printf(”★☆**************(1)-——?jiǎng)?chuàng)建哈希表******************★☆\n"); ?printf("☆★**************(2)—-—查找******************★☆\n”); printf("★☆**************(3)——-刪除******************★☆\n”);? printf(”☆★**************(4)—--插入 ******************★☆\n”);??printf(”★☆**************(5)—-—輸出哈希表******************★☆\n");??printf("☆★**************(0)--—退出******************☆★\n”);??printf("★☆********************************************
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《求職求職禮儀》課件
- 小學(xué)一年級(jí)20以內(nèi)100道口算題
- 小學(xué)三年級(jí)數(shù)學(xué)三位數(shù)加減法口算題
- 《創(chuàng)業(yè)課復(fù)習(xí)》課件
- 《菌種的概述》課件
- 有文采高考作文點(diǎn)評(píng)任是“無情”也動(dòng)人
- 《發(fā)票管理辦法學(xué)習(xí)》課件
- 娛樂休閑行業(yè)助理工作總結(jié)
- 養(yǎng)老院保安工作評(píng)價(jià)
- 體育行業(yè)助理的主要任務(wù)總結(jié)
- 電腦基礎(chǔ)知識(shí)
- 工程竣工預(yù)驗(yàn)收簽到表
- 靜鉆根植樁施工組織設(shè)計(jì)
- 工程精細(xì)化管理
- 2022年長(zhǎng)春市中小學(xué)教師筆試試題
- 小學(xué)音樂-(演唱)小拜年教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
- 醫(yī)院患者知情同意與告知制度
- 肉牛肉羊屠宰加工項(xiàng)目選址方案
- 人大版《精算模型(第3版)》習(xí)題解答
- 7人英語短劇劇本(5篇)
- 員工滿意度中英文對(duì)照外文翻譯文獻(xiàn)
評(píng)論
0/150
提交評(píng)論