日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA散列表个人通讯录_散列表实现简易通讯录

發(fā)布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA散列表个人通讯录_散列表实现简易通讯录 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

散列表實現(xiàn)通訊錄

1、項目研究背景與意義

背景:隨著信息活動在國民經(jīng)濟中主導(dǎo)地位的確立和信息產(chǎn)業(yè)的崛起,信息資源管理作為一個專有名詞和獨立的學(xué)科逐漸發(fā)展起來。如何積極開發(fā)、合理配置和有效利用信息資源,日益成為社會中急需解決的問題。由于計算機和通信技術(shù)的高速發(fā)展,推廣應(yīng)用計算機進行信息管理成為推動信息化工作的重要內(nèi)容,信息管理系統(tǒng)正是應(yīng)用計算機信息化過程中出現(xiàn)的新事物。它能夠提供信息、支持企業(yè)和組織的運行,對管理者作出決策有重要的意義。信息管理系統(tǒng)用于管理中可以大大減輕管理人員的工作負擔(dān),提高工作效率。使管理更加程序化,科學(xué)化。

對一個組織而言,內(nèi)部管理的好壞直接關(guān)系到組織的存在與良好運行,而內(nèi)部管理中非常重要的一項就是對他人的連續(xù)聯(lián)系,他人的具體情況,如:手機號、姓名、家庭住址......;一旦工作人員沒有及時出現(xiàn)在自己崗位時或因其它情況發(fā)生變化時,可以迅速連續(xù)或找到本人及其家人了解情況。本系統(tǒng)是針對通信錄管理系統(tǒng)編寫的。對于許多人來說,已經(jīng)認識到一個好的通信錄是很必要的,可以方便和其他人的聯(lián)系;但是應(yīng)用計算機來進行管理還無法實現(xiàn),所以就需要專門的管理軟件來幫助實現(xiàn)。、

隨著科技的進步和信息產(chǎn)業(yè)的飛速發(fā)展,通訊錄成為了現(xiàn)代生活中一個重要的工具。本通訊錄管理系統(tǒng)利用計算機對通信錄進行統(tǒng)一管理,包括添加、修改、查詢等功能,實現(xiàn)通信錄管理工作的系統(tǒng)化、規(guī)范化和自動化,為人們的工作和生活提供便利。整個系統(tǒng)程序采用C語言實現(xiàn),C語言是目前國際上比較流行的計算機高級編程語言之一,因其簡潔、使用方便且具備強大的功能而受到編程人員的普通青睞。它既適合作為系統(tǒng)描述語言,也可用來編寫系統(tǒng)軟件,還可用來編寫應(yīng)用軟件。

意義:計算機已經(jīng)成為我們學(xué)習(xí)和工作的得力助手,使用其可方便的管理通訊錄。目前,大多數(shù)人的通訊管理水平還停留在紙介質(zhì)的基礎(chǔ)上,這樣的機制已經(jīng)不能適應(yīng)時代的發(fā)展了,他浪費了大量的人力物力,在信息時代這種傳統(tǒng)的管理方法必然被計算機為基礎(chǔ)的信息管理所取代。

開發(fā)這一系統(tǒng)的好處大約有以下幾點:

第一、可以安全、高效的存儲大量的通訊錄信息;

第二、只需一檔案錄入即可完成操作系統(tǒng),節(jié)省人力;

第三、可以迅速的查到所需的通訊錄信息。

2、系統(tǒng)需求分析

根據(jù)用戶需求,通訊錄需要長期保存聯(lián)系人信息,且用戶可實現(xiàn)對聯(lián)系人的添加、刪除、修改和查找等功能。

首先,需要創(chuàng)建通訊錄。

Create?(?)的功能:創(chuàng)建新的通訊錄。

為長期保存聯(lián)系人,需要以文件形式存儲,并且可以隨時對文件中的信息進行讀取。

本系統(tǒng)應(yīng)完成以下幾方面的功能:

Load?(?)的功能:從指定文件中讀取通訊錄中的記錄。

Save?(?)的功能:保存通訊錄中的所有記錄到指定文件中。

當(dāng)通訊錄中信息為空,需要首先對通訊錄進行初始化。

Start?(?)的功能:初始化通訊錄。

需要添加、刪除、修改、查找聯(lián)系人時,可以隨時進行增、刪、改、查等功能。

newnumz(?)的功能:在通訊錄寫入新的信息,并返回選單。

Findnum?(?)的功能:查詢某人的信息,如果找到了,則顯示該人的信息,如果沒有則提示通訊錄中沒有此人的信息,并返回選單。

Alter?(?)的功能:修改某人的信息,如果未找到要修改的人,則提示通訊錄中沒有此人的信息,?并返回選單。

Delete?(?)的功能:刪除某人的信息,如果未找到要刪除的人,則提示通訊錄中沒有此人的信息并返回選單。

根據(jù)用戶的需求,有時需要顯示通訊錄中的全部聯(lián)系人信息。

List?(?)的功能:顯示通訊錄中的所有記錄。

3、概要設(shè)計

4、詳細設(shè)計

4.1結(jié)構(gòu)體設(shè)計

個人信息以結(jié)構(gòu)體實現(xiàn),包括電話號碼、姓名和地址。

struct?xinxi

{

int?num;

char?name[10];

char?address[10];

};//個人信息結(jié)構(gòu)體

散列表以順序表實現(xiàn),可以存儲50個聯(lián)系人的信息。

struct?hash

{

int?max;

int?len;

Data?h[50];

};//散列表

4.2創(chuàng)建散列表Create()

創(chuàng)建散列表Create(),為散列表申請空間,并把所有號碼置為0.

phash?creat(){

int?i;

phash?p=(phash)malloc(sizeof(struct?hash));

if(p!=NULL){

p->max=50;

p->len=0;

for(i=0;i<50;i++)?{p->h[i].num=0;}?//關(guān)鍵碼全部置零

return?p;

}

}

4.3檢索函數(shù)Find()

檢索函數(shù)Find(),檢索電話號碼在散列表中是否存在。若存在,則通過position返回地址,并返回1;若不存在,返回0.

int?find(phash?p,int?num,int?*position){

int?d,inc;

d=num%50;//散列函數(shù)

for(inc=0;inc<50;inc++){

if(p->h[d].num==num){

*position=d;//檢索成功

return?1;

}

else?if(p->h[d].num==0){

*position=d;//檢索失敗

return?0;

}

d=(d+1)%50;

}

*position=-1;//散列表溢出

return?0;

}

4.4插入函數(shù)Append()

插入函數(shù)Append(),若所要插入的聯(lián)系人的號碼已存在,則輸出聯(lián)系人已存在;否則將聯(lián)系人信息插入到應(yīng)在位置。

int?Append(phash?p,Data?x){

int?position;

if(find(p,x.num,&position)==1)//散列表中已經(jīng)存在

{

printf("發(fā)現(xiàn)已經(jīng)存在!\n");

}

else?if(position!=-1){

p->h[position]=x;//插入信息

p->len++;

}

else?return?0;

return?1;

}

4.5初始化函數(shù)start()

初始化函數(shù)start(),循環(huán)寫入聯(lián)系人信息保存至臨時結(jié)構(gòu)體st,并調(diào)用插入函數(shù)Append(),將信息插入到散列表中。

int?start(phash?p){

int?i;

Data?st;

printf("請輸入三名聯(lián)系人的信息!(電話號碼,姓名,地址,空格隔開)\n");

for(i=0;i<3;i++)

{

scanf("%d?%s?%s",&st.num,&st.name,&st.address);

Append(p,st);

}

return?1;

}

4.6查找聯(lián)系人函數(shù)Findnum()

查找聯(lián)系人函數(shù)Findnum(),輸入聯(lián)系人號碼通過調(diào)用Find()函數(shù)來檢索該聯(lián)系人信息是否存在。若存在則輸出聯(lián)系人信息;若不存在,則輸出所查找聯(lián)系人不存在。

int?findnum(phash?p){

int?i,num,position;

printf("輸入要查詢的聯(lián)系人的號碼!\n");

scanf("%d",&num);

if(find(p,num,&position)==1)

{

printf("%d\t%s\t%s\n",num,p->h[position].name,p->h[position].address);

}

else?printf("要查找的聯(lián)系人不存在\n");

return?1;

}

4.7添加聯(lián)系人函數(shù)newnum()

添加聯(lián)系人函數(shù)newnum(),輸入要插入的聯(lián)系人信息,通過調(diào)用插入函數(shù)Append(),若聯(lián)系人已存在,則輸出聯(lián)系人存在提示;若不存在,則將聯(lián)系人信息添加到通訊錄。

int?newnum(phash?p){

int?num,position;

Data?n;

printf("輸入要新建的聯(lián)系人的號碼!\n");

scanf("%d",&num);

if(find(p,num,&position)==1)//檢索聯(lián)系人是否存在

{printf("聯(lián)系人存在!\n");

return?0;

}

else{

n.num=num;

printf("請輸入需要新建聯(lián)系人的信息!(姓名?地址,空格隔開)\n");

scanf("%s?%s",&n.name,&n.address);

Append(p,n);

printf("新建聯(lián)系人完成!\n");

return?1;

}

}

4.8刪除函數(shù)Delete()

刪除函數(shù)Delete(),刪除一個元素后會產(chǎn)生空位,因為有可能因碰撞導(dǎo)致其余聯(lián)系人不再以散列表形式存儲,需逐項查找空位后面的元素把所碰撞元素賦值到空位,如此循環(huán)下去,直到構(gòu)成一個新的散列表。通過調(diào)用檢索函數(shù)find()返回刪除元素所在位置position,記為i,刪除該元素后用j標(biāo)記空位,用(i++)%50來查找空位后元素,用r來表示i標(biāo)記位置的元素未發(fā)生碰撞時應(yīng)在的位置。在for循環(huán)中通過使用3個if語句來排除不受影響的元素,而后將選出的元素賦值到相應(yīng)位置。

int?Delete(phash?p){

int?num,i,j,r;//num:要刪除的聯(lián)系人號碼;j:標(biāo)記空位;i:移動查找是否碰撞;r:i的聯(lián)系人號碼未發(fā)生碰撞時應(yīng)在位置。

int?position;

printf("輸入要刪除的聯(lián)系人的號碼!\n");

scanf("%d",&num);

if(find(p,num,&position)==1){

i=position;

for(;;){

p->h[i].num=0;//刪除i產(chǎn)生一個空位。

j=i;//j存放空位位置,從后面的元素中選出一個元素填補空位

for(;;){

i=(++i)%50;

if(p->h[i].num==0)//若遇到未使用的位置則調(diào)整結(jié)束

{

printf("聯(lián)系人已經(jīng)刪除!\n");

return?1;

}

r=p->h[i].num%50;//r為i位置中的元素未發(fā)生碰撞應(yīng)在位置

///

//若r位于空位和當(dāng)前位置i之間,則說明該元素不受影響,則跳出尋找下一個

if(j

continue;

if(j>i?&&?j

continue;

if(j>i?&&?r<=i)

continue;

//以上3條語句保證了r位于i與j之間

break;

}

p->h[j]=p->h[i];//將選擇的元素賦值到空位

}

}

else?{printf("不存在該人!\n");}

return?1;

}

4.9修改聯(lián)系人函數(shù)alter()

修改聯(lián)系人函數(shù)alter(),輸入聯(lián)系人號碼通過調(diào)用find()函數(shù)來檢索,若該聯(lián)系人信息存在,則將更新后的信息保存至通訊錄;若不存在,則輸出不存在該人。

int?alter(phash?p){

int?num;

int?position;

printf("輸入要修改的聯(lián)系人的號碼!\n");

scanf("%d",&num);

if(find(p,num,&position)==1){//檢索是否存在該聯(lián)系人

p->h[position].num=num;

printf("請輸入需要修改的信息!(姓名?地址,空格隔開)\n");

scanf("%s?%s",&p->h[position].name,&p->h[position].address);

}

else

{

printf("不存在該人!\n");

}

return?1;

}

4.10顯示函數(shù)list()

顯示函數(shù)list(),將散列表中的所有聯(lián)系人信息全部輸出到界面。

int?list(phash?p){

int?i;

for(i=0;i<50;i++){

if(p->h[i].num!=0)

printf("%d\t%s\t%s\n",p->h[i].num,p->h[i].name,p->h[i].address);

}

return?1;

}

4.11保存文件函數(shù)save()

保存文件函數(shù)save(),當(dāng)文件已存在時,格式化輸出散列表中的聯(lián)系人信息到指定文件“xinxi.txt”。當(dāng)文件不存在時,自動創(chuàng)建新文件“xinxi.txt”并格式化輸出。

int?save(phash?p){

int?i;

FILE?*fout;

if((fout=fopen("xinxi.txt","w"))==NULL)//判斷文件是否存在

{

printf("寫入文件失敗!\n");

return?0;

}

for(i=0;i<50;i++)

{???if(p->h[i].num?!=?0)//判斷聯(lián)系人是否存在

fprintf(fout,"%d?%s?%s\n",p->h[i].num,p->h[i].name,p->h[i].address);//輸出存在的聯(lián)系人

}

fclose(fout);//關(guān)閉文件

printf("文件已保存\n");

return?1;

}

4.12讀取函數(shù)load()

讀取函數(shù)load()當(dāng)文件存在時并且未到達文件末尾,循環(huán)讀取聯(lián)系人信息到臨時存儲區(qū)temp,然后調(diào)用插入函數(shù)Append(),把聯(lián)系人信息插入到散列表。

int?load(phash?p){

FILE?*fin;

Data?temp;

int?i;

if((fin=fopen("xinxi.txt","r"))==NULL)//判斷文件是否存在

{

printf("文件讀取失敗!\n");

return?0;

}

while(!feof(fin))//判斷文件是否結(jié)束

{

i=fscanf(fin,"%d?%s?%s",&temp.num,&temp.name,&temp.address);//讀取聯(lián)系人信息

if(i==-1)?break;

else?Append(p,temp);//把讀取的信息插入散列表

}

fclose(fin);

printf("文件讀取成功\n");

return?1;

}

5、調(diào)試分析

開始界面:

試驗初始化功能:

試驗保存文件功能:

試驗讀取功能:

試驗顯示功能:

試驗新建功能:

試驗查詢功能:

試驗查詢異常數(shù)據(jù):

試驗刪除功能:

試驗刪除功能結(jié)果是否正確:

試驗刪除異常數(shù)據(jù):

試驗修改異常數(shù)據(jù):

試驗修改功能:

試驗修改功能結(jié)果是否正確:

6.問題及難點所在

創(chuàng)建函數(shù)的難點:為散列表申請空間后,所有位置均為空值,由于在檢索函數(shù)及插入函數(shù)中都要對散列表中每個位置的元素及要操作的元素進行比較,當(dāng)位置為空比較時會生成亂碼,干擾下一步的操作。

改進方法是:將所有位置均賦值為0.

檢索函數(shù)的難點:在查找、新建、刪除等功能中所要操作元素及其對散列表中對應(yīng)位置是否為空及散列表是否溢出等情況均未知。無法進行下一步操作。

改進方法:定義檢索函數(shù)根據(jù)用戶的號碼進行散列檢索,用散列函數(shù)來逐項查找位置,若當(dāng)前位置已存在或為空時,返回當(dāng)前位置;若散列表以溢出,則將當(dāng)前位置賦值為-1.

添加聯(lián)系人信息是個難點,要先輸入要添加的聯(lián)系人號碼,調(diào)用Find()函數(shù)來檢索該聯(lián)系人在散列表中是否已經(jīng)存在,若存在,輸出“聯(lián)系人存在”,結(jié)束該程序,若不存在,將添加聯(lián)系人呢相關(guān)信息保存到結(jié)構(gòu)體內(nèi),通過調(diào)用插入函數(shù)Append()添加聯(lián)系人信息。

保存和讀取函數(shù)是一個難點:在保存文件函數(shù)中,使用fopen函數(shù)打開文件,對散列表進行遍歷,當(dāng)表中有元素時,使用fprintf()函數(shù),格式化輸出到“xinxi.txt”文件,然后用fclose()函數(shù)關(guān)閉文件。在讀取文件時,使用fopen()函數(shù)打開文件,當(dāng)文件未到達末尾,就格式化讀取信息到臨時結(jié)構(gòu)體,然后調(diào)用插入函數(shù)Append(),把信息存放到散列表中,最后用fclose()函數(shù)關(guān)閉文件。

刪除函數(shù)是一個難點:不能簡單的將要刪除的結(jié)點的電話號碼直接置為0,因為為0是檢索失敗的根據(jù),這樣直接置0,會導(dǎo)致碰撞的元素檢索失敗。

解決方法:1:在被刪除結(jié)點做標(biāo)記(例如將關(guān)鍵碼改為負值),不是真的刪除,這樣,做了多次刪除后,形式上散列表是滿的,但實際上是很空的。

2:繞過刪除操作。把要刪除號碼置為0,然后保存文件,重新創(chuàng)建散列表,讀取文件,這樣新建了一個散列表,從而繞過了刪除的麻煩討論。

3:直接刪除元素,產(chǎn)生空位,通過移動元素,使碰撞關(guān)系仍然成立。這也是我們采用的方法。我們通過輸入聯(lián)系人號碼調(diào)用find()函數(shù)進行檢索,若該聯(lián)系人存在,將該聯(lián)系人的信息刪除并返回當(dāng)前位置賦值給i,后用j=i標(biāo)記當(dāng)前空位置,用i++繼續(xù)向下查找,用r表示i聯(lián)系人號碼未發(fā)生碰撞應(yīng)在位置。用3個if語句依次排除不受影響的元素,當(dāng)r位于j與i之間時,所標(biāo)記的元素即為不需要調(diào)整的元素。后用for循環(huán)繼續(xù)查找,直到出現(xiàn)未使用的位置。

7、算法設(shè)計的思想

整體思想:

為了方便的實現(xiàn)快速查找,算法中用到了數(shù)據(jù)結(jié)構(gòu)中“字典的散列表示”這一章節(jié)的知識,基本思想是:選擇一個從關(guān)鍵碼到地址的散列函數(shù)h,對于每個關(guān)鍵碼為key的元素,計算出h(key),期望把對應(yīng)的元素存儲到h(key)指示的地址上,如果兩個不相等的關(guān)鍵碼key1和key2,用散列函數(shù)h計算得到相同的散列地址(即h(key1)=h(key2)),此現(xiàn)象即為碰撞,為了實現(xiàn)散列法必須解決存儲時碰撞的問題,處理碰撞需要付出時間和空間代價,因此要提高散列法處理效率,就應(yīng)該盡量減少碰撞。算法中對于碰撞的處理使用的是線性探查法,即將基本存儲區(qū)看作一個循環(huán)表。若在地址為d=h(key)的單元發(fā)生碰撞,則依次探查下述地址單元:d+1,d+2,....,m-1,0,1,....d-1(m為基本存儲區(qū)的長度)直到找到一個空單元或查找到關(guān)鍵碼為key的元素為止。如果從單元d開始探查,查找一遍后,又回到地址d,則表示基本存儲區(qū)已經(jīng)溢出。

本算法中采用的散列函數(shù)為h(key)=key%50.

7.1?結(jié)構(gòu)體設(shè)計

需要包括聯(lián)系人的電話號碼,姓名和住址。

7.2創(chuàng)建散列表create()

創(chuàng)建函數(shù)的思想:由于散列表創(chuàng)建后要方便用戶檢索及各項操作,所以在創(chuàng)建之后將所有的空位置全部賦值為0以方便下一步的操作。

7.3檢索函數(shù)find()

檢索函數(shù)的思想:在新建、查找、刪除等功能中所操作元素當(dāng)前位置是否為空以及為空時操作對象的位置等未知,所要定義檢索函數(shù)來實現(xiàn)此功能。我們設(shè)計通過輸入用戶號碼num來進行散列檢索,用(num)%50來查找應(yīng)在位置,若查找成功,則返回1,否則若所在位置號碼為空,則返回0,并將當(dāng)前元素位置賦值給d;若既不為1,也不為0,繼續(xù)對下一個位置進行查找。

7.4插入函數(shù)Append()

插入函數(shù)的思想:由于所要插入元素應(yīng)在位置是否為空未知,所以調(diào)用檢索函數(shù)來判斷,若已存在,則返回;否則將元素插入到該位置。

7.5初始化函數(shù)start()

初始化函數(shù)的思想:定義結(jié)構(gòu)體st來臨時存儲信息,后調(diào)用插入函數(shù)Append()來將所有信息插入到規(guī)定位置。

7.6查找聯(lián)系人函數(shù)findnum()

為查找到聯(lián)系人的相關(guān)信息,輸入要查詢的聯(lián)系人的號碼,通過調(diào)用Find()函數(shù)來檢索該聯(lián)系人信息是否存在。若存在,則輸出聯(lián)系人信息;若不存在,則輸出所查找聯(lián)系人不存在。

7.7添加聯(lián)系人函數(shù)newnum()

為添加聯(lián)系人信息,先輸入要添加的聯(lián)系人號碼,調(diào)用Find()函數(shù)來檢索該聯(lián)系人在散列表中是否已經(jīng)存在,若存在,輸出“聯(lián)系人存在”,結(jié)束該程序,若不存在,將添加聯(lián)系人呢相關(guān)信息保存到結(jié)構(gòu)體內(nèi),通過調(diào)用插入函數(shù)Append()添加聯(lián)系人信息。

7.8刪除函數(shù)Delete()

我們通過輸入聯(lián)系人號碼調(diào)用find()函數(shù)進行檢索,若該聯(lián)系人存在,將該聯(lián)系人的信息刪除并返回當(dāng)前位置賦值給i,后用j=i標(biāo)記當(dāng)前空位置,用i++繼續(xù)向下查找,用r表示i聯(lián)系人號碼未發(fā)生碰撞應(yīng)在位置。用3個if語句依次排除不受影響的元素,當(dāng)r位于j與i之間時,所標(biāo)記的元素即為不需要調(diào)整的元素。后用for循環(huán)繼續(xù)查找,直到出現(xiàn)未使用的位置。

7.9修改函數(shù)alter()

為修改聯(lián)系人信息,先輸入要修改的聯(lián)系人號碼,通過調(diào)用find()函數(shù)來檢索該聯(lián)系人在散列表中是否已經(jīng)存在,若該聯(lián)系人存在,請輸入需要修改的信息保存至通訊錄;若不存在,則輸出“不存在該人”。

7.10顯示函數(shù)list()

設(shè)置循環(huán),從散列表中的第一個位置依次向后檢索,若所檢索位置非空,將散列表中信息輸出。

6、算法流程圖

9:總結(jié)

由于時間緊迫和個人能力的不足,所做的程序還有極大的改善空間,只能算是勉強達到要求罷了。例如存儲的電話號碼僅有五位,這在實際使用中是遠遠不夠的,還有如果不按照要求輸入信息,可能產(chǎn)生未知錯誤,程序的健壯性不夠。

此次課程設(shè)計,感觸很多,雖然在做程序的時候由于基礎(chǔ)知識掌握不牢,吃了很多苦頭,但是總體來說還是甜多于苦,讓我知道了我離實際應(yīng)用的差距。在一次次的修改與檢查中,鞏固了我許多知識,讓我明白了只有理論與實踐結(jié)合,才能更好的掌握知識,才能真正的做出合格的產(chǎn)品。

本次課程設(shè)計,讓我進一步明白了應(yīng)用程序是怎么產(chǎn)生的,從需求分析到詳細設(shè)計,只有清晰的結(jié)構(gòu),才能產(chǎn)生合格的程序,課程設(shè)計把我以前學(xué)到的知識第一次結(jié)合起來,使我第一次感覺到編程不只是精細的繡花,更是縱觀全局,運籌帷幄的戰(zhàn)爭,只有大的方向和結(jié)構(gòu)清楚,才能打贏這場戰(zhàn)爭。

本次課程設(shè)計,極大的提升了我的實際動手能力和獨立思考能力。在刪除函數(shù)的設(shè)計過程中,我就想過三種方法,雖然不一定能達到要求,但是三種完全不同的方法,極大的鍛煉了我發(fā)散思維能力,使我學(xué)到了很多。對與如此簡單的一個通訊錄,已經(jīng)讓我焦頭爛額,苦不堪言了,那些更高級的軟件該有多么復(fù)雜啊,不由得對程序員們產(chǎn)生了深深的敬意,也對自己的能力有了一個清晰的認識,我將繼續(xù)努力學(xué)習(xí)編程知識,我相信我能在這條路上走的更遠!

10:附錄:c語言代碼

1 #include

2 #include

3

4 structxinxi;5 structxinxi6 {7 intnum;8 char name[10];9 char address[10];10 };//個人信息結(jié)構(gòu)體

11 typedef structxinxi Data;12

13 structhash{14 intmax;15 intlen;16 Data h[50];17 };//散列表

18 typedef struct hash *phash;19

20

21

22 /*

23 Menu() 的功能:顯示英文提示選單。24 Quit() 的功能:退出選單。25 /Create() 的功能:創(chuàng)建新的通訊錄。26 /Append() 的功能:在通訊錄寫入新的信息,并返回選單。27 /Find() 的功能:查詢某人的信息,如果找到了,則顯示該人的信息,如果沒有則提示通訊錄中沒有此人的信息,并返回選單。28 /Alter() 的功能:修改某人的信息,如果未找到要修改的人,則提示通訊錄中沒有此人的信息,并返回選單。29 /Delete() 的功能:刪除某人的信息,如果未找到要刪除的人,則提示通訊錄中沒有此人的信息,并返回選單。30 /List() 的功能:顯示通訊錄中的所有記錄。31 /Save() 的功能:保存通訊錄中的所有記錄到指定文件中。32 /Load() 的功能:從指定文件中讀取通訊錄中的記錄。33 */

34

35 ///

36 phash creat();37 intAppend(phash p,Data x);38 int find(phash p,int num,int *position);39 intalter(phash p);40 intDelete(phash p);41 intlist(phash p);42 intfindnum(phash p);43 intsave(phash p);44 intload(phash p);45 intstart(phash p);46 intnewnum(phash p);47 intmenu(phash p);48 /函數(shù)聲明49

50

51 /

52 phash creat(){53 inti;54 phash p=(phash)malloc(sizeof(structhash));55 if(p!=NULL){56 p->max=50;57 p->len=0;58 for(i=0;i<50;i++) {p->h[i].num=0;} //關(guān)鍵碼全部置零

59 returnp;60 }61 }62 ///創(chuàng)建散列表///63

64

65 66 intAppend(phash p,Data x){67 intposition;68 if(find(p,x.num,&position)==1)//散列表中已經(jīng)存在

69 {70 printf("發(fā)現(xiàn)已經(jīng)存在!\n");71 }72 else if(position!=-1){73 p->h[position]=x;//插入信息

74 p->len++;75 }76 else return 0;77 return 1;78 }79 //散列表的插入///80

81

82 /

83 int find(phash p,int num,int *position){84 intd,inc;85 d=num%50;//散列函數(shù)

86 for(inc=0;inc<50;inc++){87 if(p->h[d].num==num){88 *position=d;//檢索成功

89 return 1;90 }91 else if(p->h[d].num==0){92 *position=d;//檢索失敗

93 return 0;94 }95 d=(d+1)%50;96 }97 *position=-1;//散列表溢出

98 return 0;99 }100 /散列表的檢索//101

102

103

104 ///105 intalter(phash p){106 intnum;107 intposition;108 printf("輸入要修改的聯(lián)系人的號碼!\n");109 scanf("%d",&num);110

111 if(find(p,num,&position)==1){//檢索是否存在該聯(lián)系人

112 p->h[position].num=num;113 printf("請輸入需要修改的信息!(姓名 地址,空格隔開)\n");114 scanf("%s %s",&p->h[position].name,&p->h[position].address);115 }116 else

117 {118 printf("不存在該人!\n");119 }120

121 return 1;122 }123 /修改聯(lián)系人信息///124

125

126

127 //

128

129 intDelete(phash p){130 int num,i,j,r;//num:要刪除的聯(lián)系人號碼;j:標(biāo)記空位;i:移動查找是否碰撞;r:i的聯(lián)系人號碼未發(fā)生碰撞時應(yīng)在位置。

131 intposition;132 printf("輸入要刪除的聯(lián)系人的號碼!\n");133 scanf("%d",&num);134

135 if(find(p,num,&position)==1){136 i=position;137 for(;;){138 p->h[i].num=0;//刪除i產(chǎn)生一個空位。

139 j=i;//j存放空位位置,從后面的元素中選出一個元素填補空位

140 for(;;){141 i=(++i)%50;142 if(p->h[i].num==0)//若遇到未使用的位置則調(diào)整結(jié)束

143 {144 printf("聯(lián)系人已經(jīng)刪除!\n");145 return 1;146 }147 r=p->h[i].num%50;//r為i位置中的元素未發(fā)生碰撞應(yīng)在位置

148 ///149 //若r位于空位和當(dāng)前位置i之間,則說明該元素不受影響,則跳出尋找下一個

150 if(ji && ji && r<=i)155 continue;156 //以上3條語句保證了r位于i與j之間

157 158 break;159 }160 p->h[j]=p->h[i];//將選擇的元素賦值到空位

161 }162

163

164

165 }166 else {printf("不存在該人!\n");}167 return 1;168 }169

170

171 /刪除聯(lián)系人/

172

173

174

175 176 intlist(phash p){177 inti;178 for(i=0;i<50;i++){179 if(p->h[i].num!=0)180 printf("%d\t%s\t%s\n",p->h[i].num,p->h[i].name,p->h[i].address);181 }182 return 1;183 }184 ///輸出所有聯(lián)系人//

185

186

187

188 ///

189 intsave(phash p){190 inti;191 FILE *fout;192 if((fout=fopen("xinxi.txt","w"))==NULL)//判斷文件是否存在

193 {194 printf("寫入文件失敗!\n");195 return 0;196 }197 for(i=0;i<50;i++)198 { if(p->h[i].num != 0)//判斷聯(lián)系人是否存在

199 fprintf(fout,"%d %s %s\n",p->h[i].num,p->h[i].name,p->h[i].address);//輸出存在的聯(lián)系人

200 }201 fclose(fout);//關(guān)閉文件

202 printf("文件已保存\n");203 return 1;204 }205 //保存聯(lián)系人到指定文件

206

207

208 ///

209 intload(phash p){210 FILE *fin;211 Data temp;212 inti;213 if((fin=fopen("xinxi.txt","r"))==NULL)//判斷文件是否存在

214 {215 printf("文件讀取失敗!\n");216 return 0;217 }218 while(!feof(fin))//判斷文件是否結(jié)束

219 {220 i=fscanf(fin,"%d %s %s",&temp.num,&temp.name,&temp.address);//讀取聯(lián)系人信息

221 if(i==-1) break;222 else Append(p,temp);//把讀取的信息插入散列表

223 }224 fclose(fin);225 printf("文件讀取成功\n");226 return 1;227 }228 ///讀取指定文件的信息229

230

231 /

232 intstart(phash p){233 inti;234 Data st;235 printf("請輸入三名聯(lián)系人的信息!(電話號碼,姓名,地址,空格隔開)\n");236 for(i=0;i<3;i++)237 {238 scanf("%d %s %s",&st.num,&st.name,&st.address);239 Append(p,st);240

241 }242 return 1;243 }244 初始化信息

245

246

247 //

248 intnewnum(phash p){249 intnum,position;250 Data n;251 printf("輸入要新建的聯(lián)系人的號碼!\n");252 scanf("%d",&num);253 if(find(p,num,&position)==1)//檢索聯(lián)系人是否存在

254 {printf("聯(lián)系人存在!\n");255 return 0;256 }257 else{258 n.num=num;259 printf("請輸入需要新建聯(lián)系人的信息!(姓名 地址,空格隔開)\n");260 scanf("%s %s",&n.name,&n.address);261 Append(p,n);262 printf("新建聯(lián)系人完成!\n");263 return 1;264 }265 }266 新建聯(lián)系人并插入散列表/267

268

269

270 ///271 intfindnum(phash p){272 inti,num,position;273 printf("輸入要查詢的聯(lián)系人的號碼!\n");274 scanf("%d",&num);275 if(find(p,num,&position)==1)276 {277 printf("%d\t%s\t%s\n",num,p->h[position].name,p->h[position].address);278 }279 else printf("要查找的聯(lián)系人不存在\n");280 return 1;281 }282 /查找聯(lián)系人并輸出信息//283

284

285

286 ///287 intmenu(phash p){288 inti;289

290 printf("********請輸入要進行的操作!*********\n\n0-退出通訊錄選單\n1-新建聯(lián)系人\n2-查找聯(lián)系人\n3-刪除聯(lián)系人\n4-修改聯(lián)系人的相關(guān)信息\n5-保存通訊錄至文件\n6-讀取文件中的聯(lián)系人信息\n7-顯示通信錄的全部信息\n");291 scanf("%d",&i);292

293 switch(i)294 {295 case 0: exit(0); break;296 case 1: newnum(p); break;297 case 2: findnum(p); break;298 case 3: Delete(p); break;299 case 4: alter(p); break;300 case 5: save(p); break;301 case 6: load(p); break;302 case 7: list(p); break;303 default : printf("選擇有誤!\n");304 }305 return 1;306 }307 ///選單///308

309

310 intmain(){311

312 inti;313 phash h;314 h=creat();315 printf("********************歡迎使用通訊錄存儲系統(tǒng)**************************\n");316 printf("* 當(dāng)聯(lián)系人信息文件不存在時,請初始化通訊錄,存入聯(lián)系人的相關(guān)信息。*\n");317 printf("* 當(dāng)聯(lián)系人信息文件存在時,請讀取信息文件。 *\n");318 printf("* 在執(zhí)行完所有操作時,請保存文件后退出 *\n");319 printf("* 可存儲號碼50個 *\n");320 printf("* 號碼長度為5位 *\n");321 printf("* 姓名,地址為10個字符 *\n");322 printf("********************************************************************\n");323 printf("\n");324 printf("請選擇要進行的操作!1-初始化,2-讀取聯(lián)系人\n");325 scanf("%d",&i);326 if(i==1)327 start(h);328 else if(i==2)329 load(h);330 else

331 printf("輸入錯誤!\n");332 for(;;)333 {334 menu(h);335 }336 return 1;337 }

/

80

81

82 /

83 int find(phash p,int num,int *position){

84 int d,inc;

85 d=num%50;//散列函數(shù)

86 for(inc=0;inc<50;inc++){

87 if(p->h[d].num==num){

88 *position=d;//檢索成功

89 return 1;

90 }

91 else if(p->h[d].num==0){

92 *position=d;//檢索失敗

93 return 0;

94 }

95 d=(d+1)%50;

96 }

97 *position=-1;//散列表溢出

98 return 0;

99 }

100 /散列表的檢索//

101

102

103

104 ///

105 int alter(phash p){

106 int num;

107 int position;

108 printf("輸入要修改的聯(lián)系人的號碼!\n");

109 scanf("%d",&num);

110

111 if(find(p,num,&position)==1){//檢索是否存在該聯(lián)系人

112 p->h[position].num=num;

113 printf("請輸入需要修改的信息!(姓名 地址,空格隔開)\n");

114 scanf("%s %s",&p->h[position].name,&p->h[position].address);

115 }

116 else

117 {

118 printf("不存在該人!\n");

119 }

120

121 return 1;

122 }

123 /修改聯(lián)系人信息///

124

125

126

127 //

128

129 int Delete(phash p){

130 int num,i,j,r;//num:要刪除的聯(lián)系人號碼;j:標(biāo)記空位;i:移動查找是否碰撞;r:i的聯(lián)系人號碼未發(fā)生碰撞時應(yīng)在位置。

131 int position;

132 printf("輸入要刪除的聯(lián)系人的號碼!\n");

133 scanf("%d",&num);

134

135 if(find(p,num,&position)==1){

136 i=position;

137 for(;;){

138 p->h[i].num=0;//刪除i產(chǎn)生一個空位。

139 j=i;//j存放空位位置,從后面的元素中選出一個元素填補空位

140 for(;;){

141 i=(++i)%50;

142 if(p->h[i].num==0)//若遇到未使用的位置則調(diào)整結(jié)束

143 {

144 printf("聯(lián)系人已經(jīng)刪除!\n");

145 return 1;

146 }

147 r=p->h[i].num%50;//r為i位置中的元素未發(fā)生碰撞應(yīng)在位置

148 ///

149 //若r位于空位和當(dāng)前位置i之間,則說明該元素不受影響,則跳出尋找下一個

150 if(j

151 continue;

152 if(j>i && j

153 continue;

154 if(j>i && r<=i)

155 continue;

156 //以上3條語句保證了r位于i與j之間

157

158 break;

159 }

160 p->h[j]=p->h[i];//將選擇的元素賦值到空位

161 }

162

163

164

165 }

166 else {printf("不存在該人!\n");}

167 return 1;

168 }

169

170

171 /刪除聯(lián)系人/

172

173

174

175

176 int list(phash p){

177 int i;

178 for(i=0;i<50;i++){

179 if(p->h[i].num!=0)

180 printf("%d\t%s\t%s\n",p->h[i].num,p->h[i].name,p->h[i].address);

181 }

182 return 1;

183 }

184 ///輸出所有聯(lián)系人//

185

186

187

188 ///

189 int save(phash p){

190 int i;

191 FILE *fout;

192 if((fout=fopen("xinxi.txt","w"))==NULL)//判斷文件是否存在

193 {

194 printf("寫入文件失敗!\n");

195 return 0;

196 }

197 for(i=0;i<50;i++)

198 { if(p->h[i].num != 0)//判斷聯(lián)系人是否存在

199 fprintf(fout,"%d %s %s\n",p->h[i].num,p->h[i].name,p->h[i].address);//輸出存在的聯(lián)系人

200 }

201 fclose(fout);//關(guān)閉文件

202 printf("文件已保存\n");

203 return 1;

204 }

205 //保存聯(lián)系人到指定文件

206

207

208 ///

209 int load(phash p){

210 FILE *fin;

211 Data temp;

212 int i;

213 if((fin=fopen("xinxi.txt","r"))==NULL)//判斷文件是否存在

214 {

215 printf("文件讀取失敗!\n");

216 return 0;

217 }

218 while(!feof(fin))//判斷文件是否結(jié)束

219 {

220 i=fscanf(fin,"%d %s %s",&temp.num,&temp.name,&temp.address);//讀取聯(lián)系人信息

221 if(i==-1) break;

222 else Append(p,temp);//把讀取的信息插入散列表

223 }

224 fclose(fin);

225 printf("文件讀取成功\n");

226 return 1;

227 }

228 ///讀取指定文件的信息

229

230

231 /

232 int start(phash p){

233 int i;

234 Data st;

235 printf("請輸入三名聯(lián)系人的信息!(電話號碼,姓名,地址,空格隔開)\n");

236 for(i=0;i<3;i++)

237 {

238 scanf("%d %s %s",&st.num,&st.name,&st.address);

239 Append(p,st);

240

241 }

242 return 1;

243 }

244 初始化信息

245

246

247 //

248 int newnum(phash p){

249 int num,position;

250 Data n;

251 printf("輸入要新建的聯(lián)系人的號碼!\n");

252 scanf("%d",&num);

253 if(find(p,num,&position)==1)//檢索聯(lián)系人是否存在

254 {printf("聯(lián)系人存在!\n");

255 return 0;

256 }

257 else{

258 n.num=num;

259 printf("請輸入需要新建聯(lián)系人的信息!(姓名 地址,空格隔開)\n");

260 scanf("%s %s",&n.name,&n.address);

261 Append(p,n);

262 printf("新建聯(lián)系人完成!\n");

263 return 1;

264 }

265 }

266 新建聯(lián)系人并插入散列表/

267

268

269

270 ///

271 int findnum(phash p){

272 int i,num,position;

273 printf("輸入要查詢的聯(lián)系人的號碼!\n");

274 scanf("%d",&num);

275 if(find(p,num,&position)==1)

276 {

277 printf("%d\t%s\t%s\n",num,p->h[position].name,p->h[position].address);

278 }

279 else printf("要查找的聯(lián)系人不存在\n");

280 return 1;

281 }

282 /查找聯(lián)系人并輸出信息//

283

284

285

286 ///

287 int menu(phash p){

288 int i;

289

290 printf("********請輸入要進行的操作!*********\n\n0-退出通訊錄選單\n1-新建聯(lián)系人\n2-查找聯(lián)系人\n3-刪除聯(lián)系人\n4-修改聯(lián)系人的相關(guān)信息\n5-保存通訊錄至文件\n6-讀取文件中的聯(lián)系人信息\n7-顯示通信錄的全部信息\n");

291 scanf("%d",&i);

292

293 switch(i)

294 {

295 case 0: exit(0); break;

296 case 1: newnum(p); break;

297 case 2: findnum(p); break;

298 case 3: Delete(p); break;

299 case 4: alter(p); break;

300 case 5: save(p); break;

301 case 6: load(p); break;

302 case 7: list(p); break;

303 default : printf("選擇有誤!\n");

304 }

305 return 1;

306 }

307 ///選單///

308

309

310 int main(){

311

312 int i;

313 phash h;

314 h=creat();

315 printf("********************歡迎使用通訊錄存儲系統(tǒng)**************************\n");

316 printf("* 當(dāng)聯(lián)系人信息文件不存在時,請初始化通訊錄,存入聯(lián)系人的相關(guān)信息。*\n");

317 printf("* 當(dāng)聯(lián)系人信息文件存在時,請讀取信息文件。 *\n");

318 printf("* 在執(zhí)行完所有操作時,請保存文件后退出 *\n");

319 printf("* 可存儲號碼50個 *\n");

320 printf("* 號碼長度為5位 *\n");

321 printf("* 姓名,地址為10個字符 *\n");

322 printf("********************************************************************\n");

323 printf("\n");

324 printf("請選擇要進行的操作!1-初始化,2-讀取聯(lián)系人\n");

325 scanf("%d",&i);

326 if(i==1)

327 start(h);

328 else if(i==2)

329 load(h);

330 else

331 printf("輸入錯誤!\n");

332 for(;;)

333 {

334 menu(h);

335 }

336 return 1;

337 }

總結(jié)

以上是生活随笔為你收集整理的JAVA散列表个人通讯录_散列表实现简易通讯录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 少妇饥渴放荡91麻豆 | 一品道av| 中文字幕在线看 | 国产精品久久久久久免费 | 精品一区二区三区在线观看视频 | 精品一区二区三区四区五区六区 | 天天想你免费观看完整版高清电影 | 四虎亚洲精品 | 欧美激情免费 | 国产精品99久久久久久久久久久久 | 亚洲30p | 国产精品伦理一区 | 国产高清精品软件丝瓜软件 | 亚洲成人久 | 国产精品人人妻人人爽 | 日韩欧美一级大片 | 国产日韩欧美自拍 | 成人福利小视频 | 国产三级91 | 一区二区在线免费观看视频 | 欧美性色黄大片手机版 | 手机看片国产精品 | 久久久国产亚洲 | 欧美韩一区二区 | 大尺度舌吻呻吟声 | 视频一区二区视频 | 国产熟女一区二区丰满 | 欧美整片sss| 一区二区三区四区在线 | 国产日韩在线一区 | 射久久久 | 视频在线免费观看 | h网站在线| 妖精视频在线观看 | 中文字幕乱码亚洲无线三区 | 成人激情免费视频 | 欧美国产一级片 | 香蕉伊人网 | 欧美日韩精品 | 看污网站 | 国产精品91久久久 | 在线观看免费观看在线 | 欧美性在线视频 | 免费看片视频 | 三级伦理视频 | 97一区二区三区 | 黄色免费观看网站 | 成人爽a毛片一区二区 | xxxx18国产| 亚洲国产剧情 | 可以免费观看的av | 99久久久国产精品免费蜜臀 | 亚洲色图小说 | a√天堂在线 | 国产欧美视频在线播放 | 少妇被躁爽到高潮无码文 | 成年人在线观看av | 欧美日韩中文字幕在线 | www.国产视频.com | 一区二区三区视频免费看 | 在线免费观看黄网 | 国产成人不卡 | 国产字幕侵犯亲女 | 靠逼网站 | 俄罗斯av在线| 免费成人进口网站 | 超碰69| 激情毛片视频 | 午夜蜜桃视频 | 国产传媒一区二区三区 | 国产激情av| 91综合精品 | av在哪里看 | 波多野吉衣伦理片 | 国产精品二区一区二区aⅴ 一卡二卡三卡在线观看 | 日韩免费一级片 | 日本不卡网 | 久草精品视频在线观看 | 亚洲日本色 | 欧美第一页浮力影院 | 狠狠操一区二区 | 在线97| 中文 日韩 欧美 | 91重口味| 激情无码人妻又粗又大 | 爱爱视频免费看 | 人人妻人人爽欧美成人一区 | 99精品免费视频 | 一级片视频免费看 | 国产操女人 | 娇妻被老王脔到高潮失禁视频 | 五月激情视频 | gogo人体做爰大胆视频 | 麻豆视频国产精品 | 丰满少妇乱子伦精品看片 | 姐姐你真棒插曲快来救救我电影 | 日韩不卡在线播放 | 欧美性猛交aaaa片黑人 | 亚洲精品www.|