數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-通訊錄的制作_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-通訊錄的制作_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-通訊錄的制作_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-通訊錄的制作_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-通訊錄的制作_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

軟件學(xué)院課程設(shè)計(jì)報(bào)告書課程名稱 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 設(shè)計(jì)題目 通訊錄的制作 專業(yè)班級(jí) 軟件工程XXXX 學(xué)號(hào) XXXXXXXX 姓名 XXX 指導(dǎo)教師 XXX 2012年01月目錄TOC\o"1-5"\h\z\o"CurrentDocument"1、設(shè)計(jì)時(shí)間 3\o"CurrentDocument"2、設(shè)計(jì)目的 3\o"CurrentDocument"3、設(shè)計(jì)任務(wù) 3\o"CurrentDocument"4、設(shè)計(jì)內(nèi)容 3\o"CurrentDocument"需求分析 3\o"CurrentDocument"總體設(shè)計(jì) 4\o"CurrentDocument"本程序中用到的所有抽象數(shù)據(jù)類型的定義 4\o"CurrentDocument"主程序的流程 4\o"CurrentDocument"詳細(xì)設(shè)計(jì) 6\o"CurrentDocument"定義的所有數(shù)據(jù)類型 6\o"CurrentDocument"主函數(shù) 11\o"CurrentDocument"函數(shù)的調(diào)用關(guān)系圖 12\o"CurrentDocument"測(cè)試與分析 13測(cè)試 13\o"CurrentDocument"分析 19\o"CurrentDocument"附錄 19\o"CurrentDocument"5、總結(jié)與展望 28參考文獻(xiàn) 291設(shè)計(jì)時(shí)間2012年12月30日至2012年1月5日2設(shè)計(jì)目的數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)專業(yè)的核心課程,是計(jì)算機(jī)科學(xué)的算法理論基礎(chǔ)和軟件設(shè)計(jì)的技術(shù)基礎(chǔ)。數(shù)據(jù)結(jié)構(gòu)是實(shí)踐性很強(qiáng)的課程。課程設(shè)計(jì)是加強(qiáng)學(xué)生實(shí)踐能力的一個(gè)強(qiáng)有力手段。要求學(xué)生掌握數(shù)據(jù)結(jié)構(gòu)的應(yīng)用、算法的編寫、類C語(yǔ)言的算法轉(zhuǎn)換成C程序并上機(jī)調(diào)試的基本方法。課程設(shè)計(jì)要求學(xué)生在完成程序設(shè)計(jì)的同時(shí)能夠?qū)懗霰容^規(guī)范的設(shè)計(jì)報(bào)告。嚴(yán)格實(shí)施課程設(shè)計(jì)這一環(huán)節(jié),對(duì)于學(xué)生基本程序設(shè)計(jì)素養(yǎng)的培養(yǎng)和軟件工作者工作作風(fēng)的訓(xùn)練,將起到顯著的促進(jìn)作用。3設(shè)計(jì)任務(wù)設(shè)計(jì)任務(wù):針對(duì)你所在班集體中的“人名”,設(shè)計(jì)一個(gè)哈希表,使得平均查找長(zhǎng)度不超過(guò)R,完成相應(yīng)的建表和查找過(guò)程。設(shè)計(jì)要求:(1)每個(gè)人的信息至少包括姓名,電話,地址。至少包括對(duì)通訊錄的創(chuàng)建,添加和按姓名查找等功能。(2)假設(shè)人名為漢語(yǔ)拼音全拼形式,待插入哈希表的長(zhǎng)度為你所在班級(jí)的人數(shù)。哈希函數(shù)用除留余數(shù)法構(gòu)造,采用鏈地址法或二次探測(cè)再散列法解決沖突。(3)完成菜單設(shè)計(jì)。操作有必要的提示。實(shí)現(xiàn)提示:假設(shè)人名最大長(zhǎng)度不超過(guò)20,取碼可以采用折疊處理,將每個(gè)字符對(duì)應(yīng)的ASCII碼求和。4設(shè)計(jì)內(nèi)容需求分析(1)程序所需要達(dá)到的功能:是通過(guò)創(chuàng)建哈希表,實(shí)現(xiàn)通訊錄的創(chuàng)建,并通過(guò)哈希表的插入和查找使通訊錄可以任意進(jìn)行姓名、電話、地址的添加和相應(yīng)的查找。(2)輸入的形式和輸入值的范圍:姓名地址均使用漢語(yǔ)拼音全拼形式,電話使用數(shù)字,名片的添加不會(huì)超過(guò)班級(jí)總?cè)藬?shù)。(3)輸出的形式:若輸出整個(gè)哈希表內(nèi)容,則按照哈希表的每一項(xiàng)所對(duì)應(yīng)輸入內(nèi)容后,將整個(gè)名片表直接輸出;若單個(gè)查找,則只會(huì)出現(xiàn)查找時(shí)對(duì)應(yīng)的名片內(nèi)容。(4)測(cè)試數(shù)據(jù):輸入的名片個(gè)數(shù)應(yīng)該小于設(shè)定的電話本的記錄數(shù)量(<20),輸入的名片姓名的漢語(yǔ)拼音的長(zhǎng)度也應(yīng)小于設(shè)定的姓名的最大長(zhǎng)度(<20),只要在規(guī)定的輸入范圍內(nèi)輸入都能得到想要的結(jié)果,若超過(guò)了規(guī)定范圍,程序?qū)⒔Y(jié)束進(jìn)程??傮w設(shè)計(jì)本程序中用到的所有抽象數(shù)據(jù)類型的定義1、MAXSIZE:通訊錄的大小2、MAX_SIZE:通訊錄中姓名、電話、地址的最大長(zhǎng)度3、HASHSIZE:創(chuàng)建哈希表的容量4、SUCCESS:成功標(biāo)志位5、UNSUCCESS:失敗標(biāo)志位6、NA:存儲(chǔ)姓名、電話、地址的通用數(shù)據(jù)結(jié)構(gòu)7、record:通訊錄的結(jié)構(gòu)體8、status:一個(gè)int型值本程序中用來(lái)標(biāo)示返回值狀態(tài)9、eq方法:傳入兩個(gè)NA作為參數(shù),返回一個(gè)status,作用是比較兩個(gè)NA是否相同10、fold方法:傳入一個(gè)NA作為參數(shù),返回一個(gè)long,作用是將NA按照一定的算法轉(zhuǎn)換成數(shù)值型,作為hashCode11、collision:處理沖突,采用二次探測(cè)再散列法解決沖突12、CreateHash:創(chuàng)建哈希表,以電話號(hào)碼為關(guān)鍵字,建立相應(yīng)的散列表13、SearchHash:查找哈希表,在通訊錄里查找電話號(hào)碼關(guān)鍵字,若查找成功,顯示信息主程序的流程流程如下圖流程圖所示程序開(kāi)始T 圖一主程序的流程圖A基本信息顯示菜單一 /輸入i/定義節(jié)點(diǎn)類型 typedefstructRecord定義哈希表節(jié)點(diǎn)類型 typedefstructHashTable關(guān)鍵字比較——voideq()人名的折疊處理,將名字轉(zhuǎn)換成一個(gè)數(shù)值一一voidfold()建立哈希函數(shù) voidHash()建立解決沖突的方法 voidcollision()B.顯示菜單:按照指定的長(zhǎng)度建立通訊錄顯示通訊錄內(nèi)所有用戶信息添加新的用戶信息查找并顯示給定用戶名的記錄查找并顯示給定電話號(hào)碼的記錄顯示版本信息并退出通訊錄C.根據(jù)選項(xiàng)實(shí)際操作主函數(shù)voidmain()分別調(diào)用下面函數(shù)并對(duì)應(yīng)輸出voidprintf()錄入內(nèi)存內(nèi)容 voidgetin()顯示用戶信息 voidShowInformation()輸入新名片信息 voidinsert()創(chuàng)建哈希表 voidCreateHash()查找哈希表中的關(guān)鍵字 voidSearchHash()詳細(xì)設(shè)計(jì)定義的所有數(shù)據(jù)類型(1)定義通訊錄節(jié)點(diǎn)結(jié)構(gòu)體typedefstruct{ 〃每一條電話本記錄NAname;NAtel;NAadd;}Record;(2)定義哈希表節(jié)點(diǎn)結(jié)構(gòu)體

typedefstruct//哈希表Record*elem[HASHSIZE];//數(shù)據(jù)元素存儲(chǔ)基址intcount;//當(dāng)前數(shù)據(jù)元素個(gè)數(shù)intsize;〃當(dāng)前容量}HashTable;(3)關(guān)鍵字的比較Statuseq(NAx,NAy)//關(guān)鍵字比較,相等返回SUCCESS;否則返回UNSUCCESSif(strcmp(x,y)==0)returnSUCCESS;elsereturnUNSUCCESS;}StatusNUM_BER;typedefstruct//哈希表Record*elem[HASHSIZE];//數(shù)據(jù)元素存儲(chǔ)基址intcount;//當(dāng)前數(shù)據(jù)元素個(gè)數(shù)intsize;〃當(dāng)前容量}HashTable;(3)關(guān)鍵字的比較Statuseq(NAx,NAy)//關(guān)鍵字比較,相等返回SUCCESS;否則返回UNSUCCESSif(strcmp(x,y)==0)returnSUCCESS;elsereturnUNSUCCESS;}StatusNUM_BER;//記錄的個(gè)數(shù)(4)對(duì)姓名的折疊處理longfold(NAs)//姓名的折疊處理,就是將名字轉(zhuǎn)換成一個(gè)數(shù)值char*p;longsum=0;NAss;strcpy(ss,s);//復(fù)制字符串不改變?cè)址拇笮?,將字符串ss轉(zhuǎn)換為大寫形式p=ss;while(*p!='\0')sum+=*p++;//將字符串轉(zhuǎn)換成一個(gè)int型的值用于hash表的計(jì)算比較returnsum;(5)建立哈希函數(shù)intHash1(NAstr)〃哈希函數(shù)longn;intm;n=fold(str);//先將用戶名進(jìn)行折疊處理n=fold(str);m=n%HASHSIZE;〃折疊處理后的數(shù),用除留余數(shù)法構(gòu)造哈希函數(shù)m=n%HASHSIZE;〃折疊處理后的數(shù),用除留余數(shù)法構(gòu)造哈希函數(shù)returnm; 〃并返回模值)(6)解決沖突Statuscollision(intp,intc){ //沖突處理函數(shù),采用二次探測(cè)再散列法解決沖突inti,q;i=c/2+1;while(i<HASHSIZE){if(c%2==0){c++;q=(p+i*i)%HASHSIZE;if(q>=0)returnq;elsei=c/2+1;returnUNSUCCESS;}else{q=(p-i*i)%HASHSIZE;c++;if(q>=0)returnq;elsei=c/2+1;returnUNSUCCESS;}}returnUNSUCCESS;}(7)創(chuàng)建以姓名為關(guān)鍵字哈希表voidCreateHash1(HashTable*H,Record*a){ //建表,以姓名為關(guān)鍵字,建立相應(yīng)的散列表〃若哈希地址沖突,進(jìn)行沖突處理inti,p=-1,c,pp;for(i=0;i<NUM_BER;i++){ c=0;p=Hash1(a[i].name);pp=p;while(H->elem[pp]!=NULL){pp=collision(p,c);if(pp<0)continue;}//無(wú)法解決沖突,跳入下一循環(huán)}H->elem[pp]=&(a[i]); //求得哈希地址,將信息存入H->count++;)(8)查找以姓名為關(guān)鍵字的哈希表voidSearchHash1(HashTable*H,intc){ //在通訊錄里查找姓名關(guān)鍵字,若查找成功,顯示信息intp,pp; //c用來(lái)記錄沖突次數(shù),查找成功時(shí)顯示沖突次數(shù)NAstr;p=Hash1(str);pp=p;while((H->elem[pp]!=NULL)&&(eq(str,H->elem[pp]->name)==-1))pp=collision(p,c);if(H->elem[pp]!=NULL&&eq(str,H->elem[pp]->name)==1)returnSUCCESS;elsereturnUNSUCCESS;)(9)創(chuàng)建以電話號(hào)碼為關(guān)鍵字的哈希表voidCreateHash2(HashTable*H,Record*a){ //建表,以電話號(hào)碼為關(guān)鍵字,建立相應(yīng)的散列表〃若哈希地址沖突,進(jìn)行沖突處理inti,p=-1,c,pp;for(i=0;i<NUM_BER;i++){c=0;p=Hash2(a[i].tel);pp=p;while(H->elem[pp]!=NULL){pp=collision(p,c);if(pp<0)continue;}H->elem[pp]=&(a[i]); //求得哈希地址,將信息存入H->count++;}}(10)查找以電話號(hào)碼為關(guān)鍵字的哈希表voidSearchHash2(HashTable*H,intc){ //在通訊錄里查找電話號(hào)碼關(guān)鍵字,若查找成功,顯示信息//c用來(lái)記錄沖突次數(shù),查找成功時(shí)顯示沖突次數(shù)intp,pp;NAtele;p=Hash2(tele);pp=p;while((H->elem[pp]!=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))pp=collision(p,c);if(H->elem[pp]!=NULL&&eq(tele,H->elem[pp]->tel)==1)returnSUCCESS;elsereturnUNSUCCESS;)(11)錄入內(nèi)存內(nèi)容voidgetin(Record*a) 〃錄入通訊錄的內(nèi)容,傳入一個(gè)record的指針,然后針對(duì)這個(gè)指針指向的內(nèi)存記錄進(jìn)行操作{inti;scanf("%d”,&NUM_BER); 〃輸入要?jiǎng)?chuàng)建通訊錄的人數(shù)for(i=0;i<NUM_BER;i++)scanf(a[i].name,a[i].tel,a[i].add);)(12)插入新名片信息intinsert(Record*a) 〃插入新同學(xué)的方法{inti;if(NUM_BER>=HASHSIZE)return0;else{scanf(a[NUM_BER].name); //輸入要新增名片的姓名for(i=0;i<NUM_BER;i++){if(strcmp(a[i].name,a[NUM_BER].name)==0)return0;}//此名片已經(jīng)存在,重新輸入scanf(a[NUM_BER].tel); //輸入要新增名片的電話號(hào)碼for(i=0;i<NUM_BER;i++){if(strcmp(a[i].tel,a[NUM_BER].tel)==0)return0;}//此號(hào)碼已經(jīng)存在,重新輸入

scanf(a[NUM_BER].add); //輸入要新增名片的地址NUM_BER++;return1;}}(13)顯示輸入的用戶信息voidShowInformation(Record*a) 〃顯示輸入的用戶信息{inti;for(i=0;i<NUM_BER;i++)printf(a[i].name,a[i].tel,a[i].add);}主函數(shù)intmain()(Recorda[MAXSIZE];intc,flag=1,i;intnum;HashTable*H;H二(HashTable*)malloc(LEN);for(i=0;i<HASHSIZE;i++)(H->elem[i]=NULL;H->size二HASHSIZE;H->count=0;)getch();while(flag) 〃當(dāng)前永真,也可以讓退出方法將flag賦值為0然后下次循環(huán)的時(shí)候退出程序scanf("%d",&num); //按照具體菜單輸入需要執(zhí)行的數(shù)字switch(num){case1:getin(a);break;ShowInformation(a);break;c=0;CreateHash1(H,a);SearchHash1(H,c);break;c=0;CreateHash2(H,a);SearchHash2(H,c);break;if(!insert(a))returnUNSUCCESS;elsereturnSUCCESS;break;case0:getch();exit(1);default:)}system("pause");return0; //程序結(jié)束4.3.3函數(shù)的調(diào)用關(guān)系圖函數(shù)調(diào)用關(guān)系圖如下圖所示 新增同學(xué)調(diào)用voidgetin() 圖二函數(shù)的調(diào)用關(guān)系圖4.4測(cè)試與分析4.4.1測(cè)試(1)打開(kāi)程序,會(huì)“按任意鍵開(kāi)始程序?”字樣,然后按任意鍵開(kāi)始程序,顯示主菜單界面如下:然后輸入你的選擇,進(jìn)入你所要進(jìn)行的操作中。(2)選擇“1”,按照指定的長(zhǎng)度建立通訊錄,則有下圖:輸入要?jiǎng)?chuàng)建的通訊錄人數(shù),設(shè)為3,則輸入“3”,則有下圖:輸入第一個(gè)記錄的用戶名,輸入“由。照丫印2",則有下圖:輸入第一個(gè)記錄的電話號(hào)碼,輸入“”,則有下圖:輸入第一個(gè)記錄的地址,輸入“乂合卜0/,,則有下圖:故已經(jīng)輸入完一個(gè)名片信息,繼續(xù)輸入另外兩個(gè)名片信息,則有下圖:31c31c31c31c31c 31c31c21c31c31c31c請(qǐng)選擇操作:1輸入要?jiǎng)?chuàng)建通訊錄的人數(shù)二3請(qǐng)輸入第1個(gè)記錄的用戶名:chengyujia請(qǐng)輸入第1個(gè)記錄的電話號(hào)碼輸入第1個(gè)記錄的地址:suzhou請(qǐng)輸入第2個(gè)記錄的用戶名:lishengqiang請(qǐng)輸入第2個(gè)記錄的電話號(hào)碼輸入第2個(gè)記錄的地址:tieling請(qǐng)輸入第3個(gè)記錄的用戶名:liuyu請(qǐng)輸入第3個(gè)記錄的電話號(hào)碼輸入第3個(gè)記錄的地址:benxi當(dāng)輸入最后一個(gè)信息后,確認(rèn)后返回開(kāi)始菜單,如下圖:

(3)選擇“2”,顯示通訊錄內(nèi)所有用戶信息,則有下圖:然后有返回初始菜單,繼續(xù)選擇。(4)選擇“3”,添加新的用戶信息,則有下圖:按照(2)的方式繼續(xù)輸入一個(gè)名片信息,確認(rèn)后,則有下圖:然后有返回初始菜單,繼續(xù)選擇。(5)選擇“4”,查找并顯示給定用戶名的記錄,則有下圖:輸入要查找的記錄姓名,輸入—ishengqiang”,則有下圖:然后有返回初始菜單,繼續(xù)選擇。(6)選擇“5”,查找并顯示給定電話號(hào)碼的記錄,則有下圖:繼續(xù)輸入“”,則有下圖:然后有返回初始菜單,繼續(xù)選擇。(7)選擇“0”,顯示通訊錄信息并退出通訊錄,則有下圖:然后按任意鍵退出程序。4.4.2分析調(diào)試過(guò)程中我認(rèn)為比較復(fù)雜的是用哈希表的二次探測(cè)再散列法解決沖突的算法不是特別容易研究明白,故對(duì)整個(gè)哈希表的定義與執(zhí)行都是個(gè)不小的挑戰(zhàn),于是我設(shè)法通過(guò)查詢資料,對(duì)其算法進(jìn)行了仔細(xì)的分析,只要將二次探測(cè)再散列法的數(shù)學(xué)關(guān)系式琢磨透了,對(duì)于算法的表達(dá)就容易多了。因?yàn)槎翁綔y(cè)再散列法是對(duì)出現(xiàn)沖突后,進(jìn)行的擺動(dòng)數(shù)列的方法解決沖突,其中需要考慮數(shù)據(jù)的變化、符號(hào)的改變和位置的準(zhǔn)確移動(dòng),所以數(shù)學(xué)關(guān)系式思考起來(lái)比較麻煩。4.5附錄#include<stdio.h>#include<stdlib.h>#include<string.h>#defineMAXSIZE20〃電話薄記錄數(shù)量#defineMAXSIZE20〃人名的最大長(zhǎng)度#defineHASHSIZE31〃定義表長(zhǎng)#defineMAXSIZE20〃電話薄記錄數(shù)量#defineMAXSIZE20〃人名的最大長(zhǎng)度#defineHASHSIZE31〃定義表長(zhǎng)#defineSUCCESS1#defineUNSUCCESS-1

#defineLENsizeof(HashTable)typedefintStatus;typedefcharNA[MAX_SIZE];typedefstruct{NAname;NAtel;#defineLENsizeof(HashTable)typedefintStatus;typedefcharNA[MAX_SIZE];typedefstruct{NAname;NAtel;NAadd;}Record;typedefstruct{Record*elem[HASHSIZE];intcount;intsize;}HashTable;Statuseq(NAx,NAy){//hashTable的長(zhǎng)度〃每一條電話本記錄//哈希表//數(shù)據(jù)元素存儲(chǔ)基址//當(dāng)前數(shù)據(jù)元素個(gè)數(shù)〃當(dāng)前容量//關(guān)鍵字比較,相等返回SUCCESS;否則返回UNSUCCESSif(strcmp(x,y)==0)returnSUCCESS;elsereturnUNSUCCESS;}StatusNUM_BER; 〃記錄的個(gè)數(shù)longfold(NAs){ //人名的折疊處理,就是將名字轉(zhuǎn)換成一個(gè)數(shù)值char*p;longsum=0;NAss;strcpy(ss,s); //復(fù)制字符串,不改變?cè)址拇笮?/strupr(ss);//將字符串ss轉(zhuǎn)換為大寫形式p=ss;while(*p!='\0')sum+=*p++; //將字符串轉(zhuǎn)換成一個(gè)int型的值用于hash表的計(jì)算比較printf("\n%s的轉(zhuǎn)換hashCode是%ld\n”,s,sum);returnsum;〃哈希函數(shù)intHash1(NAstr){longn;intm;

〃哈希函數(shù)n=fold(str);m=n%HASHSIZE;returnm;)n=fold(str);m=n%HASHSIZE;returnm;)intHash2(NAstr)(longn;intm;n=atoi(str);m=n%HASHSIZE;returnm;)Statuscollision(intp,intc)(inti,q;i=c/2+1;while(i<HASHSIZE)(if(c%2==0)//先將用戶名進(jìn)行折疊處理〃折疊處理后的數(shù),用除留余數(shù)法構(gòu)造哈希函數(shù)〃并返回模值〃哈希函數(shù)〃把字符串轉(zhuǎn)換成整型數(shù).〃用除留余數(shù)法構(gòu)造哈希函數(shù)〃用除留余數(shù)法構(gòu)造哈希函數(shù)//沖突處理函數(shù),采用二次探測(cè)再散列法解決沖突{c++;q=(p+i*i)%HASHSIZE;if(q>=0){ printf("is0&&q>0");returnq;}else{i=c/2+1;printf("is0&&q<0");returnUNSUCCESS;}}else{q=(p-i*i)%HASHSIZE;c++;if(q>=0) {returnq;}else{i=c/2+1;printf("isnot0&&q<0");returnUNSUCCESS;}}}returnUNSUCCESS;)voidCreateHash1(HashTable*H,Record*a){ //建表,以人的姓名為關(guān)鍵字,建立相應(yīng)的散列表〃若哈希地址沖突,進(jìn)行沖突處理inti,p=-1,c,pp;for(i=0;i<NUM_BER;i++){ c=0;p=Hash1(a[i].name);pp=p;while(H->elem[pp]!=NULL){pp=collision(p,c);if(pp<0){printf("createHash1第%~記錄無(wú)法解決沖突",i+1);//需要顯示沖突次數(shù)時(shí)輸出continue;} //無(wú)法解決沖突,跳入下一循環(huán)}H->elem[pp]=&(a[i]); //求得哈希地址,將信息存入H->count++;printf("createHash1第%~個(gè)記錄沖突次數(shù)為%d。\n",i+1,c);//需要顯示沖突次數(shù)時(shí)輸出}printf("\ncreateHash1建表完成!\n此哈希表容量為%&當(dāng)前表內(nèi)存儲(chǔ)的記錄個(gè)數(shù)為%d.\n",HASHSIZE,H->count);}voidSearchHash1(HashTable*H,intc){ //在通訊錄里查找姓名關(guān)鍵字,若查找成功,顯示信息intp,pp; //c用來(lái)記錄沖突次數(shù),查找成功時(shí)顯示沖突次數(shù)NAstr; printf("\n請(qǐng)輸入要查找記錄的姓名:\n");scanf("%s",str);p=Hash1(str);pp=p;while((H->elem[pp]!=NULL)&&(eq(str,H->elem[pp]->name)==-1))pp=collision(p,c);if(H->elem[pp]!=NULL&&eq(str,H->elem[pp]->name)==1){printf("\n查找成功!\n查找過(guò)程沖突次數(shù)為%d.以下是您需要要查找的信息:\n\n",c);printf("姓名:%s\n電話號(hào)碼:%s\n聯(lián)系地址:%s\n",H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add);)elseprintf("\n此人不存在,查找不成功!\n");)voidCreateHash2(HashTable*H,Record*a){ //建表,以電話號(hào)碼為關(guān)鍵字,建立相應(yīng)的散列表〃若哈希地址沖突,進(jìn)行沖突處理inti,p=-1,c,pp;for(i=0;i<NUM_BER;i++){ c=0;p=Hash2(a[i].tel);pp=p;while(H->elem[pp]!=NULL){pp=collision(p,c);if(pp<0){ printf("第%d記錄無(wú)法解決沖突”,i+1); //需要顯示沖突次數(shù)時(shí)輸出continue;) 〃無(wú)法解決沖突,跳入下一循環(huán))H->elem[pp]=&(a[i]); //求得哈希地址,將信息存入H->count++;printf("第%d個(gè)記錄沖突次數(shù)為%d。\n",i+1,c); //需要顯示沖突次數(shù)時(shí)輸出)printf("\n建表完成!\n此哈希表容量為%d,當(dāng)前表內(nèi)存儲(chǔ)的記錄個(gè)數(shù)為%d.\n”,HASHSIZE,H->count);)voidSearchHash2(HashTable*H,intc){ //在通訊錄里查找電話號(hào)碼關(guān)鍵字,若查找成功,顯示信息//c用來(lái)記錄沖突次數(shù),查找成功時(shí)顯示沖突次數(shù)intp,pp;NAtele;printf("\n請(qǐng)輸入要查找記錄的電話號(hào)碼:\n");scanf("%s",tele);p=Hash2(tele);pp=p;while((H->elem[pp]!=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))pp=collision(p,c);if(H->elem[pp]!=NULL&&eq(tele,H->elem[pp]->tel)==1){printf("\n查找成功!\n查找過(guò)程沖突次數(shù)為%d.以下是您需要要查找的信息:\n\n",c);printf("姓 名:%s\n電話號(hào)碼:%s\n聯(lián)系地址:%s\n",H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add);}elseprintf("\n此人不存在,查找不成功!\n");)voidgetin(Record*a){〃錄入通訊錄的內(nèi)容,傳入一個(gè)record的指針,然后針對(duì)這個(gè)指針指向的內(nèi)存記錄進(jìn)行操作inti; printf("輸入要?jiǎng)?chuàng)建通訊錄的人數(shù):\n");scanf("%d”,&NUM_BER);for(i=0;i<NUM_BER;i++){printf("請(qǐng)輸入第%~個(gè)記錄的用戶名:\n",i+1);scanf("%s",a[i].name);printf("請(qǐng)輸入第%~個(gè)記錄的電話號(hào)碼:\n",i+1);scanf("%s",a[i].tel);printf("請(qǐng)輸入第%~個(gè)記錄的地址:\n",i+1);scanf("%s",a[i].add); //gets(str2);??????}}intinsert(Record*a){ 〃插入新同學(xué)的方法inti;if(NUM_BER>=HASHSIZE)(printf("hashTable已經(jīng)達(dá)到班級(jí)人數(shù)的最大值:%d!請(qǐng)修改班級(jí)初始人數(shù)!”,HASHSIZE);return0;}else{ printf(”請(qǐng)輸入要新增同學(xué)的姓名:\n");scanf("%s",a[NUM_BER].name);for(i=0;i<NUM_BER;i++){if(strcmp(a[i].name,a[NUM_BER].name)==0){printf("此同學(xué):%s已經(jīng)存在,請(qǐng)重新確認(rèn)姓名!",a[NUM_BER].name);return0;}}printf(”請(qǐng)輸入要新增同學(xué)的電話號(hào)碼:\n");scanf("%s",a[NUM_BER].tel);for(i=0;i<NUM_BER;i++){if(strcmp(a[i].tel,a[NUM_BER].tel)==0){ printf("此號(hào)碼:%s已經(jīng)存在,請(qǐng)重新確認(rèn)號(hào)碼!\n",a[NUM_BER].tel);return0;}}printf(”請(qǐng)輸入要新增同學(xué)的地址:\n");scanf("%s",a[NUM_BER].add);NUM_BER++;return1;}}voidShowInformation(Record*a) 〃顯示輸入的用戶信息

{inti;printf("姓名%-16$電話%-16s住址%-20s\n",”O(jiān);for(i=0;i<NUM_BER;i++)printf("%-20s%-20s%-20s\n",a[i].name,a[i].tel,a[i].add);//printf("\n第%~個(gè)用戶信息:\n姓名:%s\n電話號(hào)碼:%s\n聯(lián)系地址:%s\n",i+1,a[i].name,a[i].tel,a[i].add);intmain(){Recorda[MAXSIZE];intc,flag=1,i;intnum;HashTable*H;H=(HashTable*)malloc(LEN);for(i=0;i<HASHSIZE;i++)H->elem[i]=NULL;H->size二HASHSIZE;H->count=0;printf(********************************\n");printf("addressbook\n");printf("madebyLishengqiang\n");printf("addressbook\n");printf("madebyLishengqiang\n");printf(********************************\n");printfC按任意鍵開(kāi)始程序?\n");getch();while(flag){ 〃當(dāng)前永真,也可以讓退出方法將flag賦值為0然后下次循環(huán)的時(shí)候退出程序printf("\n小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小");printf("\n歡迎來(lái)到軟件工程10-01李勝?gòu)?qiáng)的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)!!);printf("\n小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小");printf("\n.按照指定的長(zhǎng)度建立通訊錄");printf("\nprintf("\n小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小");printf("\n歡迎來(lái)到軟件工程10-01李勝?gòu)?qiáng)的數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)!!);printf("\n小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小");printf("\n.按照指定的長(zhǎng)度建立通訊錄");printf("\n.顯示通訊錄內(nèi)所有用戶信息");printf("\n3.添加新的用戶信息 ")printf("\n4.查找并顯示給定用戶名的記錄 ")printf("\n5.查找并顯示給定電話號(hào)碼的記錄 ")printf("\n0.顯示通訊錄信息并退出通訊錄 ")printf("\n1V****************************************printf("\n請(qǐng)選擇操作: \n"););scanf("%d”,&num);;;;switch(num){case1:getin(a);printf("\n3.添加新的用戶信息 ")printf("\n4.查找并顯示給定用戶名的記錄 ")printf("\n5.查找并顯示給定電話號(hào)碼的記錄 ")print

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論