數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案_第1頁
數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案_第2頁
數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案_第3頁
數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案_第4頁
數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

PAGE.學(xué)習(xí)幫手.數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案.學(xué)習(xí)幫手.報(bào)告編號(hào):第5組綜合課程設(shè)計(jì)報(bào)告手機(jī)號(hào)碼查詢系統(tǒng)指導(dǎo)教師:所在系:電子工程系所學(xué)專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)年級(jí):2012級(jí)數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第1頁。2014年6數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第1頁。目錄1、課程設(shè)計(jì)目的和要求 11.1設(shè)計(jì)目的 11.2設(shè)計(jì)要求 12、課程設(shè)計(jì)的主要工作 12.1需求分析 13、課程基本設(shè)計(jì)說明 13.1概要設(shè)計(jì)和數(shù)據(jù)結(jié)構(gòu)選擇 13.2程序具體設(shè)計(jì) 23.3程序流程圖 24、程序詳細(xì)設(shè)計(jì) 44.1創(chuàng)建 44.2對(duì)哈希函數(shù)的定義 44.3哈希查找 54.4主函數(shù) 65、程序運(yùn)行結(jié)果界面 86、課程設(shè)計(jì)總結(jié) 127、參考文獻(xiàn) 138、附錄 13數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第2頁。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第2頁。摘要本文主要介紹了手機(jī)號(hào)碼查詢系統(tǒng),實(shí)現(xiàn)對(duì)用戶手機(jī)號(hào)碼、用戶名以及地址的添加、查詢、存儲(chǔ)。程序主要以手機(jī)號(hào)碼和姓名為關(guān)鍵字建立哈希表,并實(shí)現(xiàn)查找功能。其中,以手機(jī)號(hào)為關(guān)鍵字建立哈希表時(shí)采用線性探測(cè)法解決沖突、以姓名為關(guān)鍵字建立哈希表時(shí)用拉鏈法解決沖突,成功通過設(shè)計(jì)哈希表實(shí)現(xiàn)對(duì)用戶的手機(jī)號(hào)碼、姓名、地址顯示、查詢等功能。通過課程設(shè)計(jì),鞏固和加深對(duì)結(jié)構(gòu)體、哈希表等理論知識(shí)的理解,掌握現(xiàn)實(shí)復(fù)雜的分析建模和解決方法,掌握包括問題描述、系統(tǒng)分析、設(shè)計(jì)建模、代碼實(shí)現(xiàn)、結(jié)果分析等的方法;提高利用計(jì)算機(jī)分析解決綜合性實(shí)際問題的基本能力;鍛煉個(gè)人的動(dòng)手能力,歷練自身素質(zhì);提高大家的合作能力。關(guān)鍵字:哈希表線性探測(cè)法鏈地址法數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第3頁。1、課程設(shè)計(jì)目的和要求1.1設(shè)計(jì)目的本題目最主要的的是設(shè)計(jì)散列函數(shù),本程序需要設(shè)計(jì)兩個(gè)散列函數(shù)才能解決問題,程序需要分別為以號(hào)碼和用戶名為關(guān)鍵字建立哈希表。所以要分別以用戶名、號(hào)碼為關(guān)鍵字建立兩個(gè)散列函數(shù)。1.2設(shè)計(jì)要求(1)每個(gè)記錄有下列數(shù)據(jù)項(xiàng):手機(jī)號(hào)碼、用戶名、地址;(2)從鍵盤輸入各記錄,分別以手機(jī)號(hào)碼和用戶名為關(guān)鍵字建立哈希表(哈希函數(shù)自選);(3)以手機(jī)號(hào)為關(guān)鍵字建立哈希表時(shí)采用線性探測(cè)法解決沖突、以姓名為關(guān)鍵字建立哈希表時(shí)用拉鏈法解決沖突;(4)查找并顯示給定手機(jī)號(hào)碼的記錄;數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第4頁。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第4頁。2、課程設(shè)計(jì)的主要工作2.1需求分析本題目最主要的要求是設(shè)計(jì)散列函數(shù),需要設(shè)計(jì)兩個(gè)散列函數(shù)才能解決問題。程序需要分別為以號(hào)碼和用戶名為關(guān)鍵字建立哈希表。所以要分別以用戶名為關(guān)鍵字建立哈希表時(shí)采用拉鏈法解決沖突、以手機(jī)號(hào)碼為關(guān)鍵字時(shí)采用線性探測(cè)法解決沖突,具體思路為:(1)對(duì)于以號(hào)碼為關(guān)鍵字的散列函數(shù),是將十一個(gè)數(shù)字全部相加,然后對(duì)20求余。得到的數(shù)作為地址。對(duì)于以用戶名為關(guān)鍵字的散列函數(shù),是將所有字母的ASCLL碼值相加,然后對(duì)20求余。(2)要添加用戶信息,以號(hào)碼為關(guān)鍵字的添加函數(shù)即要有實(shí)現(xiàn)添加功能的函數(shù),以用戶名為關(guān)鍵字的添加函數(shù)即要有實(shí)現(xiàn)添加結(jié)點(diǎn)功能的函數(shù),所以要設(shè)計(jì)一個(gè)必須包括一個(gè)輸入結(jié)點(diǎn)信息、添加結(jié)點(diǎn)的函數(shù);(3)要實(shí)現(xiàn)查找函數(shù),則必須包括查找的函數(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è)試;3、課程基本設(shè)計(jì)說明3.1概要設(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)行哈希查找。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第5頁。(1)在鏈地址法中,每個(gè)結(jié)點(diǎn)對(duì)應(yīng)一個(gè)鏈表結(jié)點(diǎn),它由三個(gè)域組成,而由于該程序需要分別用電話號(hào)碼和用戶名為關(guān)鍵字建立哈希表,所以該鏈表結(jié)點(diǎn)它是由四個(gè)域組成,鏈地?cái)?shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第5頁。name[20]num[20]address[30]next其中name[20]和num[20]是分別為以號(hào)碼和用戶名為關(guān)鍵字域,存放關(guān)鍵字(key);address[30]的數(shù)據(jù)域,用來存儲(chǔ)用戶的地址。Next指針是用來指向下一個(gè)結(jié)點(diǎn)的地址。(2)在線性探測(cè)法中,先輸入關(guān)鍵字,根據(jù)計(jì)算哈希地址的函數(shù),求得哈希地址。根據(jù)哈希地址找到哈希地址對(duì)應(yīng)的關(guān)鍵字,看哈希地址對(duì)應(yīng)的關(guān)鍵字是否與所查找的關(guān)鍵字相同。若不同,則將哈希地址加一,直到找到關(guān)鍵字為止。3.2程序具體設(shè)計(jì)本系統(tǒng)分為六個(gè)個(gè)模塊,分別是主函數(shù),增加用戶、查找記錄、號(hào)碼顯示、姓名顯示。下面就每個(gè)功能進(jìn)行詳細(xì)說明:(1)主函數(shù):設(shè)計(jì)用戶登錄界面(包括增加、顯示、查詢、退出)。(2)增添用戶:選擇增加用戶數(shù)量,再輸入對(duì)應(yīng)數(shù)量的用戶姓名,住址,號(hào)碼(3)查找記錄:分為按姓名查詢和按號(hào)碼查詢,并分別調(diào)用自己的輸入法。按姓名查詢是以姓名為關(guān)鍵字的哈希表的查找函數(shù)計(jì)算哈希地址,并進(jìn)行判斷,當(dāng)查找的關(guān)鍵字與利用該關(guān)鍵字求得的哈希地址一致時(shí)輸出該用戶所有信息,否則繼續(xù)查找,直至找到。號(hào)碼查詢是以手機(jī)號(hào)碼為關(guān)鍵字的哈希表的查找函數(shù)計(jì)算哈希地址,并進(jìn)行判斷,如果元素不在該位置,將元素后移再判斷遇到空格表示該元素不存在,最后返回查找到的哈希地址。(4)姓名顯示:以姓名為關(guān)鍵字的哈希函數(shù)計(jì)算姓名中每個(gè)字符的ASCII碼值相加姓名為關(guān)鍵字創(chuàng)建哈希表計(jì)算哈希地址,采用拉鏈法解決沖突。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第6頁。(5)號(hào)碼顯示:以手機(jī)號(hào)碼為關(guān)鍵字的哈希函數(shù)計(jì)算號(hào)碼中每個(gè)字符的ASCII碼值相加,號(hào)碼為關(guān)鍵字創(chuàng)建哈希表并計(jì)算哈希地址,采用線性探測(cè)法數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第6頁。3.3程序流程圖數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第7頁。(1)本程序設(shè)計(jì)是運(yùn)用哈希表來解決問題,其中運(yùn)用了許多數(shù)組和鏈表中的基本操作,運(yùn)用C語言程序編寫程序,創(chuàng)建哈希表,以及哈希函數(shù)的實(shí)現(xiàn)等基本功能,同時(shí)運(yùn)用除留余數(shù)求得哈希地址,線性探測(cè)法以及拉鏈法解決沖突,在程序設(shè)計(jì)成功的基礎(chǔ)上,進(jìn)一步深化理解哈希表的作用和實(shí)現(xiàn)原理。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第7頁。開開始Menu()主菜單輸入選擇選擇1按號(hào)碼查找輸入按姓名查找輸入輸出結(jié)果輸出結(jié)果選擇2選擇3選擇4選擇5選擇5按號(hào)碼顯示號(hào)碼散列結(jié)果按姓名顯示退出系統(tǒng)return0按號(hào)碼查找按姓名查找姓名散列結(jié)果號(hào)碼散列結(jié)果結(jié)束添加用戶姓名散列結(jié)果Main()初始化數(shù)組并為其動(dòng)態(tài)分配內(nèi)存空間初始化散列鏈表并為其動(dòng)態(tài)分配內(nèi)存空間數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第8頁。圖3-3程序基本流程圖 數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第8頁。4、程序詳細(xì)設(shè)計(jì)4.1創(chuàng)建************************程序部分源代碼*************************創(chuàng)建數(shù)組typedefstruct{ charname[20];charaddress[30];charnum[20];}Record;RecordInf[M];RecordH[M];創(chuàng)建結(jié)點(diǎn)structnode{charname[20];charaddress[30];charnum[20];node*next;};node**nam;數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第9頁。typedefnode*mingzi數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第9頁。4.2對(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取19,然后將計(jì)算出來的數(shù)作為哈希地址賦給key。具體方法如下:以號(hào)碼為關(guān)鍵字建立哈希函數(shù)hash(charnum[20)。以用戶名為關(guān)鍵字建立哈希函數(shù)hash2(charname[20])。利用強(qiáng)制類型轉(zhuǎn)換,將用戶名的每一個(gè)字母的ASCLL碼值相加并且除以19后的余數(shù)。將計(jì)算出來的數(shù)作為該結(jié)點(diǎn)的地址賦給key2。************************程序部分源代碼*************************inthash(charnum[20]){ inti=0; intb=0; while(num[i]!='\0') {b=b+num[i];i++;} b=b%19; return(b);}voidhash2(charname[20]) {數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第10頁。inti=1;數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第10頁。key2=(int)name[0];while(name[i]!=NULL) {key2+=(int)name[i];i++;}key2=key2%19;}4.3哈希查找想要實(shí)現(xiàn)查找功能,同樣需要兩個(gè)查找函數(shù),無論以用戶名還是以號(hào)碼為關(guān)鍵字,首先,都需要利用hash函數(shù)來計(jì)算出地址。再通過比對(duì),如果是以號(hào)碼為關(guān)鍵字,比較其號(hào)碼是否相同,如果相同則輸出所有信息,如果以用戶名為關(guān)鍵字,則比較用戶名是否相同,如果相同則輸出該結(jié)點(diǎn)的所有信息。如果找不到與之對(duì)應(yīng)相同的,則輸出“無此記錄”。************************程序部分源代碼*************************intfind(RecordH[],charnum[20]){ intw,key=0;key=hash(num);while(strcmp(num,H[key].num)!=0) { 數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第11頁。 key++;數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第11頁。 if(strcmp(H[key].num,NULLKEY)==0) { printf("查找號(hào)碼不存在\n"); return-1; break; } }returnkey;}voidfind2(charname[20]){ hash2(name);node*q=nam[key2]->next;while(q!=NULL) { if(strcmp(name,q->name)==0)break;q=q->next; }if(q) printf("\t用戶名:\t%s\n\t地址:%s\n\t號(hào)碼:%s\n",q->name,q->address,q->num);數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第12頁。elseprintf("無此記錄\n");數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第12頁。}4.4主函數(shù)本程序需要?jiǎng)?chuàng)建一個(gè)主菜單和一個(gè)主函數(shù),主菜單便于用戶的使用,主函數(shù)中,包括所有功能對(duì)應(yīng)的數(shù)值,使之和主菜單相對(duì)應(yīng)。************************程序部分源代碼*************************intmenu_select(){ intc; do{system("cls");printf("**************************\n");printf("**************************\n");printf("*****手機(jī)號(hào)碼查詢系統(tǒng)****\n");printf("*1.增添用戶*\n");printf("*2.按號(hào)碼顯示*\n"); printf("*3.按姓名顯示*\n");printf("*4.按號(hào)碼查找*\n");printf("*5.按姓名查找*\n");printf("*6.結(jié)束程序*\n");printf("**************************\n");printf("請(qǐng)選擇您要運(yùn)行的選項(xiàng)按(1-6):");數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第13頁。scanf("%d",&c);數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第13頁。getchar(); }while(c<1||c>6); return(c);}菜單函數(shù)主要有以下功能:1.增添用戶2.按號(hào)碼顯示 3.按姓名顯示4.按號(hào)碼查找5.按姓名查找6.結(jié)束程序至此,就解決了哈希表的設(shè)計(jì)與實(shí)現(xiàn)算法可能出現(xiàn)的各種問題,那么根據(jù)以上思路以及對(duì)問題的分析和對(duì)出現(xiàn)情況的解決則可以寫出源程序。5、程序運(yùn)行結(jié)果界面1)菜單主界面數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第14頁。2)新增用戶界面數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第14頁。3)按號(hào)碼查詢輸入界面4)按號(hào)碼顯示界面數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第15頁。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第15頁。5)按號(hào)碼查詢數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第16頁。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第16頁。6)按姓名查詢輸入界面7)按姓名顯示界面數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第17頁。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第17頁。8)按姓名查詢界面數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第18頁。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第18頁。9)退出界面6、課程設(shè)計(jì)總結(jié)1、語法錯(cuò)誤及修改:程序是分塊寫的,調(diào)試時(shí)可以使用分步調(diào)試的方式進(jìn)行,以便能查找看程序是在哪出錯(cuò)了。本算法使用了鏈表結(jié)構(gòu)和鏈地址法解決沖突的問題,在以姓名為關(guān)鍵字的哈希表中要注意涉及ASCLL碼的類型轉(zhuǎn)換,要注意輸出不能是“%d”,否則不能輸出結(jié)果。編寫程序時(shí)要多注意程序中各種指針的使用,還有各類變量的定義,函數(shù)的使用。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第19頁。2、邏輯問題修改和調(diào)整:鏈表結(jié)構(gòu)方法雖然方便了運(yùn)行,但是增加了對(duì)算法過程的認(rèn)識(shí)難度。在本程序中每一個(gè)函數(shù)中都需要涉及到指針的操作。所以需要仔細(xì)分析函數(shù)中的指針指向。在插入結(jié)點(diǎn),查找結(jié)點(diǎn)時(shí)尤為突出。對(duì)于主菜單和主函數(shù)的對(duì)應(yīng),一定要一致,這樣才能保證運(yùn)行時(shí)不會(huì)出錯(cuò)。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第19頁。3、時(shí)間,空間性能分析:散列法本質(zhì)上是一種通過關(guān)鍵字直接計(jì)算存儲(chǔ)地址的方法。在理想情況下,散列函數(shù)可以把結(jié)點(diǎn)均勻地分布到散列表中,不發(fā)生沖突,則查找過程無需比較,其時(shí)間復(fù)雜度O(n)=1。散列法的查找性能取決于3個(gè)因素:散列函數(shù)、沖突處理方法和填充因子。采用鏈地址法,可以從根本上杜絕“二次聚集”的發(fā)生,從而提高散列表的均勻度,提高查找性能,不過也會(huì)“浪費(fèi)”一部分散列表的空間。當(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)該選擇一個(gè)適當(dāng)?shù)奶畛湟蜃?,以便把平均查找長(zhǎng)度控制在一個(gè)盡量小的范圍內(nèi)。4、人員分工:組長(zhǎng)王敏編寫有關(guān)增加的函數(shù)和創(chuàng)建哈希表的函數(shù),整個(gè)程序的運(yùn)行及調(diào)試工作。組員韋蕾項(xiàng)目報(bào)告匯總和修改組員張雪妮編寫有關(guān)顯示的函數(shù)組員楊丹編寫有關(guān)查詢的函數(shù)和計(jì)算哈希地址的函數(shù)組員熊佳惠編寫菜單和主函數(shù)所有組員在編寫過程中都認(rèn)真負(fù)責(zé),體現(xiàn)了團(tuán)隊(duì)精神,每個(gè)人都有明確的分工,都參加了項(xiàng)目報(bào)告的撰寫,達(dá)到了預(yù)期團(tuán)隊(duì)合作的效果。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第20頁。5、通過這次課程設(shè)計(jì),我們大家鞏固和加深了對(duì)哈希表等理論知識(shí)的理解;提高利用計(jì)算機(jī)分析解決綜合性實(shí)際問題的基本能力;鍛煉個(gè)人的動(dòng)手能力,歷練自身素質(zhì);提高大家的合作能力。掌握實(shí)現(xiàn)復(fù)雜問題的分析建模和解決方法;也提高了對(duì)書寫報(bào)告的規(guī)范性數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第20頁。7、參考文獻(xiàn)[1]嚴(yán)蔚敏.數(shù)據(jù)結(jié)構(gòu)(C語言版).北京:清華大學(xué)出版社,2007版.[2]譚浩強(qiáng)、張基溫編著.《C語言程序設(shè)計(jì)教程》(第3版).北京:高等教育出版社,2006年[3]李春葆,數(shù)據(jù)結(jié)構(gòu)題集.北京:清華大學(xué)出版社,1992年2月第一版。8、附錄程序代碼如下:#include<stdio.h>#include<string.h>#include<stdlib.h>#defineM20#defineNULLKEY"\0"#defineNULL0#defineINFEASIBLE-1typedefstruct{ charname[20];charaddress[30];charnum[20];}Record;RecordInf[M];//定義輔助數(shù)組為全局變量RecordH[M];//定義哈希表為全局變量unsignedintkey2;structnode//建結(jié)點(diǎn)每個(gè)結(jié)點(diǎn)包括用戶姓名、地址、電話號(hào)碼、以及指向下一個(gè)結(jié)點(diǎn)的指針數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第21頁。{數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第21頁。charname[20];charaddress[30];charnum[20];node*next;};typedefnode*mingzi;//typedef可以為一個(gè)已有的數(shù)據(jù)類型聲明多個(gè)別名,這里為該類型聲明了一個(gè)指針node**nam;intmenu_select()/*菜單函數(shù)*/{ intc; do{system("cls");/*運(yùn)行前清屏*/printf("**************************\n");printf("*****手機(jī)號(hào)碼查詢系統(tǒng)****\n");printf("*1.增添用戶*\n");printf("*2.按號(hào)碼顯示*\n"); printf("*3.按姓名顯示*\n");printf("*4.按號(hào)碼查找*\n");printf("*5.按姓名查找*\n");printf("*6.結(jié)束程序*\n");printf("**************************\n");printf("請(qǐng)選擇您要運(yùn)行的選項(xiàng)按(1-6):");數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第22頁。scanf("%d",&c);/*讀入選擇*/數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第22頁。getchar(); }while(c<1||c>6); return(c);/*返回選擇*/}inti=0;intadd()//增加用戶{ printf("請(qǐng)輸入名字\n"); scanf("%s",Inf[i].name); printf("請(qǐng)輸入地址\n"); scanf("%s",Inf[i].address); printf("請(qǐng)輸入號(hào)碼\n");scanf("%s",Inf[i].num); i++; returni;}inthash(charnum[20])//以號(hào)碼為關(guān)鍵字的哈希函數(shù){ inti=0,b=0; while(num[i]!='\0')//計(jì)算手機(jī)號(hào)碼中每個(gè)字符的ASCII碼值相加 { b=b+num[i]; i++;//哈希地址 }數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第23頁。 b=b%19;//除留余法求數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第23頁。 return(b);}voidinput(RecordInf[M],intm,RecordH[M])//以手機(jī)號(hào)碼為關(guān)鍵字創(chuàng)建哈希表{ intj,key=0; for(j=0;j<m;j++) { key=hash(Inf[j].num);//計(jì)算哈希地址 while(1) { if(strcmp(H[key].num,NULLKEY)==0)//判斷該位置是否為空,為空就把輔助數(shù)組中的元素存到該位置 { strcpy(H[key].name,Inf[j].name); strcpy(H[key].num,Inf[j].num); strcpy(H[key].address,Inf[j].address); break; } else key++;//如果不為空,采用線性探測(cè)法,將元素后移,解決沖突 } }}數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第24頁。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第24頁。voidlist(RecordH[M])//以手機(jī)號(hào)碼為關(guān)鍵字的哈希表的輸出函數(shù){ inti; for(i=0;i<20;i++) { if(strcmp(H[i].num,"\0")!=0) { printf("\t用戶名:%s\n\t地址:%s\n\t號(hào)碼:%s\n",H[i].name,H[i].address,H[i].num); } }}intfind(RecordH[],charnum[20])//以手機(jī)號(hào)碼為關(guān)鍵字的哈希表的查找函數(shù){ intkey=0;key=hash(num);//計(jì)算哈希地址while(strcmp(num,H[key].num)!=0)//如果元素不在該位置,將元素后移再判斷 { key++; if(strcmp(H[key].num,NULLKEY)==0)//遇到空格表示該元素不存在 { printf("查找號(hào)碼不存在\n"); return-1;數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第25頁。 break;數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第25頁。 } }returnkey;//返回查找到的哈希地址}node*input2()//輸入節(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ì)于指針類型返回的是地址}voidhash2(charname[20])//哈希函數(shù)以用戶名為關(guān)鍵字建立哈希函數(shù) //利用強(qiáng)制類型轉(zhuǎn)換,將用戶名的每一個(gè)字母的ASCLL碼值相加并且除以20后的余數(shù){ inti=1;key2=(int)name[0];數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第26頁。while(name[i]!=NULL) { key2+=(int)name[i];i++; }key2=key2%19;}voidcreate()//新建節(jié)點(diǎn){ inti;nam=newmingzi[20];//動(dòng)態(tài)創(chuàng)建對(duì)象數(shù)組for(i=0;i<20;i++) { nam[i]=newnode;nam[i]->next=NULL; }}intapend()//添加節(jié)點(diǎn){ node*newname;newname=input2();newname->next=NULL;hash2(newname->name);//利用哈希函數(shù)計(jì)算出對(duì)應(yīng)關(guān)鍵字的存儲(chǔ)地址數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第27頁。newname->next=nam[key2]->next;//利用用戶名為關(guān)鍵字插入,采用頭插入法數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第27頁。nam[key2]->next=newname;//是采用鏈地址法,拉鏈法處理沖突的散列表結(jié)構(gòu)return0;}voidlist2()//按姓名顯示哈希表{ inti;node*p;for(i=0;i<20;i++) {p=nam[i]->next;while(p) { printf("\t用戶名:\t%s\n\t地址:%s\n\t號(hào)碼:%s\n",p->name,p->address,p->num);p=p->next; } }}voidfind2(charname[20])//在以用戶名為關(guān)鍵字的哈希表中查找用戶信息{ hash2(name);node*q=nam[key2]->next;while(q!=NULL) {數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第28頁。 if(strcmp(name,q->name)==0)數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第28頁。break;q=q->next; }if(q) printf("\t用戶名:\t%s\n\t地址:%s\n\t號(hào)碼:%s\n",q->name,q->address,q->num);elseprintf("無此記錄\n");}intmenu()/*菜單函數(shù)*/{ intc; do{system("cls");/*運(yùn)行前清屏*/printf("**************************\n");printf("*******輸入方式選擇*******\n");printf("*1.按號(hào)碼查詢輸入*\n");printf("*2.按姓名查詢輸入*\n");printf("**************************\n");printf("請(qǐng)選擇您要運(yùn)行的選項(xiàng)按(1-2):");scanf("%d",&c);/*讀入選擇*/getchar(); }while(c<1||c>2); return(c);/*返回選擇*/}數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第29頁。數(shù)據(jù)結(jié)構(gòu)-手機(jī)號(hào)碼查詢系統(tǒng)方案全文共34頁,當(dāng)前為第29頁。voidmain()//主函數(shù){ charname[20],num[20]; intm,n,j,w,k; create(); while(1) { switch(menu

溫馨提示

  • 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. 人人文庫(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)論