版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)說明書學(xué)院:信息科學(xué)與工程學(xué)院班級(jí):計(jì)算機(jī)科學(xué)與技術(shù)完成人:姓名:學(xué)號(hào):指導(dǎo)教師:山東科技大學(xué)2013年12月25日課程設(shè)計(jì)任務(wù)書一、課程設(shè)計(jì)題目:散列法的實(shí)驗(yàn)研究二、課程設(shè)計(jì)應(yīng)解決的主要問題:(1)數(shù)據(jù)元素的輸入和輸出(2)線性再散列法建立哈希表(3)二次探測(cè)再散列法建立哈希表(4)鏈地址法建立哈希表(5)線性再散列法進(jìn)行數(shù)據(jù)查找(6)二次探測(cè)再散列法進(jìn)行數(shù)據(jù)查找(7)鏈地址法進(jìn)行數(shù)據(jù)查找(8)退出系統(tǒng)三、任務(wù)發(fā)出日期:2013-10-01課程設(shè)計(jì)完成日期:2013-12-20小組分工說明小組編號(hào)7題目:散列法的實(shí)驗(yàn)研究小組分工情況:一人獨(dú)立完成所有工作。組長簽字:2013年12月31日指導(dǎo)教師對(duì)課程設(shè)計(jì)的評(píng)價(jià)成績:指導(dǎo)教師簽字:年月日1.需求分析說明-32.概要設(shè)計(jì)說明3.詳細(xì)設(shè)計(jì)說明4.調(diào)試分析-4-5-75.用戶使用說明6.課程設(shè)計(jì)總結(jié)7.測(cè)試結(jié)果-8-10-10-128.參考書目需求分析說明內(nèi)部排序教學(xué)軟件的總體功能要求:散列法中,散列函數(shù)構(gòu)造方法多種多樣,同時(shí)對(duì)于同一散列函數(shù)解決沖突的方法也可以不同。兩者是影響查詢算法性能的關(guān)鍵因素。對(duì)于幾種典型的散列函數(shù)構(gòu)造方法,做實(shí)驗(yàn)觀察,不同的解決沖突方法對(duì)查詢性能的影響?;竟δ苋缦拢海?)界面友好,易與操作。采用菜單方式進(jìn)行選擇。(2)實(shí)現(xiàn)三種方法進(jìn)行哈希表的構(gòu)造。包括線性再散列法、二次探測(cè)再散列法和鏈地址法。(3)根據(jù)三種構(gòu)造方法分別進(jìn)行數(shù)據(jù)元素的查找,若查找成功,則同時(shí)輸出探查/沖突次數(shù)。以下是各功能模塊的功能描述:1.主函數(shù)模塊本模塊的主要功能是初始化圖形界面,調(diào)用各模塊,實(shí)現(xiàn)功能。2.構(gòu)造哈希表子模塊本模塊的主要功能是采用線性再散列法、二次探測(cè)再散列法、鏈地址法三種方法構(gòu)造哈希表。3.查找功能及輸出子模塊本模塊的主要功能是在采用線性再散列法、二次探測(cè)再散列法、鏈地址法三種方法構(gòu)造哈希表后,采用相應(yīng)的方法對(duì)鍵入的數(shù)據(jù)進(jìn)行查找,并計(jì)算探查/沖突次數(shù)。4.輸入子模塊本模塊的主要功能是從鍵盤中輸入數(shù)據(jù)元素用于構(gòu)造哈希表。5.輸出子模塊本模塊的主要功能是將數(shù)據(jù)元素顯示在屏幕上。概要設(shè)計(jì)說明模塊調(diào)用圖:各種構(gòu)造方法的哈希表數(shù)據(jù)類型定義為:typedefstruct{intkey;/*關(guān)鍵字*/intsi;/*插入成功時(shí)的次數(shù)*/}HashTable1;/*哈希表線性探測(cè)再散列數(shù)據(jù)類型定義*/typedefstructHa{intelem;/*數(shù)據(jù)項(xiàng)*/structHa*next2;/*指向下一個(gè)結(jié)點(diǎn)的指針*/}HashTable2;/*哈希表鏈地址法數(shù)據(jù)類型定義*/typedefstruct{intelem[HashSize];/*表中儲(chǔ)存數(shù)據(jù)元素的數(shù)組*/intcount;/*表中儲(chǔ)存數(shù)據(jù)元素的個(gè)數(shù)*//*哈希表的尺寸*/intsize;}HashTable3;/*哈希表二次探測(cè)再散列法數(shù)據(jù)類型定義*/#defineHashSize53/*哈希表最大長度*/intnum;/*輸入數(shù)據(jù)的個(gè)數(shù)*/voidGetIn(int*a)/*從鍵盤輸入數(shù)據(jù)*/voidGetOut(int*a)/*在屏幕上輸出數(shù)據(jù)*/voidCreateHashTable1(HashTable1*H,int*a,intnum)/*線性探測(cè)在散列哈希表*/voidSearchHash1(HashTable1*h,intdata)/*線性探測(cè)在散列法查找*/voidCreateHashTable2(HashTable2*H,int*a,intnum)/*哈希表鏈地址*/intSearchHash2(HashTable2*h,intdata,intnum)/*鏈地址法查找*/voidCreateHash3(HashTable3*h,int*a,intnum)/*二次探索表*/intCollision(intp,intc)/*二次探測(cè)再散列法解決沖突*/voidSearchHash3(HashTable3*h,intdata)/*哈希表二次探索再散列查找*/intsystem(constchar*string)/*清屏*/詳細(xì)設(shè)計(jì)說明1.主函數(shù)模塊首先構(gòu)造三種類型的哈希表,并對(duì)哈希表進(jìn)行初始化。進(jìn)入循環(huán)后在屏幕上輸出相應(yīng)的操作指示,然后通過輸入0-8調(diào)用所選擇的函數(shù)進(jìn)行相應(yīng)操作。主函數(shù)代碼如下:intmain(){intdata,i;HashTable1hash1[HashSize];HashTable2hash2[HashSize];HashTable3*ha;/*定義三種類型的哈希表*/ha=(HashTable3*)malloc(sizeof(HashTable3));for(i=0;i<HashSize;i++)ha->elem[i]=0;ha->count=0;ha->size=HashSize;inta[HashSize];a[0]=0;/*哈希表的初始化*/while(1){printf("\nprintf("\n┏━━━━━━━━━━━━━━━┓");┃");┃歡迎使用本系統(tǒng)printf("\n┏〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒┓");printf("\n┃★★★★★★散列法的實(shí)驗(yàn)研究★★★★★┃");printf("\n┃【1】.添加數(shù)據(jù)信息┃");printf("\n┃printf("\n┃printf("\n┃【2】.數(shù)據(jù)的輸出┃");【3】.建立哈希表(線性再散列)┃");┃");【4】.建立哈希表(二次探測(cè)再散列)printf("\n┃printf("\n┃printf("\n┃printf("\n┃printf("\n┃【5】.建立哈希表(鏈地址法)【6】.線性再散列法查找【7】.二次探測(cè)再散列法查找【8】.鏈地址法查找┃");┃");┃");┃");┃");【0】.退出程序printf("\n┗〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒┛");printf("\n");printf("\n");printf("請(qǐng)輸入一個(gè)任務(wù)選項(xiàng)>>>");intx;scanf("%d",&x);switch(x){case1:GetIn(a);break;/*調(diào)用輸入函數(shù),從鍵盤鍵入需要添加的數(shù)據(jù)*//*若已有數(shù)據(jù)輸入,則調(diào)用數(shù)據(jù)輸出函數(shù)*/case2:if(a[0]==0)printf("您還沒有輸入任何數(shù)據(jù)!\n");elseGetOut(a);break;case3:/*調(diào)用函數(shù)用線性再散列法構(gòu)造哈希表*/if(a[0]==0)printf("您還沒有輸入任何數(shù)據(jù)!\n");elseCreateHashTable1(hash1,a,num);break;case4:/*調(diào)用函數(shù)用二次探測(cè)再散列法構(gòu)造哈希表*/if(a[0]==0)printf("您還沒有輸入任何數(shù)據(jù)!\n");elseCreateHash3(ha,a,num);break;case5:/*調(diào)用函數(shù)用鏈地址法構(gòu)造哈希表*/if(a[0]==0)printf("您還沒有輸入任何數(shù)據(jù)!\n");elseCreateHashTable2(hash2,a,num);break;case6:/*調(diào)用函數(shù)用線性再散列法查找*/if(a[0]==0)printf("您還沒有輸入任何數(shù)據(jù)!\n");else{printf("請(qǐng)輸入你查找的數(shù)據(jù)");scanf("%d",&data);SearchHash1(hash1,data);}break;case7:if(a[0]==0)/*調(diào)用函數(shù)用二次探測(cè)再散列法查找*/printf("您還沒有輸入任何數(shù)據(jù)!\n");else{printf("請(qǐng)輸入你查找的數(shù)據(jù)");scanf("%d",&data);SearchHash3(ha,data);}break;case8:/*調(diào)用函數(shù)用鏈地址法查找*/if(a[0]==0)printf("您還沒有輸入任何數(shù)據(jù)!\n");else{printf("請(qǐng)輸入你查找的數(shù)據(jù)");scanf("%d",&data);SearchHash2(hash2,data,num);}break;case0:/*退出系統(tǒng)*/exit(-1);break;}getchar();printf("\n請(qǐng)按回車鍵返回\n");getchar();system("cls");/*清屏*/}}2.查找功能及輸出子模塊根據(jù)題目要求,可將這個(gè)系統(tǒng)分為以下幾個(gè)模塊:1.線性再散列法建立哈希表:構(gòu)造哈希函數(shù)h(x)=h(key)%HashSize,當(dāng)沖突發(fā)生時(shí),地址增量di依次取1,2,···,HashSize-1自然數(shù)列,即di=1,2,···,HashSize-1。代碼如下:voidCreateHashTable1(HashTable1*H,int*a,intnum)//哈希表線性探測(cè)再散列{inti,d,cnt;for(i=0;i<HashSize;i++)/*給新哈希表初始化數(shù)據(jù)*/{H[i].key=0;H[i].si=0;}for(i=0;i<num;i++){cnt=1;d=a[i]%HashSize;/*構(gòu)造哈希函數(shù)*/if(H[d].key==0)/*無沖突時(shí),直接插入數(shù)據(jù)*/{H[d].key=a[i];H[d].si=cnt;}Else/*有沖突時(shí),進(jìn)行沖突處理后再插入*/{do{d=(d+1)%HashSize;cnt++;}while(H[d].key!=0);H[d].key=a[i];H[d].si=cnt;}}printf("\n線性再探索哈希表已建成!");}2.二次探測(cè)再散列法建立哈希表:構(gòu)造哈希函數(shù)h(x)=h(key)%HashSize,當(dāng)沖突發(fā)生時(shí),地址增量di依次取,,···,數(shù)列,即di=,,···,。代碼如下:typedefstruct{intelem[HashSize];/*表中儲(chǔ)存數(shù)據(jù)元素的數(shù)組*/intcount;/*表中儲(chǔ)存數(shù)據(jù)元素的個(gè)數(shù)*//*哈希表的尺寸*/intsize;}HashTable3;intCollision(intp,intc)/*二次探測(cè)再散列法解決沖突*/{inti,q;i=c/2+1;while(i<HashSize){if(c%2==0)/*增量為正數(shù)時(shí)*/{c++;q=(p+i*i)%HashSize;if(q>=0)returnq;elsei=c/2+1;}else{/*增量為負(fù)數(shù)時(shí)*/q=(p-i*i)%HashSize;c++;if(q>=0)returnq;elsei=c/2+1;}}return(-1);}voidCreateHash3(HashTable3*h,int*a,intnum)//二次探測(cè)再散列構(gòu)造哈希表{inti,p=-1,c,pp;for(i=0;i<num;i++){c=0;p=a[i]%HashSize;/*哈希函數(shù)*/pp=p;while(h->elem[pp]!=0)/*發(fā)生沖突*/{pp=Collision(p,c);c++;if(pp<0)/*沖突無法處理*/{printf("第%d個(gè)記錄無法解決沖突\n",i+1);continue;}}h->elem[pp]=a[i];h->count++;printf("第%d個(gè)記錄沖突次數(shù)為%d\n",i+1,c);}printf("\n建表完成\n此哈希表容量為%d,當(dāng)前表內(nèi)存儲(chǔ)的記錄個(gè)數(shù)%d.\n",num,h->count);}3.鏈地址法建立哈希表:將所有關(guān)鍵字為同義詞的記錄存儲(chǔ)在同一線性鏈表中。在鏈表中插入位置可以為表頭或表尾,也可以在中間,以保持同義詞在同一線性鏈表中按關(guān)鍵字有序。(本程序采用在表尾插入)代碼如下:typedefstructHa{intelem;/*數(shù)據(jù)項(xiàng)*/structHa*next2;/*指向下一個(gè)結(jié)點(diǎn)的指針*/}HashTable2;voidCreateHashTable2(HashTable2*H,int*a,intnum)//哈希表鏈地址構(gòu)造法{intkey,i;HashTable2*q,*qq;q=NULL;for(i=0;i<HashSize;i++)/*對(duì)哈希表進(jìn)行初始化*/{H[i].elem=0;H[i].next2=NULL;}for(i=0;i<num;i++){key=a[i]%HashSize;if(H[key].elem==0)H[key].elem=a[i];else{if(q!=NULL)/*若該位置已有數(shù)據(jù)*/{qq=q;q=q+1;q->elem=a[i];/*添加到已存在的結(jié)點(diǎn)后面*/q->next2=qq->next2;qq->next2=q;}else{q=(HashTable2*)malloc(sizeof(HashTable2));if(!q){printf("申請(qǐng)內(nèi)存失敗!請(qǐng)重新運(yùn)行程序\n");exit(1);}q->elem=a[i];/*添加到首結(jié)點(diǎn)后面*/q->next2=H[key].next2;H[key].next2=q;}}}printf("鏈表探索哈希表已建成!\n");}4.線性再散列法進(jìn)行查找:根據(jù)線性再散列法的構(gòu)造方式進(jìn)行相應(yīng)查找。代碼如下:voidSearchHash1(HashTable1*h,intdata){intd,i;d=data%HashSize;/*哈希函數(shù)*/i=d;if(h[d].key==data)/*一次查找成功*/printf("數(shù)字%d的探查次數(shù)為%d\n",h[d].key,h[d].si);else{while(i<HashSize&&h[d].key!=data){d=(d+1)%HashSize;i+=1;}if(i<HashSize)printf("數(shù)字%d的探查次數(shù)為%d.\n",h[d].key,h[d].si);elseprintf("沒有查找到你所輸入的數(shù)\n");}}5.二次探測(cè)再散列法進(jìn)行查找:根據(jù)二次探測(cè)再散列法的構(gòu)造方式進(jìn)行相應(yīng)查找。代碼如下:voidSearchHash3(HashTable3*h,intdata)//哈希表二次探索再散列查找{intc=0,p,pp;p=data%HashSize;pp=p;while((h->elem[pp])!=data&&pp!=-1){pp=Collision(p,c);c++;}if((h->elem[pp]!=0)&&(h->elem[pp])==data)printf("\n查找成功!\n查找沖突次數(shù)為%d.",c);elseprintf("\n沒有查到此數(shù)!\n");}6.鏈地址法進(jìn)行查找:根據(jù)鏈地址法的構(gòu)造方式進(jìn)行相應(yīng)查找。代碼如下:intSearchHash2(HashTable2*h,intdata,intnum){intd,cnt=1;HashTable2*q;d=data%HashSize;q=&h[d];/*哈希函數(shù)*/if(q->elem==0){/*該位置上沒有數(shù)據(jù)元素*/printf("沒有找到你要查找的那個(gè)數(shù)\n");return0;}while(q!=NULL){if(q->elem==data){printf("數(shù)字%d的查找次數(shù)為%d\n",data,cnt);return0;}elseif(q->next2!=NULL){q=q->next2;cnt++;}else{printf("沒有找到你要查找的那個(gè)數(shù)\n");return0;}}return0;}7.輸入函數(shù):從鍵盤中鍵入數(shù)據(jù)。代碼如下:voidGetIn(int*a){//輸入數(shù)據(jù)函數(shù)printf("輸入添加的個(gè)數(shù)");scanf("%d",&num);inti;for(i=0;i<num;i++)scanf("%d",&a[i]);printf("數(shù)據(jù)已經(jīng)輸入完畢!\n");}8.輸出函數(shù):在屏幕上輸出數(shù)據(jù)。代碼如下:voidGetOut(int*a){inti;printf("你所輸入的數(shù)據(jù)");for(i=0;i<num-1;i++)printf("%d,",a[i]);printf("%d.",a[num-1]);printf("\n輸出已完畢!");}調(diào)試分析我遇到的問題:●鏈地址法查找時(shí),原設(shè)計(jì)在有沖突時(shí)表尾插入,寫出的程序卻是在表頭進(jìn)行插入。在加入了一個(gè)判斷語句和移動(dòng)指針位置的語句后問題得到解決?!駡D形界面下輸入數(shù)據(jù)●在程序顯示結(jié)果后無法返
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 解決方案企業(yè)突發(fā)環(huán)境事件應(yīng)急預(yù)案管理d
- 2016河北道法試卷+答案+解析
- 初級(jí)會(huì)計(jì)實(shí)務(wù)-2021年5月16日下午初級(jí)會(huì)計(jì)職稱考試《初級(jí)會(huì)計(jì)實(shí)務(wù)》真題
- 初級(jí)會(huì)計(jì)經(jīng)濟(jì)法基礎(chǔ)-初級(jí)會(huì)計(jì)《經(jīng)濟(jì)法基礎(chǔ)》模擬試卷33
- 2024年中國智慧工廠行業(yè)市場(chǎng)集中度、競(jìng)爭格局及投融資動(dòng)態(tài)分析報(bào)告(智研咨詢)
- 二零二五年度高端個(gè)人咨詢服務(wù)合同2篇
- 基于深度學(xué)習(xí)的室外火災(zāi)煙霧目標(biāo)檢測(cè)
- 兒童安全知識(shí)宣傳
- 建筑與市政工程第三方質(zhì)量安全巡查的持續(xù)改進(jìn)與優(yōu)化方案
- 二零二五年度金融科技項(xiàng)目擔(dān)保回購合同范本3篇
- 福建省泉州市晉江市2024-2025學(xué)年七年級(jí)上學(xué)期期末生物學(xué)試題(含答案)
- 2025年春新人教版物理八年級(jí)下冊(cè)課件 第十章 浮力 第4節(jié) 跨學(xué)科實(shí)踐:制作微型密度計(jì)
- 2024-2025學(xué)年人教版數(shù)學(xué)六年級(jí)上冊(cè) 期末綜合試卷(含答案)
- 收養(yǎng)能力評(píng)分表
- 三年級(jí)上冊(cè)體育課教案
- 山東省桓臺(tái)第一中學(xué)2024-2025學(xué)年高一上學(xué)期期中考試物理試卷(拓展部)(無答案)
- 中華人民共和國保守國家秘密法實(shí)施條例培訓(xùn)課件
- 管道坡口技術(shù)培訓(xùn)
- 2024年全國統(tǒng)一高考英語試卷(新課標(biāo)Ⅰ卷)含答案
- 2024年認(rèn)證行業(yè)法律法規(guī)及認(rèn)證基礎(chǔ)知識(shí) CCAA年度確認(rèn) 試題與答案
- 皮膚儲(chǔ)存新技術(shù)及臨床應(yīng)用
評(píng)論
0/150
提交評(píng)論