版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目 錄</b></p><p><b> 1 前言1</b></p><p><b> 2 需求分析1</b></p><p> 2.1 任務(wù)和要求1</p><p> 2.2 運行環(huán)境1</p><p>
2、 2.3 開發(fā)工具2</p><p><b> 3 分析和設(shè)計2</b></p><p> 3.1 系統(tǒng)分析及設(shè)計思路2</p><p> 3.2 主要數(shù)據(jù)結(jié)構(gòu)及算法2</p><p> 3.3 函數(shù)流程圖3</p><p> 4 具體代碼實現(xiàn)6</p><
3、;p> 5 課程設(shè)計總結(jié)15</p><p> 5.1 程序運行結(jié)果或預(yù)期運行結(jié)果15</p><p> 5.2 設(shè)計結(jié)論17</p><p><b> 參考文獻17</b></p><p><b> 致 謝17</b></p><p><b
4、> 1 前言</b></p><p> 從C語言產(chǎn)生到現(xiàn)在,它已經(jīng)成為最重要和最流行的編程語言之一。在各種流行編程語言中,都能看到C語言的影子,如Java的語法與C語言基本相同。學(xué)習(xí)、掌握C語言是每一個計算機技術(shù)人員的基本功之一。 </p><p> 根據(jù)本次課程設(shè)計的要求,我設(shè)計小組將編寫一個C語言程序來處理哈希表問題,通過這個程序,將針對自己的班集體中的“人名
5、”設(shè)計一個哈希表,使得平均查找長度不超過R,完成相應(yīng)的建表和查表程序。</p><p><b> 2 需求分析</b></p><p><b> 2.1 任務(wù)和要求</b></p><p> 針對自己的班集體中的“人名”設(shè)計一個哈希表,使得平均查找長度不超過R,完成相應(yīng)的建表和查表程序。</p><
6、;p> 要求:假設(shè)人名為中國姓名的漢語拼音形式。待填入哈希表的人名共有30個,取平均查找長度的上限為2。哈希函數(shù)用除留余數(shù)法構(gòu)造,用鏈表法處理沖突。</p><p><b> 2.2 運行環(huán)境</b></p><p> (1)WINDOWS2000/XP系統(tǒng)</p><p> ?。?)Visual C++ 6.0編譯環(huán)境或TC編譯環(huán)
7、境</p><p><b> 2.3 開發(fā)工具</b></p><p><b> C語言</b></p><p><b> 3 分析和設(shè)計</b></p><p> 3.1 系統(tǒng)分析及設(shè)計思路</p><p><b> ?。?)創(chuàng)建哈希
8、表</b></p><p> ?。?)姓名(結(jié)構(gòu)體數(shù)組)初始化 </p><p> ?。?) 用除留余數(shù)法構(gòu)建哈希函數(shù)</p><p> ?。?) 用鏈表法處理沖突</p><p><b> (3)查找哈希表</b></p><p> 在哈希表中進行查找,輸出查找的結(jié)果和關(guān)鍵字,并
9、計算和輸出查找成功的平均查找長度</p><p><b> (4) 顯示哈希表</b></p><p> 顯示哈希表的的格式:</p><p> 3.2 主要數(shù)據(jù)結(jié)構(gòu)及算法</p><p> 定義結(jié)構(gòu)體typedef struct hashtable創(chuàng)建哈希表</p><p> 定義函數(shù)
10、Hash_Init(HashTable ht)來對哈希表初始化</p><p> 定義函數(shù)Hash_Insert(HashTable ht, Node *node)來為哈希表分配地址</p><p> 定義函數(shù)Hash_Init(ht)輸入30個名字</p><p> 定義函數(shù)Hash_Create(HashTable ht)來求哈希表長度</p>
11、<p> 定義函數(shù)hash_output(HashTable h)來輸出哈希表</p><p> 定義函數(shù)Hash_Link()構(gòu)造鏈表函數(shù)</p><p> 定義函數(shù)int hash_search(int h[],int key)查找輸入的名字</p><p><b> 3.3 函數(shù)流程圖</b></p>
12、<p> ?。?)哈希表的創(chuàng)建及初始化流程圖 </p><p> 圖3.1 哈希表的創(chuàng)造及初始化流程圖</p><p> ?。?)創(chuàng)建哈希表鏈表的流程圖</p><p> 圖3.2 創(chuàng)造哈希表鏈表的流程圖</p><p> ?。?)查找輸入數(shù)據(jù)的流程圖</p><p&g
13、t; 圖3.3 查找輸入數(shù)據(jù)的流程圖</p><p><b> 4 具體代碼實現(xiàn)</b></p><p> #include <stdio.h></p><p> #include <string.h></p><p> #include <stdlib.h></p&
14、gt;<p> #include <conio.h></p><p> #define P 30 /*除數(shù)余留法中的除數(shù)*/</p><p> #define NULLKEY 0 </p><p> #define MAX 30 /*人名個數(shù)*/</p><p> #de
15、fine hashlen 30 /*哈希表長度*/</p><p> int sum=0,k=0;</p><p> typedef struct Node /*哈希表結(jié)構(gòu)體*/</p><p><b> {</b></p><p> char key_code[10]; /*哈希表地址*/</p&g
16、t;<p> struct Node *next;</p><p><b> }Node;</b></p><p> typedef struct hashtable /*創(chuàng)建哈希表*/ </p><p><b> {</b></p><p><b>
17、int key;</b></p><p> struct Node *next;</p><p> }HashTable[MAX];</p><p> int Hash(int key) </p><p><b> {</b></p><p>
18、int mode = key % P; /*除留余數(shù)法得到的余數(shù)*/</p><p> return mode;</p><p><b> }</b></p><p> void Hash_Init(HashTable ht) /*哈希表初始化*/ </p><p><b> {<
19、/b></p><p><b> int i;</b></p><p> for(i = 0; i < MAX; i++)</p><p><b> {</b></p><p> ht[i].key = NULLKEY;</p><p> ht[i].n
20、ext = NULL;</p><p><b> }</b></p><p><b> }</b></p><p> int CharToInt(char str[]){</p><p> return str[0]+str[1]+str[2];</p><p>&
21、lt;b> }</b></p><p> int Hash_Insert(HashTable ht, Node *node) /*為哈希表分配地址*/</p><p><b> {</b></p><p> int key = Hash(CharToInt(node->key_code));</p>
22、<p><b> Node *p;</b></p><p> p=(Node*)malloc(sizeof(Node));</p><p> if(ht[key].key == NULLKEY)</p><p><b> {</b></p><p> ht[key].key =
23、 key;</p><p> ht[key].next = node;</p><p><b> k++;</b></p><p><b> }</b></p><p> else if(ht[key].key == key) </p><p><
24、b> {</b></p><p> p = ht[key].next;</p><p><b> k++;</b></p><p> while(p->next!= NULL) </p><p><b> {</b></p><
25、;p> p = p->next;</p><p><b> k++;</b></p><p><b> }</b></p><p> p->next = node;</p><p><b> k++;</b></p><p>
26、<b> }</b></p><p><b> return 1;</b></p><p><b> }</b></p><p> Node* Hash_Search(HashTable ht, int key) /*查找函數(shù)*/</p><p><b>
27、{</b></p><p> int p0 = Hash(key);</p><p> if(ht[p0].key == NULLKEY) </p><p> {sum++;return NULL;} </p><p> else if(ht[p0].key == p0) </p>
28、<p><b> {</b></p><p> Node *p = ht[p0].next;</p><p> while(p != NULL)</p><p><b> {</b></p><p> if(CharToInt(p->key_code) == key)&
29、lt;/p><p> { sum++;</p><p><b> return p;</b></p><p><b> }</b></p><p> p = p->next;</p><p><b> sum++;</b></p&
30、gt;<p><b> }</b></p><p><b> }</b></p><p> return NULL;</p><p><b> }</b></p><p> int Hash_Create(HashTable ht) /*哈希表長度*/&
31、lt;/p><p><b> { </b></p><p><b> int i;</b></p><p> Node *node;</p><p> Hash_Init(ht);</p><p> printf("請輸入姓名:"); /*輸入30個
32、姓名*/</p><p> for(i=0;i<30;i++)</p><p><b> {</b></p><p> node = (Node *)malloc(sizeof(Node));</p><p> scanf("%s",node->key_code);</p&g
33、t;<p> node->next = NULL;</p><p> Hash_Insert(ht, node);</p><p><b> } </b></p><p> printf("\nCreate Successfully!\n");</p><p><b&
34、gt; return 1;</b></p><p><b> }</b></p><p> int hash_output(HashTable h) /*哈希表的輸出部分*/</p><p><b> { </b></p><p><b> Node *a;<
35、/b></p><p> int i,j,count2=0;</p><p> a=(Node*)malloc(sizeof(Node));</p><p><b> j=0;</b></p><p> for(i=0;i<hashlen;i++)</p><p><b&
36、gt; { </b></p><p> printf("%4d",i);</p><p> printf("%4d",h[i].key);</p><p> if(h[i].next!=0)</p><p><b> count2++;</b></p&
37、gt;<p><b> j=1;</b></p><p> a=h[i].next;</p><p><b> while(a)</b></p><p><b> {</b></p><p> printf("->%s",(*a
38、).key_code);</p><p> a=(*a).next;</p><p><b> j++;</b></p><p> count2+=j;</p><p><b> }</b></p><p> printf("\n");</
39、p><p><b> }</b></p><p> return count2;</p><p><b> }</b></p><p> void Hash_Link() /*鏈表法構(gòu)造函數(shù)*/</p><p><b> {&
40、lt;/b></p><p><b> int key;</b></p><p><b> int i;</b></p><p> Node *node;</p><p> HashTable ht;</p><p> Hash_Create(ht);<
41、/p><p> hash_output( ht);</p><p> printf("count=%d\n",k); /*查找總長度*/</p><p> printf("ASL=%d/8\n",k); /*平均查找長度*/</p><p> printf("請輸入要
42、查找的數(shù)據(jù):"); /*輸入查找的姓名*/</p><p> scanf("%s",&key);</p><p> node = Hash_Search(ht, key);</p><p> printf("查找次數(shù):%d\n",sum);</p><p> if(node !
43、= NULL)</p><p> printf("查找成功!");</p><p><b> else</b></p><p> printf("查找不成功!");</p><p><b> }</b></p><p> vo
44、id hash_create(int h[],int status[],int data)</p><p><b> {</b></p><p> int address;</p><p><b> int di;</b></p><p> address=data%P;</p>
45、<p> if(status[address]==0)</p><p><b> {</b></p><p> h[address]=data;</p><p> status[address]=1;</p><p><b> }</b></p><p&g
46、t;<b> else</b></p><p><b> {</b></p><p> for(di=1;di<=hashlen-1;di++)</p><p><b> {</b></p><p> address=((data%P)+di)%hashlen;
47、</p><p> if(status[address]==0)</p><p><b> {</b></p><p> h[address]=data;</p><p> status[address]=1;</p><p><b> break;</b><
48、/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> return ;</b></p><p><b> }</b>&l
49、t;/p><p> int hash_search(int h[],int key)</p><p> {int address, di;</p><p> address=key % P;</p><p> if(h[address]==key) /*哈希表中元素與查找元素是否相等*/</p><p&g
50、t;<b> return 1;</b></p><p><b> else </b></p><p><b> {</b></p><p> for(di=1;di<=hashlen-1;di++)/*哈希表中元素與查找元素不相等,查找下一元素*/</p><p&g
51、t;<b> {</b></p><p> address=((key%P)+di)%hashlen;</p><p> if(h[address]==key)</p><p><b> {</b></p><p> return di+1;</p><p>&l
52、t;b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(di>=hashlen)</p><p><
53、b> return 0;</b></p><p><b> }</b></p><p> int main() /*主函數(shù)*/</p><p><b> { </b></p><p> printf("\t\t\t***
54、*********************\n");</p><p> printf("\t\t\t 哈希表設(shè)計\n");</p><p> printf("\n");</p><p> printf("\t\t\t************************\n");</p&
55、gt;<p> printf("\n");</p><p> Hash_Link();</p><p><b> }</b></p><p><b> 5 課程設(shè)計總結(jié)</b></p><p> 5.1 程序運行結(jié)果或預(yù)期運行結(jié)果</p>&
56、lt;p> 圖5.1程序運行結(jié)果1</p><p> 圖5.2程序運行結(jié)果2</p><p> 說明:輸入的數(shù)為30個姓的拼音,查找的為“pan”,輸出的如上圖所示。</p><p><b> 5.2 設(shè)計結(jié)論</b></p><p> 通過這次課程設(shè)計,我了解到了許多自身的不足,有很多學(xué)習(xí)過的知識,在學(xué)
57、過之后并沒有反復(fù)的操作和復(fù)習(xí),以為課堂上聽懂就行了,在這課程設(shè)計中,這些不足就顯現(xiàn)了出來,導(dǎo)致經(jīng)常要翻書,查找一些以為弄懂的問題,這次我了解到了,學(xué)習(xí)不僅僅是課堂上聽講,還要課后復(fù)習(xí)和操作。</p><p> 課程設(shè)計是對我們這學(xué)期的學(xué)習(xí)成果的試金石,對我們來說是一個不小的考驗,它是我們專業(yè)課程知識綜合應(yīng)用的實踐訓(xùn)練。“自己動手,豐衣足食”,通過這次課程設(shè)計,我深深體會到這句千古名言的真正含義,只有理論知識是遠(yuǎn)
58、遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務(wù),從而提高自己的實際動手能力和獨立思考的能力。</p><p> 實驗過程中,也對團隊精神的進行了考察,讓我們在合作起來更加默契,在成功后一起體會喜悅的心情。果然是團結(jié)就是力量,只有互相之間默契融洽的配合才能換來最終完美的結(jié)果。</p><p><b> 參考文獻</b></
59、p><p> [1]張福祥. C語言程序設(shè)計[M]. 遼寧大學(xué)出版社,2008.1</p><p> [2] 張福祥,王萌.C語言程序設(shè)計習(xí)題解答與實驗實訓(xùn)[M].沈陽:遼寧大學(xué)出版社,2008.</p><p> [3] 牛莉,劉遠(yuǎn)軍等.計算機等級考試輔導(dǎo)教程[M].北京:中國鐵道出版社,2008.</p><p><b>
60、致 謝</b></p><p> 本次課程設(shè)計在選題及進行過程中得到xx老師的悉心指導(dǎo),xx老師嚴(yán)謹(jǐn)求實的治學(xué)態(tài)度,熱情洋溢的工作激情,將使我終生受益,在老師的影響下我學(xué)到了很多在書本上學(xué)不到的東西,我非常感謝她。謹(jǐn)再一次向xx老師致以誠摯的謝意和崇高的敬意。此外我還要感謝組內(nèi)的成員們,因為他們也幫我解決了不少難題,正是在大家的共同努力下,本次課程設(shè)計將隨著論文的完成劃上圓滿的句號!</p&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----哈希表設(shè)計
- 哈希表設(shè)計-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--哈希表設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---哈希表的設(shè)計與實現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計哈希表和運動會
- 數(shù)據(jù)結(jié)構(gòu)哈希表設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)哈希表設(shè)計
- 哈希表的設(shè)計與實現(xiàn)-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計任務(wù)書
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(迷宮問題)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--迷宮問題
- 課程設(shè)計——數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(八皇后問題)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計迷宮問題課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)順序表課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)迷宮問題課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計—迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---迷宮問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---迷宮問題
評論
0/150
提交評論