版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
/合肥學(xué)院計(jì)算機(jī)科學(xué)和技術(shù)系課程設(shè)計(jì)報(bào)告2007~2008學(xué)年第2學(xué)期課程數(shù)據(jù)結(jié)構(gòu)和算法課程設(shè)計(jì)名稱哈希表的設(shè)計(jì)和實(shí)現(xiàn)學(xué)生姓名學(xué)號(hào)0604011026專業(yè)班級(jí)06計(jì)科(1)指導(dǎo)老師2008年9月課程設(shè)計(jì)題目:(哈希表的設(shè)計(jì)和實(shí)現(xiàn)的問題)設(shè)計(jì)哈希表實(shí)現(xiàn)電話號(hào)碼查詢系統(tǒng)。設(shè)計(jì)程序完成以下要求:(1)設(shè)每個(gè)記錄有下列數(shù)據(jù)項(xiàng):電話號(hào)碼、用戶名、地址;(2)從鍵盤輸入各記錄,分別以電話號(hào)碼和用戶名為關(guān)鍵字建立哈希表;(3)接受再哈希法解決沖突;(4)查找并顯示給定電話號(hào)碼的記錄;(5)查找并顯示給定用戶的記錄。問題分析和任務(wù)定義問題分析 要完成如下要求:設(shè)計(jì)哈希表實(shí)現(xiàn)電話號(hào)碼查詢系統(tǒng)。實(shí)現(xiàn)本程序須要解決以下幾個(gè)問題:如何設(shè)計(jì)一個(gè)結(jié)點(diǎn)使該結(jié)點(diǎn)包括電話號(hào)碼、用戶名、地址。如何分別以電話號(hào)碼和用戶名為關(guān)鍵字建立哈希表。如何利用再哈希法解決沖突。如何實(shí)現(xiàn)用哈希法查找并顯示給定電話號(hào)碼的記錄。如何查找并顯示給定用戶的記錄。任務(wù)定義由問題分析知,本設(shè)計(jì)主要要求分別以電話號(hào)碼和用戶名為關(guān)鍵字建立哈希表,并實(shí)現(xiàn)查找功能。所以本設(shè)計(jì)的核心問題是如何解決散列的問題,亦即設(shè)計(jì)一個(gè)良好的哈希表。由于結(jié)點(diǎn)的個(gè)數(shù)無法確認(rèn),并且假如接受線性探測(cè)法散列算法,刪除結(jié)點(diǎn)會(huì)引起“信息丟失”的問題。所以接受鏈地址法散列算法。接受鏈地址法,當(dāng)出現(xiàn)同義詞沖突時(shí),運(yùn)用鏈表結(jié)構(gòu)把同義詞鏈接在一起,即同義詞的存儲(chǔ)地址不是散列表中其他的空地址。首先,解決的是定義鏈表結(jié)點(diǎn),在鏈地址法中,每個(gè)結(jié)點(diǎn)對(duì)應(yīng)一個(gè)鏈表結(jié)點(diǎn),它由三個(gè)域組成,而由于該程序須要分別用電話號(hào)碼和用戶名為關(guān)鍵字建立哈希表,所以該鏈表結(jié)點(diǎn)它是由四個(gè)域組成.name[8]、num[11]和address[20]都是char浮點(diǎn)型,輸入輸出都只能是浮點(diǎn)型的。接受鏈地址法,其中的全部同義詞構(gòu)成一個(gè)單鏈表,再由一個(gè)表頭結(jié)點(diǎn)指向這個(gè)單鏈表的第一個(gè)結(jié)點(diǎn)。這些表頭結(jié)點(diǎn)組成一個(gè)一維數(shù)組,即哈希表。數(shù)組元素的下標(biāo)對(duì)應(yīng)由散列函數(shù)求出的散列地址。拉鏈法處理沖突的散列表結(jié)構(gòu):
3、主程序分析本題目最主要的要求是設(shè)計(jì)散列函數(shù),本程序須要設(shè)計(jì)兩個(gè)散列函數(shù)才能解決問題,程序須要分別為以電話號(hào)碼和用戶名為關(guān)鍵字建立哈希表。所以要分別以用戶名、號(hào)碼為關(guān)鍵字建立兩個(gè)散列函數(shù),詳細(xì)思路為:對(duì)于以號(hào)碼為關(guān)鍵字的散列函數(shù),是將十一個(gè)數(shù)字全部相加,然后對(duì)20求余。得到的數(shù)作為地址。對(duì)于以用戶名為關(guān)鍵字的散列函數(shù),是將全部字母的ASCLL碼值相加,然后對(duì)20求余。要添加用戶信息,即要有實(shí)現(xiàn)添加結(jié)點(diǎn)的功能的函數(shù),所以要設(shè)計(jì)一個(gè)必需包括一個(gè)輸入結(jié)點(diǎn)信息、添加結(jié)點(diǎn)的函數(shù);要實(shí)現(xiàn)查找函數(shù),則必需包括一個(gè)查找結(jié)點(diǎn)的函數(shù);另外還有一個(gè)必不行少的就是運(yùn)行之后要有一個(gè)主菜單,即要設(shè)計(jì)一個(gè)主函數(shù)(main())。4、測(cè)試數(shù)據(jù)的選擇最終,程序完成后要對(duì)程序進(jìn)行編譯調(diào)試,執(zhí)行后要選擇數(shù)據(jù)進(jìn)行測(cè)試,這里選擇的測(cè)試數(shù)據(jù)為:1、姓名:張三電話號(hào)碼:地址:合肥2、姓名:Jack電話號(hào)碼:地址:Shanghai三、概要設(shè)計(jì)和數(shù)據(jù)結(jié)構(gòu)選擇本設(shè)計(jì)涉及到的數(shù)據(jù)結(jié)構(gòu)為:哈希表。要求輸入電話號(hào)碼、用戶名、地址三個(gè)信息,并要求分別以電話號(hào)碼和用戶名為關(guān)鍵字進(jìn)行查找,所以本問題要用到兩個(gè)哈希函數(shù),進(jìn)行哈希查找。在鏈地址法中,每個(gè)結(jié)點(diǎn)對(duì)應(yīng)一個(gè)鏈表結(jié)點(diǎn),它由三個(gè)域組成,而由于該程序須要分別用電話號(hào)碼和用戶名為關(guān)鍵字建立哈希表,所以該鏈表結(jié)點(diǎn)它是由四個(gè)域組成,鏈地址法結(jié)點(diǎn)結(jié)構(gòu)如圖:name[8]num[11]address[20]next其中name[8]和num[11]是分別為以電話號(hào)碼和用戶名為關(guān)鍵字域,存放關(guān)鍵字(key);address[20](data)為結(jié)點(diǎn)的數(shù)據(jù)域,用來存儲(chǔ)用戶的地址。Next指針是用來指向下一個(gè)結(jié)點(diǎn)的地址。主要算法的流程圖如下:以號(hào)碼為關(guān)鍵字的Hash()函數(shù)流程圖取整型num[2]賦給key結(jié)束Key=key%20Key=key+(int)num[i]i++i從3起先取num[i]!=0開始取整型num[2]賦給key結(jié)束Key=key%20Key=key+(int)num[i]i++i從3起先取num[i]!=0開始以姓名為關(guān)鍵字的Hash()函數(shù)流程圖取整型name[0]賦給key2結(jié)束Key2=key%20Key2+=name[i]i++i從0起先取name[i]不為空開始取整型name[0]賦給key2結(jié)束Key2=key%20Key2+=name[i]i++i從0起先取name[i]不為空開始添加結(jié)點(diǎn)信息流程圖:利用用戶名為關(guān)鍵字插入拉鏈法處理沖突調(diào)用hash()函數(shù)調(diào)用hash()函數(shù)Newname指向newphoneNewphone=input()結(jié)束申請(qǐng)新的結(jié)點(diǎn)newphone,newname即新的號(hào)碼和名字起先申請(qǐng)專利起先利用用戶名為關(guān)鍵字插入拉鏈法處理沖突調(diào)用hash()函數(shù)調(diào)用hash()函數(shù)Newname指向newphoneNewphone=input()結(jié)束申請(qǐng)新的結(jié)點(diǎn)newphone,newname即新的號(hào)碼和名字起先按姓名查找流程圖:q不為空結(jié)束輸出無記錄輸出相應(yīng)記錄q=q->nextq不為空調(diào)用hash()函數(shù)中新結(jié)點(diǎn)q指向phone[key]->next起先q不為空結(jié)束輸出無記錄輸出相應(yīng)記錄q=q->nextq不為空調(diào)用hash()函數(shù)中新結(jié)點(diǎn)q指向phone[key]->next起先按號(hào)碼查找流程圖:起先調(diào)用hash2()函數(shù)中新結(jié)點(diǎn)q指向phone[key]->nextq不為空q=q->nextq不為空輸出無記錄輸出相應(yīng)記錄結(jié)束起先調(diào)用hash2()函數(shù)中新結(jié)點(diǎn)q指向phone[key]->nextq不為空q=q->nextq不為空輸出無記錄輸出相應(yīng)記錄結(jié)束主程序流程圖開開始Main()初始化散列鏈表(1)并為其動(dòng)態(tài)支配內(nèi)存空間初始化散列鏈表(2)并為其動(dòng)態(tài)支配內(nèi)存空間Menu()主菜單輸入選擇選擇1選6選7查找號(hào)碼find()查找用戶find2()輸出結(jié)果輸出結(jié)果選擇2選擇0選擇3選擇4選擇5進(jìn)行姓名散列l(wèi)ist2()姓名散列結(jié)果添加記錄apend()退出系統(tǒng)return0進(jìn)行號(hào)碼散列l(wèi)ist()清空creat();creat2()列表已清空號(hào)碼散列結(jié)果結(jié)束四、詳細(xì)設(shè)計(jì)和編碼首先定義結(jié)點(diǎn)結(jié)構(gòu)體類型,在鏈地址法中,每個(gè)結(jié)點(diǎn)對(duì)應(yīng)一個(gè)鏈表結(jié)點(diǎn),它由三個(gè)域組成,而由于該程序須要分別用電話號(hào)碼和用戶名為關(guān)鍵字建立哈希表,所以該鏈表結(jié)點(diǎn)它是由四個(gè)域組成,鏈地址法結(jié)點(diǎn)結(jié)構(gòu)如圖:name[8]num[11]address[20]next其中name[8]和num[11]是分別為以電話號(hào)碼和用戶名為關(guān)鍵字域(key),存放關(guān)鍵字;address[20]為結(jié)點(diǎn)的數(shù)據(jù)域(data),用來存儲(chǔ)用戶的地址信息。next指針是用來指向下一個(gè)結(jié)點(diǎn)的地址。unsignedintkey和unsignedintkey2分別被定義為電話號(hào)碼和用戶名關(guān)鍵字。程序的主要模塊如下:************************程序部分源代碼*************************建立節(jié)點(diǎn)structnode//建節(jié)點(diǎn){charname[8],address[20];//節(jié)點(diǎn)中要包含用戶名,用戶地址,電話號(hào)碼以及指向下一個(gè)結(jié)點(diǎn)的指針charnum[11];node*next;};typedefnode*pnode;//typedef可以為一個(gè)已有的數(shù)據(jù)類型聲明多個(gè)別名,這里為該類型聲明白兩個(gè)指針typedefnode*mingzi;node**phone;node**nam;node*a;對(duì)哈希函數(shù)的定義本程序要設(shè)計(jì)兩個(gè)hash()函數(shù),分別對(duì)應(yīng)電話號(hào)碼和用戶名。本設(shè)計(jì)中對(duì)散列函數(shù)選擇的是除留余數(shù)法,即對(duì)關(guān)鍵字進(jìn)行模運(yùn)算,將運(yùn)算結(jié)果所得的余數(shù)作為關(guān)鍵字(或結(jié)點(diǎn))的存儲(chǔ)地址,即H(key)=keymodp,本設(shè)計(jì)中p取20,然后將計(jì)算出來的數(shù)作為該結(jié)點(diǎn)的地址賦給key。詳細(xì)方法如下:以電話號(hào)碼為關(guān)鍵字建立哈希函數(shù)hash(charnum[11])。以用戶名為關(guān)鍵字建立哈希函數(shù)hash2(charname[8])。利用強(qiáng)制類型轉(zhuǎn)換,將用戶名的每一個(gè)字母的ASCLL碼值相加并且除以20后的余數(shù)。將計(jì)算出來的數(shù)作為該結(jié)點(diǎn)的地址賦給key2。************************程序部分源代碼*************************a)voidhash(charnum[11])//以電話號(hào)碼為關(guān)鍵字建立哈希函數(shù){key=(int)num[2];while(num[i]!=NULL){key+=(int)num[i];i++;}key=key%20;}b)voidhash2(charname[8])//以用戶名為關(guān)鍵字建立哈希函數(shù){inti=1;key2=(int)name[0];while(name[i]!=NULL){key2+=(int)name[i];i++;}key2=key2%20;}然后,建立結(jié)點(diǎn),并添加結(jié)點(diǎn),利用鏈地址法解決沖突。建立結(jié)點(diǎn)應(yīng)包括動(dòng)態(tài)申請(qǐng)內(nèi)存空間。向結(jié)點(diǎn)中輸入信息。同時(shí)將結(jié)點(diǎn)中的next指針等于null。添加結(jié)點(diǎn),首先須要利用哈希函數(shù)計(jì)算出地址即關(guān)鍵字,其次將該結(jié)點(diǎn)插入以關(guān)鍵字為地址的鏈表后,當(dāng)然由于分別以用戶名和電話號(hào)碼為關(guān)鍵字,所以分兩種狀況,假如以用戶名為關(guān)鍵字則調(diào)用voidhash2(charname[8])函數(shù),并且將結(jié)點(diǎn)插入對(duì)應(yīng)的散列鏈表中,假如以電話號(hào)碼為關(guān)鍵字則調(diào)用voidhash(charnum[11])函數(shù),并且將結(jié)點(diǎn)插入對(duì)應(yīng)的散列鏈表中。并且,須要兩個(gè)建立散列鏈表的函數(shù),分別動(dòng)態(tài)申請(qǐng)確定的空間,用于動(dòng)態(tài)申請(qǐng)散列鏈表。voidcreate()用來動(dòng)態(tài)創(chuàng)建以電話號(hào)碼為關(guān)鍵字的鏈表數(shù)組,voidcreate2()用來動(dòng)態(tài)創(chuàng)建以用戶名為關(guān)鍵字的鏈表數(shù)組。************************程序部分源代碼*************************voidcreate()//新建號(hào)碼節(jié)點(diǎn){inti;phone=newpnode[20];//動(dòng)態(tài)創(chuàng)建對(duì)象數(shù)組for(i=0;i<20;i++){phone[i]=newnode;phone[i]->next=NULL;}}voidcreate2()//新建姓名節(jié)點(diǎn){inti;nam=newmingzi[20];for(i=0;i<20;i++){nam[i]=newnode;nam[i]->next=NULL;}同樣,須要兩個(gè)顯示鏈表的函數(shù),利用for循環(huán)和while語句將表中信息按要求輸出來。3.哈希查找想要實(shí)現(xiàn)查找功能,同樣須要兩個(gè)查找函數(shù),無論以用戶名還是以電話號(hào)碼為關(guān)鍵字,首先,都須要利用hash函數(shù)來計(jì)算出地址。再通過比對(duì),假如是以電話號(hào)碼為關(guān)鍵字,比較其電話號(hào)碼是否相同,假如相同則輸出該結(jié)點(diǎn)的全部信息,假如以用戶名為關(guān)鍵字,則比較用戶名是否相同,假如相同則輸出該結(jié)點(diǎn)的全部信息。假如找不到和之對(duì)應(yīng)相同的,則輸出“無此記錄”。************************程序部分源代碼*************************a)、voidfind(charnum[11])//在以電話號(hào)碼為關(guān)鍵字的哈希表中查找用戶信息{ hash(num);node*q=phone[key]->next;while(q!=NULL){if(strcmp(num,q->num)==0)break;q=q->next;}if(q) printf("%s_%s_%s\n",q->name,q->address,q->num);elseprintf("無此記錄\n");}b)、voidfind2(charname[8])//在以用戶名為關(guān)鍵字的哈希表中查找用戶信息{hash2(name);node*q=nam[key2]->next;while(q!=NULL){if(strcmp(name,q->name)==0)break;q=q->next;}if(q) printf("%s_%s_%s\n",q->name,q->address,q->num);elseprintf("無此記錄\n");}主函數(shù)本程序須要?jiǎng)?chuàng)建一個(gè)主菜單和一個(gè)主函數(shù),主菜單便于用戶的運(yùn)用,主函數(shù)中,包括全部功能對(duì)應(yīng)的數(shù)值,使之和主菜單相對(duì)應(yīng)。主函數(shù)界面設(shè)計(jì)如下添加記錄查找記錄姓名散列號(hào)碼散列清空記錄退出系統(tǒng)4、程序數(shù)據(jù)測(cè)試當(dāng)程序設(shè)計(jì)出來后的測(cè)試數(shù)據(jù)為:1、姓名:張三電話號(hào)碼:地址:合肥2、姓名:Jack電話號(hào)碼:地址:Shanghai首先鍵入0,添加結(jié)點(diǎn)信息,然后按1進(jìn)行查找,分別進(jìn)行號(hào)碼和姓名查找,最終可在主菜單中,選擇號(hào)碼散列和姓名散列,由此查看程序運(yùn)行結(jié)果。至此,就解決了哈希表的設(shè)計(jì)和實(shí)現(xiàn)算法可能出現(xiàn)的各種問題,那么依據(jù)以上思路以及對(duì)問題的分析和對(duì)出現(xiàn)狀況的解決則可以寫出源程序。五、上機(jī)調(diào)試1、語法錯(cuò)誤及修改:程序是分塊寫的,調(diào)試時(shí)可以運(yùn)用分步調(diào)試的方式進(jìn)行,以便能查找看程序是在哪出錯(cuò)了。本算法運(yùn)用了鏈表結(jié)構(gòu)和鏈地址法解決沖突的問題,在以姓名為關(guān)鍵字的哈希表中要留意涉及ASCLL碼的類型轉(zhuǎn)換,要留意輸出不能是“%d”,否則不能輸出結(jié)果。編寫程序時(shí)要多留意程序中各種指針的運(yùn)用,還有各類變量的定義,函數(shù)的運(yùn)用。這些問題均可以依據(jù)編譯器的警告提示,對(duì)應(yīng)的將其解決。2、邏輯問題修改和調(diào)整:鏈表結(jié)構(gòu)方法雖然便利了運(yùn)行,但是增加了對(duì)算法過程的相識(shí)難度。在本程序中每一個(gè)函數(shù)中都須要涉及到指針的操作。所以須要細(xì)致分析函數(shù)中的指針指向。在插入結(jié)點(diǎn),查找結(jié)點(diǎn)時(shí)尤為突出。對(duì)于主菜單和主函數(shù)的對(duì)應(yīng),確定要一樣,這樣才能保證運(yùn)行時(shí)不會(huì)出錯(cuò)。 3、時(shí)間,空間性能分析:散列法本質(zhì)上是一種通過關(guān)鍵字干脆計(jì)算存儲(chǔ)地址的方法。在志向狀況下,散列函數(shù)可以把結(jié)點(diǎn)勻整地分布到散列表中,不發(fā)生沖突,則查找過程無需比較,其時(shí)間困難度O(n)=1。但在實(shí)際運(yùn)用過程中,為了將范圍廣泛的關(guān)鍵字映射到一組連續(xù)的存儲(chǔ)空間,往往會(huì)發(fā)生同義詞沖突,這時(shí)在查找過程中就須要進(jìn)行關(guān)鍵字比較。因此散列法的查找性能取決于3個(gè)因素:散列函數(shù)、沖突處理方法和填充因子。接受鏈地址法,可以從根本上杜絕“二次聚集”的發(fā)生,從而提高散列表的勻整度,提高查找性能,不過也會(huì)“奢侈”一部分散列表的空間。當(dāng)散列函數(shù)和沖突處理方法固定時(shí),散列法的查找性能就取決于散列表的填充因子。填充因子a=表中已有的結(jié)點(diǎn)數(shù)/表的長(zhǎng)度。填充因子a標(biāo)記表的添滿程度。很明顯,a越小則發(fā)生沖突的機(jī)會(huì)就越??;反之,a越大沖突的機(jī)會(huì)就越大,查找的性能也就越低。哈希表鏈地址法查找成功的平均查找長(zhǎng)度SNc=1+a/2。鏈地址法查找不成功的平均查找長(zhǎng)度Un滿足:Unc=a+e-a.由以上可以看出,散列表的平均查找長(zhǎng)度是填充因子的函數(shù),和散列表的長(zhǎng)度沒有關(guān)系,因此在實(shí)際應(yīng)用中,我們應(yīng)當(dāng)選擇一個(gè)適當(dāng)?shù)奶畛湟蜃?,以便把平均查找長(zhǎng)度限制在一個(gè)盡量小的范圍內(nèi)。 4、閱歷和體會(huì):本設(shè)計(jì)用到的數(shù)據(jù)結(jié)構(gòu)是哈希表,并且要實(shí)現(xiàn)查找功能,在剛拿到本問題時(shí),我首先想到的查找方法是依次查找,這就沒有用到哈希表,而本設(shè)計(jì)要求必需運(yùn)用哈希表這一存儲(chǔ)結(jié)構(gòu),另外本設(shè)計(jì)也可以用C++中的類來解決,可以用類來設(shè)計(jì)哈希表。六、用戶運(yùn)用說明 本程序運(yùn)行過程時(shí)帶有提示性語句,由于address[20]、name[8]和num[11]可以看出地址可輸入的最大字符數(shù)是20,姓名可輸入的最大字符數(shù)是8,電話號(hào)碼都為11位。在輸入的時(shí)候,用戶特別留意電話號(hào)碼的位數(shù)。實(shí)現(xiàn)添加結(jié)點(diǎn),將信息從鍵盤輸入,然后依據(jù)屏幕的提示進(jìn)行操作,由此,本設(shè)計(jì)的要求就可以被用戶實(shí)現(xiàn)了。七、測(cè)試結(jié)果程序主菜單:添加記錄:分別按電話號(hào)碼和姓名查找:分別輸出按姓名和號(hào)碼散列的結(jié)果:清空記錄:八、參考書目譚浩強(qiáng),《C語言程序設(shè)計(jì)》,北京:清華高校出版社,2005年7月第3版。王昆侖,李紅,《數(shù)據(jù)結(jié)構(gòu)和算法》,中國(guó)鐵道出版社,2007年6月第1版。李春葆,數(shù)據(jù)結(jié)構(gòu)題集,北京:清華高校出版社,1992年2月第一版。九、附錄************************程序源代碼**************************#include<stdio.h>#include<string.h>#defineNULL0unsignedintkey;//定義兩個(gè)關(guān)鍵字unsignedintkey2;int*p;structnode//建節(jié)點(diǎn)每個(gè)結(jié)點(diǎn)包括用戶姓名、地址、電話號(hào)碼、以及指向下一個(gè)結(jié)點(diǎn)的指針{charname[8],address[20];charnum[11];node*next;};typedefnode*pnode;//typedef可以為一個(gè)已有的數(shù)據(jù)類型聲明多個(gè)別名,這里為該類型聲明白兩個(gè)指針typedefnode*mingzi;node**phone;node**nam;node*a;voidhash(charnum[11])//哈希函數(shù),以電話號(hào)碼為關(guān)鍵字建立哈希函數(shù)//哈希函數(shù)的主旨是將電話號(hào)碼的十一位數(shù)字全部加起來{inti=3;key=(int)num[2];while(num[i]!=NULL){key+=(int)num[i];i++;}key=key%20;}voidhash2(charname[8])//哈希函數(shù)以用戶名為關(guān)鍵字建立哈希函數(shù) //利用強(qiáng)制類型轉(zhuǎn)換,將用戶名的每一個(gè)字母的ASCLL碼值相加并且除以20后的余數(shù){inti=1;key2=(int)name[0];while(name[i]!=NULL){key2+=(int)name[i];i++;}key2=key2%20;}node*input()//輸入節(jié)點(diǎn)信息,建立結(jié)點(diǎn),并將結(jié)點(diǎn)的next指針指空{(diào)node*temp;temp=newnode;//new的功能是動(dòng)態(tài)支配內(nèi)存,語法形式:new類型名T(初值列表temp->next=NULL;printf("請(qǐng)輸入姓名:\n");scanf("%s",temp->name);printf("輸入地址:\n");scanf("%s",temp->address);printf("輸入電話:\n");scanf("%s",temp->num);returntemp;//對(duì)于指針類型返回的是地址}intapend()//添加節(jié)點(diǎn){node*newphone;node*newname;newphone=input();newname=newphone;newphone->next=NULL;newname->next=NULL;hash(newphone->num);//利用哈希函數(shù)計(jì)算出對(duì)應(yīng)關(guān)鍵字的存儲(chǔ)地址hash2(newname->name);newphone->next=phone[key]->next;//利用電話號(hào)碼為關(guān)鍵字插入phone[key]->next=newphone;//是接受鏈地址法,拉鏈法處理沖突的散列表結(jié)構(gòu)newname->next=nam[key2]->next;//利用用戶名為關(guān)鍵字插入nam[key2]->next=newname;return0;}voidcreate()//新建節(jié)點(diǎn){inti;phone=newpnode[20];//動(dòng)態(tài)創(chuàng)建對(duì)象數(shù)組for(i=0;i<20;i++){phone[i]=newnode;phone[i]->next=NULL;}}voidcreate2()//新建節(jié)點(diǎn){inti;nam=newmingzi[20];for(i=0;i<20;i++){nam[i]=newnode;nam[i]->next=NULL;}}voidlist()//顯示列表{inti;node*p;for(i=0;i<20;i++){p=phone[i]->next;while(p){ printf("%s_%s_%s\n",p->name,p->address,p->num);p=p->next;}}}voidlist2()//顯示列表{inti;node*p;for(i=0;i<20;i++){p=nam[i]->next;while(p){ printf("%s_%s_%s\n",p->name,p->address,p->num);p=p->next;}}}voidfind(charnum[11])//在以電話號(hào)碼為關(guān)鍵字的哈希表中查找用戶信息{hash(num);node*q=phone[key]->next;while(q!=NULL){if(strcmp(num,q->num)==0)break;q=q->next;}if(q) print
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023六年級(jí)數(shù)學(xué)上冊(cè) 六 百分?jǐn)?shù)第7課時(shí) 用方程解百分?jǐn)?shù)問題 2列方程解決稍復(fù)雜的百分?jǐn)?shù)實(shí)際問題(2)教學(xué)實(shí)錄 蘇教版
- 文明禮儀演講稿模板集合5篇
- 物理教研組工作計(jì)劃三篇
- 五年級(jí)體育下冊(cè) 第十七課 游戲課:踏石過河、攻關(guān)教學(xué)實(shí)錄
- 第6課 拉拉手交朋友 一年級(jí)道德與法治上冊(cè)(2024版)教學(xué)實(shí)錄
- 第3單元第11課《趕赴火場(chǎng)-“系統(tǒng)時(shí)間”檢測(cè)模塊的應(yīng)用》教學(xué)實(shí)錄2023-2024學(xué)年清華大學(xué)版(2012)初中信息技術(shù)九年級(jí)下冊(cè)
- 邀請(qǐng)活動(dòng)的邀請(qǐng)函合集七篇
- 圣誕節(jié)活動(dòng)總結(jié)范文5篇
- -轉(zhuǎn)正述職報(bào)告
- 后勤年終工作總結(jié)15篇
- 常見皮膚病與護(hù)理
- 安全生產(chǎn)法律法規(guī)注冊(cè)安全工程師考試(初級(jí))試題與參考答案(2024年)一
- 2024年人教版小學(xué)六年級(jí)上學(xué)期期末英語試題與參考答案
- 華東師范大學(xué)《法學(xué)導(dǎo)論(Ⅰ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年公文寫作基礎(chǔ)知識(shí)競(jìng)賽試題庫及答案(共130題)
- 空壓機(jī)操作安全培訓(xùn)
- 數(shù)據(jù)管理制度完整
- 醫(yī)療組長(zhǎng)競(jìng)聘
- 防止食品安全傳染病
- 3外架專項(xiàng)施工方案
- 工程施工日志60篇
評(píng)論
0/150
提交評(píng)論