




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、武漢理工大學數據結構課程設計說明書課程設計任務書學生姓名: xxx 專業(yè)班級: 計算機0502 指導教師: xxx 工作單位:計算機科學與技術學院 題 目: hash表的建立和查找初始條件:理論:學習了數據結構課程,掌握了基本的數據結構和常用的算法;實踐:計算機技術系實驗室提供計算機及軟件開發(fā)環(huán)境。要求完成的主要任務: (包括課程設計工作量及其技術要求,以及說明書撰寫等具體要求)1、系統(tǒng)應具備的功能:(1)設計哈希函數和哈希表;(2)設計解決沖突的方法;(3)輸入一組數據建立哈希表,并實現在哈希表中進行查找。2、數據結構設計;3、主要算法設計;4、編程及上機實現;5、撰寫課程設計報告,包括:(
2、1)設計題目;(2)摘要和關鍵字;(3)正文,包括引言、需求分析、數據結構設計、算法設計、程序實現及測試、結果分析、設計體會等;(4)結束語;(5)參考文獻。時間安排: 2007年7月2日7日 (第18周)7月2日 查閱資料7月3日 系統(tǒng)設計,數據結構設計,算法設計7月4日-5日 編程并上機調試7月6日 撰寫報告7月7日 驗收程序,提交設計報告書。指導教師簽名: 2007年7月2日系主任(或責任教師)簽名: 2007年7月2日hash表的建立和查找摘要: 本人設計了一個hash表的建立和查找系統(tǒng),其主要功能是,用戶可以手工輸入hash表元素個數和各個元素的數據內容,系統(tǒng)便相應地建立一個hash
3、表,(輸入錯誤時,系統(tǒng)會顯示輸入錯誤,并提示重新輸入);可對已建立的hash表進行多次查找,系統(tǒng)打印查找到的信息,用戶可以按提示信息退出系統(tǒng)。hash表采用結構體數組進行存儲,hash函數由除留余數法建立,沖突的解決采用線性探測。關鍵字: hash表,結構體數組,除留余數法,線性探測0.引言隨著時代的進步,科技的發(fā)展,信息時代已經來臨,在這樣的時代背景之下,人們迫切需要對信息進行存儲和查找,而數據結構成為了信息技術中極為重要的一門學科,發(fā)揮著關鍵作用。信息資料之多之雜之廣,使如何存儲和高效查找信息成為了一個很嚴肅的問題。本次課程設計中,我設計了一個小程序對用戶輸入的數據利用hash表進行存儲。
4、存儲完成后,用戶可利用hash表查找數據,速度十分快,可多次查找,也可按提示信息退出。1.需求分析本次課程設計需要實現hash表的建立和查找,具體內容如下:1.1 hash 表的建立建立hash函數,從而根據用戶輸入的數據元素個數和各元素的值建立hash 表,即數據的添加和存儲。如果輸入的元素個數超出規(guī)定范圍,則打印出錯信息,并提示重新輸入信息。1.2 hash 表的查找hash表建立好之后,用戶可以輸入想要查找的值,屏幕顯示相應信息。如果存在此值,屏幕顯示該值信息;如果不存在,則顯示該值不存在;如果想退出系統(tǒng),則按提示輸入命令。2.數據結構設計2.1定義結構體typedef structin
5、t key; /定義關鍵字int cn; /定義查找次數cnhashtable; /定義哈希表類型2.2定義結構體數組hashtable hthm; /定義哈希表空間3.算法設計3.1 hash函數該函數利用除留余數法實現“hash 函數”#define m 19 /不大于表長的最大質數status h(keytype key)/哈希函數return(key%m); /除留余數法/h3.2信息查找函數 這個函數能查找信息,它既能用于查找所輸入信息,又能在建立hash的時候被建立hash表的函數調用。用戶可以輸入想要查找的值,屏幕顯示相應信息。如果存在此值,屏幕顯示該值信息;如果不存在,則顯示該
6、值不存在;如果想退出系統(tǒng),則按提示輸入命令。status hashsearch(hashtable ht,keytype key)/哈希表查找函數int d,i;i=0;d=h(key); /求哈希地址=0; /記錄元素被查找的次數while(htd.key!=key)&(htd.key!=free)&(i=hm) /hash表已滿,插入失敗,返回unsuccessprintf(the hashtable is full!n);return(unsuccess);return(d); /若hd的關鍵字等于key說明查找成功/hashsearch3.3數據輸入函數此函數能夠對用戶輸入
7、的數據進行處理,即將輸入數據插入hash表中。它調用了hash函數。如果插入成功,顯示插入成功信息;如果插入不成功,則顯示插入不成功信息。status hashinsert(hashtable ht,keytype key)/哈希插入函數,插入成功返回success,插入不成功返回unsuccess/查找不成功的時候,將給定關鍵字key插入哈希表中int d;d=hashsearch(ht,key);if(htd.key=free) /插入成功htd.key=key;printf(insert success!n);return(success);else /插入不成功printf(uneuc
8、cess!n);return(unsuccess); /hashinseart3.4建立hash表函數此函數能夠根據用戶輸入的數據建立hash表,并將所有數據存入表中。如果輸入數據不和理(即輸入的數據長度大于或等于表長,或小于0),屏幕會提示錯誤信息,并提示用戶重新輸入正確的數據值;如果輸入數據合理(即輸入的表長大于等于0,小于表長),用戶就可以按提示信息輸入表元素,哈希表就會被成功建立。hash表的建立也利用了除留余數法,所以該函數調用了哈希表插入運算函數。void hashcreat(hashtable ht)/根據用戶輸入的信息建立一個哈希表int n;int i;int key1;pr
9、intf(input the number of the elements(less than the length of the list %d and no less than 0):n,hm); /提示輸入規(guī)定范圍內的長度scanf(%d,&n); /輸入表長if(n=20) /輸入不合理的表長度 printf(please input a length less than 20:n);/表長大于等于20else if(n0) printf(please input a length no less than 0:n);/表長小于0while(n=20) /輸入表長度合理scanf(%d
10、,&n);if(n=20) printf(please input a length less than 20:n); /表長大于等于20 else if(n0) printf(please input a length no less than 0:n); /表長小于0 for(i=0;in;i+) /依次插入用戶輸入的各個元素的數據printf(input the key word:n);scanf(%d,&key1); /輸入元素數據hashinsert(ht,key1); /調用哈希表插入運算/hashcreat3.5主要界面的設計void jiemian()/主界面設計hashtab
11、le ht0hm; /分配hash表的空間int key0=0; /初始化為0float key1=0; /初始化為0 int i;printf(build the hash list:n); /提示建立信息hashcreat(ht0); /建立hash表printf(now you can search in the hash list:n); /提示用戶查找printf(input the key word of the element required to searchn(if you want to exit ,input a figure bigger than 0 and sma
12、ll than 1.):n);scanf(%f,&key1); /輸入想要查找的數據key0=(int)key1;while(key1-(float)key0)=0)/多次查找輸入的數據,系統(tǒng)顯示相應結果/按提示退出系統(tǒng) i=hashsearch(ht0,key0); if(ht0i.key=key0) /存在該元素時 printf(%d exists in the list.n ,key0); /打印存在信息 printf(its pose is num.%dnn,i); /打印元素位置 else printf(there is no %d in the list.nn,key0);prin
13、tf(input the key word of the element required to searchn(if you want to exit ,input a figure bigger than 0 and small than 1.):n); /提示用戶退出 scanf(%f,&key1); /用戶繼續(xù)輸入數據 key0=(int)key1; /key0是key1的整數部分/jiemian3.6其他有關技術討論我這個程序選用結構體數組為存儲結構,實現了hash表的數據存儲。hash表查找給予一種盡可能不通過比較操作而直接得到記錄的存儲位置的想法而提出的一種特殊查找技術。它的基本
14、思想是通過記錄中關鍵字的值key為自變量,通過某一種確定的函數h,計算出函數值h(key)作為存儲地址,將相應的關鍵字的記錄存儲到對應的位置上。而在查找是仍需要用這個確定的函數h進行計算,獲得所要查找的關鍵字所在的記錄的存儲位置。除留余數法(division method)是用關鍵字key除以某個正整數m,所得余數作為哈希地址的方法。對應hash函數h(key)為:h(key)=key % m,一般情況下m 的取值為不大于表長的質數。開放定址發(fā)解決沖突,形成下一個地址的形式是: hi=(h(key)+di)%m i=1,2,k(k=m)其中,h(key)為哈希函數,m為某個正整數,di為增量序
15、列。線形探測再散列,是將開放定地址發(fā)中的增量di設定為一系列從1開始一直到表長減1的整數序列:1,2,3,,m-1(m為表長)。本系統(tǒng)對用戶在操作時可能進行的錯誤和違規(guī)操作,給出了基本的提示信息和解決方案,以便用戶在非法操作后得到意想不到的結果,即在根據用戶輸入的數據建立hash表并將所有數據存入表中時。如果輸入數據不和理(即輸入的數據長度大于或等于表長,或小于0),屏幕會提示錯誤信息,并提示用戶重新輸入正確的數據值;如果輸入數據合理(即輸入的表長大于等于0,小于表長),用戶就可以按提示信息輸入表元素,哈希表就會被成功建立。本系統(tǒng)對用戶在操作時可能進行的錯誤和違規(guī)操作,給出了基本的提示信息和解
16、決方案,以便用戶在非法操作后得到意想不到的結果。4.程序的實現4.1所有的函數聲明int h(int key)int hashsearch(hashtable ht,int key)int hashinsert(hashtable ht,int key)void hashcreat(hashtable ht)4.2主要方法的代碼實現4.2.1哈希表查找函數int hashsearch(hashtable ht,int key)/*哈希表查找函數*/int d,i;i=0;d=h(key); /*求哈希地址*/=0;while(htd.key!=key)&(htd.key!=free
17、)&(i=hm)printf(the hashtable is full!n);return(unsuccess);return(d); /*若hd的關鍵字等于key說明查找成功*/*hashsearch*/4.2.2哈希插入函數int hashinsert(hashtable ht,int key)/*哈希插入函數*/*查找不成功的時候,將給定關鍵字key插入哈希表中*/int d;d=hashsearch(ht,key);if(htd.key=free)htd.key=key;printf(insert success!n);return(success); /*插入成功*/elsepri
18、ntf(uneuccess!n);return(unsuccess); /*插入不成功*/*hashinseart*/4.2.3哈希表建立函數void hashcreat(hashtable ht)/*建立哈希表的函數*/int n;int i;int key1;printf(input the number of the elements(less than the length of the list %d and no less than 0):n,hm);scanf(%d,&n);if(n=20) /*輸入不合理的表長度*/ printf(please input a length l
19、ess than 20:n);else if(n0) printf(please input a length no less than 0:n);while(n=20) /*輸入表長度合理*/scanf(%d,&n);if(n=20) printf(please input a length less than 20:n); else if(n0) printf(please input a length no less than 0:n); for(i=0;in;i+)printf(input the key word:n);scanf(%d,&key1);hashinsert(ht,ke
20、y1); /*調用哈希表插入運算*/*hashcreat*/4.3程序運行結果4.3.1運行界面4.3.2輸入出錯提示界面4.3.3輸入元素超過hash表表長屆面4.3.4輸入正確建立hash表提示界面4.3.5根據提示建立hash表界面4.3.6輸入查找數據得到顯示數據界面4.3.7表中無輸入數據時的界面4.3.8用戶可按提示信息退出系統(tǒng)界面4.4結果分析用戶手工輸入數據并對輸入數據建立hash表,具有提示錯誤功能;另外就是對已建立的hash表進行查找,具有多次查找功能,并打印信息,可以按提示信息退出系統(tǒng)。本系統(tǒng)采用了hash表存儲,查找速度極其快,查找的時間復雜度為o(1)。本系統(tǒng)仍然存在
21、一些不足之處值得改進,例如:在建立hash表的過程中,如果用戶想退出系統(tǒng),也不得不在建立好hash表之后,才能實現。5.設計體會通過這次做課程設計,使我對數據結構這門課的認識更進一步,這門課確實是學好計算機程序設計的基礎。與此同時,自己對程序設計中應該注意的一些問題也有了自己的一些想法。首先,一個程序要達到正確性,可讀性,健壯性,高效率和低存儲量的要求,這樣用戶在使用程序的時候才會更加滿意,程序才能得到更多的關注。其次,要養(yǎng)成良好的編程習慣,在做一個程序之前,要對該程序的存儲結構,抽象數據類型和應該具備的功能以及各模塊之間的調用關系有一個總體的把握,畫出必要的算法流程圖或寫出必要的偽碼來表示各
22、模塊應該具備的功能。再次,在編寫程序的過程中應該對一些難于理解的地方加上必要的注釋,這樣會使在之后的調試與維護階段更加容易,在定義功能函數與變量時應該盡量采取有表征意義的名稱,這樣也可達到見名知意的效果。最后,在程序的調試階段,應該針對程序中用戶可能進行的錯誤操作給出解決的方法,要盡量選出幾組具有毀滅性的數據來進行測試,在程序不能正常處理的情況下要采取一些方案使這樣的問題得以解決。做程序是一個比較累的工作,特別是當遇到困難時,程序通不過時,真的很令人沮喪。但是改正一個錯誤時,那種喜悅心情也很令人期盼,這種心情堪比久旱見甘霖的喜悅。就是因為有這種令人身心愉悅的可能,我才得以能夠整晚不睡來改程序中
23、的不足之處。編程中有苦有樂,其中的苦樂只有親身經歷才能體會到。要想做出好的程序,必須做好忍受其間痛苦的準備。通過這個星期的課程設計,我的收獲還是不少。我的c語言水平有了比較大的提高,其中c語言關于指針,鏈表的操作理解的比以前深刻不少。另外是數據結構方面的提高,對存儲結構,及各種查找排序方面也有不少的提高。雖然我做的程序里還有寫問題,做的不夠深入,但獨立完成一個比較大一點的程序的經歷也是很寶貴的。6.結束語用戶手工輸入數據并對輸入數據建立hash表,具有提示錯誤功能;另外就是對已建立的hash表進行查找,具有多次查找功能,并打印信息,可以按提示信息退出系統(tǒng)。程序用turboc實現. 通過本次課程
24、設計,使我對數據結構這門課的認識更進一步,數據結構作為計算機專業(yè)的一門必修課,對如何編寫好的算法進行了比較深入的闡述,為我們寫出正確的,強壯的代碼奠定了基礎。在做課程設計的過程中,從查閱的相關資料和問題的解決中學到了不少的知識,因此對課本上的知識也有了更深入的了解。在此,深深的感謝任課教師和輔導老師對我的的熱心幫助,也感謝廣大同學們的關心和幫助參考文獻1 嚴蔚敏,吳偉民.數據結構,清華大學出版社,2001年1月2 劉懷亮.數據結構習題解析與實驗指導,冶金工業(yè)出版社 ,2005年2月3 譚浩強.數據結構,清華大學出版社,1999年12月ut2apodfxxc02gybkskcww97mrqqwh
25、oj5tl15zt6jipyytycummtarp3v1n5luizi3xh3bhwyreko8d9g7nmzqowpjetldrw08gvs8dsdqqygc3ce7moo2tlf0jf1gk74iuxybmtivr97ckrfvqult5fn2t6mpjr6rbzvpsortzvij5nb5ndvvsr4iwr1twlfkglspzuhrjq3cmzu98euouijdlszqpmvrw9zkupxf8wfug9l2g9277g2rtipa1ypczeuqxpkbhtvdcooqozxuz3vjrzmocijym62zchmeootyes8ebmm932tbz2yo09rtszeys8zr
26、d2yktj8l6jeazvajnfbtrylvsm6ofbftoxvrffn7owiygjlamkunxjybz5rrb7r4vsur9zpfzfmfsjhcfca37lnw2vvlrkn7r8psz1bn6oric5hu5z6hcxayqynpog8duybawqsl20csg06dh2sm8hltgpkicskrgopdpuhbj1lmpk7lydvc6nnmwl3fwhzftfvyaary7lhssxj10v3ph3y19bxyr77ib7cpzsu2tijqe3hkqkkau9kskcphkxuikvvyjzpg2yijrkqfbggovyqkuxnwi9omnjtt6qilzxty
27、rf7d20fbmabcfiixrqkusvnxbppfuxyq1fjskfsubkgs2duvqc9sz4jkbgn4qqv66pyoarjurnfj3txyfclzieeptwfjthpheipdfnqnr2hjqkv2dzwtmpdjqkbcxmovdsjqctjagjmdlskpgad2s0h0vmzgaht36gyuez7umank1ndreubeqdgrx0venqgnsyib2ilq3siqrnl4m56t7z8y8da5k0kupn5nzg4jvjdtffhyt82aogqkxo4vblmleiy2p7hthbho07rcfttxodydppdtqso7wxd0j6fkklgm4wodzplhtrr2xgqn13hqy59zu1gegdyqnihntavsieuefqcyfucjwd3vk5i7ykmhundmiz ut2apodfxxc02gybkskcww97mrqqwhoj5tl15zt6jipyytycummtarp3v1n5luizi3xh3bhwyreko8d9g7nmz
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廢物處理與回收合同書
- 農村土地承包合同管理與風險防控
- 教師勞動合同
- 標準域名轉讓合同書范本
- 挖機租賃業(yè)務合同
- 小額借款合同示例
- 糧食儲備庫租賃合同標準文本
- 家庭護理保姆服務合同細則
- 木材加工企業(yè)的設備更新與技術改造考核試卷
- 木制品三維建模與虛擬現實考核試卷
- 中國古典風格設計
- 市政綜合項目工程竣工項目驗收總結報告自評
- 2019譯林版高中英語全七冊單詞總表
- T-BJCC 1003-2024 首店、首發(fā)活動、首發(fā)中心界定標準
- 園區(qū)宣傳方案
- 銀行承兌匯票和商業(yè)承兌匯票課件
- 經口鼻吸痰法護理課件
- 《園林生態(tài)學》課件
- 初中化學實驗報告單(上)
- 貨物質量與安全控制方案
- 高中物理多普勒效應練習題
評論
0/150
提交評論