通訊錄管理系統(tǒng)(C語言)-單鏈表_第1頁
通訊錄管理系統(tǒng)(C語言)-單鏈表_第2頁
通訊錄管理系統(tǒng)(C語言)-單鏈表_第3頁
通訊錄管理系統(tǒng)(C語言)-單鏈表_第4頁
通訊錄管理系統(tǒng)(C語言)-單鏈表_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

/XX大學(xué)物理與電子工程學(xué)院程序與設(shè)計訓(xùn)練通訊錄管理系統(tǒng)實驗報告專業(yè)班級:電子121設(shè)計人員:元達(dá)鵬學(xué)號:121920006520XX6月24日通訊錄管理系統(tǒng)需求分析設(shè)計題目及需求:查看功能:選擇此功能時,列出下列三類選擇。A辦公類B個人類C商務(wù)類,當(dāng)選中某類時,顯示出此類所有數(shù)據(jù)中的姓名和電話號碼增加功能:能錄入新數(shù)據(jù)〔一個結(jié)點包括:姓名、電話號碼、分類〔可選項有:A辦公類B個人類C〔3當(dāng)錄入了重復(fù)的姓名和電話號碼時,則提示數(shù)據(jù)錄入重復(fù)并取消錄入;當(dāng)通信錄中超過15條信息時,存儲空間已滿,不能再錄入新數(shù)據(jù);錄入的新數(shù)據(jù)能按遞增的順序自動進(jìn)行條目編號。修改功能:選中某個人的姓名時,可對此人的相應(yīng)數(shù)據(jù)進(jìn)行修改刪除功能:選中某個人的姓名時,可對此人的相應(yīng)數(shù)據(jù)進(jìn)行刪除,并自動調(diào)整后續(xù)條目的編號。系統(tǒng)功能需求分析:主要包含以下幾種功能:建立通訊錄〔建立功能刪除通訊人〔刪除功能保存通訊錄〔保存功能讀取通訊錄文件〔讀取功能查找通訊人〔查找功能添加通訊人〔添加功能修改通訊人信息〔修改功能退出通訊錄系統(tǒng)概要設(shè)計系統(tǒng)功能模塊圖:查找退出修改添加讀取保存刪除建立主菜單查找退出修改添加讀取保存刪除建立主菜單建立功能: 在主菜單中輸入1,進(jìn)入建立功能。用戶自己輸入通訊錄文件名,建 立一個新的通訊錄,便開始輸入信息,一旦想結(jié)束添加,在輸入姓 名處輸入"*"結(jié)束錄入?!伯?dāng)錄入相同的姓名和電話時,系統(tǒng)會告 訴你已經(jīng)重復(fù)錄入刪除功能:在主菜單中輸入2,進(jìn)入刪除功能。用戶輸入待刪除人的姓名,系 統(tǒng)會自動顯 示待刪除人的信息,并且提示是否刪除該通訊人。〔當(dāng)輸 入的姓名不存在的時候,系統(tǒng)會告訴你此人不存在保存功能: 在主菜單中輸入3,進(jìn)入保存功能。將你已經(jīng)寫好的通訊錄保存在建 立時創(chuàng)建的文件里面?!伯?dāng)保存成功后,系統(tǒng)會告訴你保存成功讀取功能: 在主菜單中輸入4,進(jìn)入讀取功能。讀取一個任意一個已經(jīng)存在的文 件,用戶可以輸入想要讀取的文件,一旦文件讀取成功,系統(tǒng)會告 訴你文件讀取成功。查找功能:在主菜單中輸入5,進(jìn)入查找功能。查找方式有三種:1.按姓名查 找2.按類型查找3.查看所有人添加功能:在主菜單中輸入6,進(jìn)入添加功能。在還沒有讀取或者建立一個新 的通訊錄的時候,添加功能是無效的,系統(tǒng)會告訴你請你先新建立 一個通訊錄或者先讀取通訊錄文件。進(jìn)入添加功能以后,可以按提 示添加通訊人信息。修改功能:在主菜單中輸入7,進(jìn)入修改功能。在還沒有讀取或者建立一個新 的通訊錄的 時候,修改功能也是無效的,系統(tǒng)會告訴你請你先新建 立一個通訊錄或者先讀 取通訊錄文件。修改功能是和刪除功能一 樣,也是通過姓名進(jìn)行查找的。退出功能:在主菜單中輸入8,退出通訊錄管理系統(tǒng)。詳細(xì)設(shè)計通訊錄#defineIDstructtel //宏定義,方便以后的使用structtel {charname[10]; //姓名chartele[15]; //電話 charstyle[15]; //類型 charmail[20]; //郵箱ID*next;};voidmain<>{ ID*head=NULL;//這是這個程序的頭,什么功能都是靠這個來進(jìn)行鏈接的 intchoice;//存放用戶的選擇 intj=0; //這個j是用于功能之間的配合使用while<1> { system<"cls">; //清屏 printf<"\n\n">;printf<"\t#####SystemOfCommunication#####\n">;printf<"\t 1.建立通訊錄\n">;printf<"\t 2.刪除通訊人\n">;printf<"\t 3.保存通訊錄\n">;printf<"\t 4.讀取通訊錄文件\n">;printf<"\t 5.查找通訊人\n">;printf<"\t 6.添加通訊人\n">;printf<"\t 7.修改通訊人信息\n">;printf<"\t 8.退出通訊錄系統(tǒng)\n">; printf<"\t\t\t\t\tMadeby元達(dá)鵬\n">;printf<"\t######################\n">; printf<"\n\n">;scanf<"%d",&choice>; //輸入功能getchar<>; //吸收回車鍵switch<choice>{case1: head=Create<>; //創(chuàng)建 j=1; //讓功能7可以進(jìn)得去 break;case2: head=Delete<head>; //刪除 break;case3: Save<head>;//保存函數(shù) break;case4: head=Read<>; //讀取文件的函數(shù) j=2; //讓功能7可以進(jìn)得去 break;case5: Search<head>; //查找 break;case6: if<<j==1>||<j==2>> //當(dāng)你進(jìn)入過創(chuàng)建或者讀取之后才可以進(jìn)入添加 { head=Add<head>; //添加 } else { printf<"在你添加通訊人的時候請先創(chuàng)建通訊錄或者讀取通訊錄文件\n\n">; printf<"請按任意鍵返回主菜單\n">; getch<>; //按下任意鍵就進(jìn)入下一條語句的函數(shù) } break;case7: if<<j==1>||<j==2>> //當(dāng)你進(jìn)入過創(chuàng)建或者讀取之后才可以進(jìn)入添加 { head=Change<head>; //修改 } else { printf<"在你刪除通訊人的時候請先創(chuàng)建通訊錄或者讀取通訊錄文件\n\n">; printf<"請按任意鍵返回主菜單\n">; getch<>; //按下任意鍵就進(jìn)入下一條語句的函數(shù) } break;case8: exit<0>; //退出 break;default: printf<"你輸入錯了吧,請你重新輸入\n">;} }}工作流程圖①建立:建立一個通訊錄開始開始是否已創(chuàng)建N Y是否已創(chuàng)建輸入文件名輸入文件名是否重新創(chuàng)建Y N是否重新創(chuàng)建輸入通訊人信息輸入通訊人信息姓名是否為*號姓名是否為*號 N是否保存是否保存保存文件 Y保存文件N結(jié)束結(jié)束②刪除:刪除一個通訊人開始開始姓名是否存在姓名是否存在N Y輸入待刪除人的姓名輸入待刪除人的姓名是否刪除Y是否刪除是否保存是否保存N NY保存保存結(jié)束結(jié)束③保存:保存通訊錄于文件中開始開始結(jié)點是否為空結(jié)點是否為空Y N將單鏈表的結(jié)點輸入到文件中將單鏈表的結(jié)點輸入到文件中文件成功保存文件成功保存結(jié)束結(jié)束④讀?。鹤x取文件中的通訊錄開始開始輸入文件名輸入文件名文件是否存在Y N文件是否存在讀取文件內(nèi)容讀取文件內(nèi)容結(jié)束結(jié)束⑤查找:多種方式查找通訊人開始開始輸入要用什么方式查找:1,、姓名,2、類別,3.所有人輸入要用什么方式查找:1,、姓名,2、類別,3.所有人 3 1輸出所有人的所有信息輸出所有人的所有信息 2輸入類別輸入名字輸入類別輸入名字判斷類型是否存在判斷名字是否存在判斷類型是否存在判斷名字是否存在Y NY輸出該所有相同名字的所有信息輸出該所有相同類型的所有信息 N輸出該所有相同名字的所有信息輸出該所有相同類型的所有信息是否繼續(xù)查詢是否繼續(xù)查詢 Y結(jié)束結(jié)束⑥添加:添加通訊人開始開始判斷是不是已經(jīng)有相同的名字和電話判斷是不是已經(jīng)有相同的名字和電話輸入待添加人的所有信息輸入待添加人的所有信息結(jié)束結(jié)束⑦修改:通過名字修改通訊人信息開始開始輸入待修改人的名字輸入待修改人的名字通訊錄中是否存在該名字的人通訊錄中是否存在該名字的人N Y修改該人的信息修改該人的信息結(jié)束結(jié)束程序源代碼#include<stdio.h>#include<stdlib.h>//除了一些常用函數(shù)需要以外,如在網(wǎng)上查到的system清屏函數(shù),exit退出函數(shù)也需要這個H文件#include<string.h>//程序中的字符比較strump函數(shù)需要這個H文件#include<conio.h>//在網(wǎng)上查的getch函數(shù)需要這一個H文件#defineIDstructtel //宏定義,方便以后的使用structtel {charname[10]; //姓名chartele[15]; //電話 charstyle[15]; //類型 charmail[20]; //郵箱ID*next;};inttotal=0; //通訊錄人數(shù)的統(tǒng)計voidSave<ID*head>; //保存函數(shù)的聲明,因為你在調(diào)用Create函數(shù)時用到了/************************************************函數(shù)名:Create〔創(chuàng)建*功能:創(chuàng)建一個單鏈表,把數(shù)據(jù)放在鏈表里面,一旦需要保存,就調(diào)用save函數(shù)保存在文件中*返回值:ID*〔結(jié)構(gòu)體指針***********************************************/ID*Create<>{ total=0; intk=0; inti=0;ID*head,*p1,*p2,*p3; //創(chuàng)建一個頭指針和兩個可用于移動的指針charsaveflag; //這個字符用來接收是否保存的Yory的head=p1=p2=NULL; //首先把上述的指針賦值為空 while<1> //這個循環(huán)可以實現(xiàn)多次添加通訊人{(lán)p1=<ID*>malloc<sizeof<ID>>; //給p1分配一個動態(tài)存儲空間printf<"請輸入姓名,當(dāng)你不想錄入時,在姓名處輸入*,結(jié)束錄入\n">;scanf<"%s",p1->name>; //輸入姓名if<strcmp<p1->name,"*">==0> //這里是結(jié)束函數(shù)的一個通道〔沒有輸入聯(lián)系人,就是判斷輸入的是否為*號{if<total==0> //當(dāng)記錄人數(shù)為0時做以下事情{printf<"你輸入了0條記錄,單鏈表沒有創(chuàng)建...\n">;free<p1>; //釋放p1空間return<head>; //把head返回}else{break; //跳出while循環(huán)}}printf<"請輸入電話號碼:\n">;scanf<"%s",p1->tele>; printf<"請輸入類別:辦公類、個人類、商務(wù)類\n">; scanf<"%s",p1->style>; printf<"請輸入郵箱:\n">; scanf<"%s",p1->mail>; if<k>0> { p3=head; //讓p3從頭開始遍歷 while<p3!=NULL> //當(dāng)p3不為空時 { if<<strcmp<p1->name,p3->name>==0>&&<strcmp<p1->tele,p3->tele>==0>> { free<p1>; printf<"你重復(fù)輸入了,這一條不保存。請按任意鍵返回主菜單\n">; i=1; printf<"請按任意鍵返回主菜單\n">; getch<>; //按下任意鍵就進(jìn)入下一條語句的函數(shù) break; } if<<strcmp<p1->name,p3->name>>&&<strcmp<p1->tele,p3->tele>>&&<p3==p2>> //一旦到了最后一個結(jié)點,并且還沒有和他相同的信息的時候 { i=0; break; //跳出第一個循環(huán) } p3=p3->next; } if<i==1> { break; //跳出第二個循環(huán) } }if<head==NULL> //這是第一次進(jìn)來的時候,head為空{(diào)head=p1; //head和p2都為p1p2=p1;}else{ p2->next=p1; //這是第二次以后的執(zhí)行命令,目的就是p2向后移,而head的位置不變p2=p1;}total++; //這是錄入一個人后,總數(shù)就加1 k++;} p2->next=NULL; //把最后一個的指針域賦值為NULL,在以后的函數(shù)中,很多判斷都是靠這一點來實現(xiàn)的,所以很重要 if<i==0> { free<p1>; printf<"\n新建通訊錄成功,共有%d個聯(lián)系人,是否保存?<Y/N>\n",total>; getchar<>; //這個getchar是吸收回車鍵的,十分重要 scanf<"%c",&saveflag>; //寫入一個字符 if<saveflag=='y'||saveflag=='Y'> //判斷它是不是為Yory Save<head>; //進(jìn)入到保存函數(shù)里面,保存到文件里面 else printf<"\n沒有保存到成功保存到文件,請在返回主菜單后輸入3保存通訊錄。\n">; }returnhead; //返回一個頭指針,這個是最重要的,因為在后面的函數(shù)中,大部分都是要頭指針作為參數(shù)的 }/*************************************************函數(shù)名:Save〔保存*功能:將鏈表〔數(shù)據(jù)保存在文件*返回值:NULL*************************************************/voidSave<ID*head> { FILE*fp; //定義一個文件指針,接收fopen的返回值,用于最后的關(guān)閉文件 ID*t; //定義一個指針,從頭到尾遍歷一遍單鏈表,向文件中寫入if<<fp=fopen<"telephone.txt","w">>==NULL> //打開文件來寫入{printf<"打開文件失敗!\n">;getch<>;//輸入任意鍵進(jìn)入下一步exit<0>; //退出}t=head; //把頭指針賦給t,讓它從頭開始while<t!=NULL> //只要t指針不為空,即等于鏈表沒有結(jié)束{fwrite<t,sizeof<ID>,1,fp>; //把鏈表的東西寫入文件中t=t->next; //把指針往后移}fclose<fp>; //把文件關(guān)閉printf<"文件保存成功\n">; printf<"請按任意鍵返回主菜單\n">; getch<>; //按下任意鍵就進(jìn)入下一條語句的函數(shù)}/*************************************************函數(shù)名:Read〔讀取文件*功能:讀取文件中的信息并將其放入單鏈表中,并且最后返回一個頭指針*返回值:ID*〔結(jié)構(gòu)體指針*************************************************/ID*Read<>{FILE*fp; //定義一個文件指針,接收fopen的返回值,用于最后的關(guān)閉文件ID*t1,*t2,*head=NULL; //定義3個結(jié)構(gòu)體指針,一個頭指針用于返回,2個可移動的臨時指針charch; //定義一個變量來存放文件的第一個字符,但在這個函數(shù)里面主要是用來判斷文件是不是為空if<<fp=fopen<"telephone.txt","r">>==NULL>//這可以判斷有沒有文件給你去讀取{printf<"打開文件失??!沒有該文件\n\n">; printf<"請按任意鍵退出程序\n">;getch<>; //一個在網(wǎng)上查到的函數(shù),用于你可以按任意鍵進(jìn)入下一步exit<0>; //退出程序} /******這是在網(wǎng)上查到的一段有關(guān)于文件的程序******/ch=fgetc<fp>;//這是在網(wǎng)上查到的一個有關(guān)文件的函數(shù),返回值是文件的第一個字符,當(dāng)文件為空的時候,他返回的是一個特殊值:EOFif<ch==EOF> //當(dāng)文件為空的時候{printf<"文件為空,請重新建立一個通訊錄\n">; printf<"請按任意鍵返回主菜單\n">; getch<>; //按下任意鍵就進(jìn)入下一條語句的函數(shù)return<head>;//返回一個指針,因為這個函數(shù)要有一個返回值,所以把頭指針返回出去}else{ rewind<fp>; //這個函數(shù)是把一個文件的位置指針從新移至開頭,不然的話會出現(xiàn)一個組數(shù)據(jù)丟失} /*************************************************/t1=<ID*>malloc<sizeof<ID>>; //開始申請動態(tài)空間,用t1接著head=t1; //把t1賦給頭結(jié)點while<!feof<fp>> //feof函數(shù)的功能是判斷這個文件是不是結(jié)束了,如果結(jié)束了,返回一個非零值,否則返回一個0,來自百度{if<fread<t1,sizeof<ID>,1,fp>!=1> //根據(jù)書上的定義,fread函數(shù)的類型為int型,返回一個輸入數(shù)據(jù)項的個數(shù)break;//如果沒有讀取的內(nèi)容,則結(jié)束 total++; //人數(shù)加1t1->next=<ID*>malloc<sizeof<ID>>; //把在申請動態(tài)空間的同時,把t1的next指向下一個結(jié)點t2=t1; //讓t2和t1指向同一個地方t1=t1->next; //t1向后移一個結(jié)點}t2->next=NULL; //把t2的指針域賦值為空,因為數(shù)據(jù)最多到t2這里 free<t1>; //把后來的t1申請多出來的空間清空掉fclose<fp>; //關(guān)閉文件printf<"文件已經(jīng)成功讀取\n">; printf<"請按任意鍵返回主菜單\n">; getch<>; //按下任意鍵就進(jìn)入下一條語句的函數(shù)returnhead; //返回一個頭指針,因為在沒有創(chuàng)建一個單鏈表和文件的時候,就是靠這個頭指針進(jìn)行一系列的操作的}/*************************************************函數(shù)名:Search〔查詢*功能:可以通過姓名查詢,也可以通過類別查詢*返回值:NULL*************************************************/voidSearch<ID*head>{ intnum; //定義一個變量在確定是否進(jìn)入switch語句里 intcount=1; ID*p; //定義一個結(jié)構(gòu)體變量,用來放頭指針 intflag,searchflag=1; //變量flag是用來判斷是不是有符合要求的數(shù)據(jù),變量searchflag是一個while語句的出入口 charc,temp; //變量c是來存放姓名的首字符的,變量temp是用來存放Yory的 charch[10]; //數(shù)組ch用來放輸入的類型 printf<"請輸入你希望通過什么方式查詢:〔請輸入序號\n">; printf<"1.姓名\n">; printf<"2.類別\n">; printf<"3.所有人\n">; scanf<"%d",&num>; //選擇你想要查詢的方式 getchar<>; //吸收回車鍵 switch<num> //switch語句是看你要進(jìn)入哪個功能 { case1: while<searchflag> //searchflag已經(jīng)初始化為1,所以進(jìn)入while中,通過改變searchflag的值確定是不是離開while語句 { flag=0; //初始化為0 printf<"\n請輸入待查找者的首字母,或者查找者的姓:\n">; scanf<"%c",&c>; //存放你的要求,首字母或姓 getchar<>; //吸收回車鍵 p=head; //把形參頭指針head給p while<p!=NULL> //一直循環(huán)直到p結(jié)點為空 { if<p->name[0]==c> //當(dāng)姓名的第一個字符和你的要求c一樣的時候,進(jìn)入if語句 { printf<"%d.",count>; count++; printf<"姓名:%s\t電話號碼:%s\t類型:%s\t郵箱:%s\n",p->name,p->tele,p->style,p->mail>; flag=1; //flag賦值為1,表示為已經(jīng)查到了數(shù)據(jù)了 } p=p->next; //p1指針向后移 } if<flag==0> //這表示為沒有找到相關(guān)數(shù)據(jù) { printf<"\n對不起,未能找到符合條件的記錄\n">; } printf<"\n查找完畢,是否需要重新查詢?Y/N\n">; scanf<"%c",&temp>; //輸入是或者否〔Y/N getchar<>; //吸收回車鍵 if<temp=='y'||temp=='Y'> //判斷是不是yorY { searchflag=1; //回到while繼續(xù)從頭開始 } else { searchflag=0; //回到while并且退出 system<"cls">; //為了美觀,在網(wǎng)上找了清屏函數(shù) } } break; case2: while<searchflag> //searchflag已經(jīng)初始化為1,所以進(jìn)入while中,通過改變searchflag的值確定是不是離開while語句 { flag=0; //初始化為0, printf<"\n請輸入被查找人的類別:〔如:"辦公類""個人類""商務(wù)類"\n">; scanf<"%s",ch>; //用字符數(shù)據(jù)接收字符串 getchar<>; //吸收回車鍵 p=head; //把形參頭指針head給p while<p!=NULL> //searchflag已經(jīng)初始化為1,所以進(jìn)入while中,通過改變searchflag的值確定是不是離開while語句 { if<strcmp<p->style,ch>==0> //當(dāng)你的類別和你輸入的類別一樣的時候,stcump會返回0 { printf<"%d.",count>; count++; printf<"姓名:%s\t電話號碼:%s\t類型:%s\t郵箱:%s\n",p->name,p->tele,p->style,p->mail>; flag=1; //flag賦值為1,表示為已經(jīng)查到了數(shù)據(jù)了 } p=p->next;//p1指針向后移 } if<flag==0> //這表示為沒有找到相關(guān)數(shù)據(jù) { printf<"\n對不起,未能找到符合條件的記錄\n">; } printf<"\n查找完畢,是否需要重新查詢?Y/N\n">; scanf<"%c",&temp>; //輸入是或者否〔Y/N getchar<>; if<temp=='y'||temp=='Y'> //判斷是不是yorY { searchflag=1; //回到while繼續(xù)從頭開始 } else { searchflag=0; //回到while并且退出 system<"cls">; //為了美觀,在網(wǎng)上找了清屏函數(shù) } } break; case3: p=head; //把頭指針給p while<p!=NULL> //p不為空的時候,while一直循環(huán) { printf<"%d.",count>; count++; printf<"姓名:%s\t電話號碼:%s\t類型:%s\t郵箱:%s\n",p->name,p->tele,p->style,p->mail>; p=p->next; //p向后移 } printf<"查找完成!請按任意鍵返回主菜單\n">; getch<>; //輸入任意鍵函數(shù) system<"cls">; //為了美觀,在網(wǎng)上找了清屏函數(shù) break; default: printf<"你輸入錯了吧,請你輸入任意鍵返回主菜單...\n">; getch<>; //一個在網(wǎng)上查到的函數(shù),用于你可以按任意鍵進(jìn)入下一步 }}/*************************************************函數(shù)名:Delete〔刪除*功能:通過查找姓名來實現(xiàn)刪除通訊記錄*返回值:ID*〔結(jié)構(gòu)體指針*************************************************/ID*Delete<ID*head>{ID*p1,*p2,*p3; //定義三個結(jié)構(gòu)體變量,p3是用來遍歷整一個單鏈表的,p1,p2是用來找那個一樣的結(jié)點在哪里的charsaveflag; //存放是或者否 chartemp; //同上 inti; //i是這個函數(shù)的關(guān)鍵,因為我嘗試了很多種方法,都是有這樣那樣的問題,雖然這個方法沒有效率,但是可行p1=p2=p3=head; //把head賦給p1,p2,p3chars[10]; //存放輸入的名字system<"cls">; //清屏printf<"請輸入要刪除的姓名:\n">;scanf<"%s",s>; getchar<>; while<p3!=NULL> //這個while語句的作用是在遍歷整個單鏈表時,當(dāng)遇到一樣的名字時把i賦值,引導(dǎo)下面的工作 { if<strcmp<p3->name,s>==0> //判斷是不是你輸入的名字是不是和通訊錄中的相等 { i=1; //當(dāng)存在一樣的名字時,i=1 break; } if<strcmp<p3->name,s>&&<p3->next>==NULL> { i=0; //不存在一樣的名字時,i=1 break; } p3=p3->next;//p3指針向后移 } if<i==1> //當(dāng)i=1時,開始找那個一樣名字的結(jié)點在哪里 { while<strcmp<p1->name,s>&&p1!=NULL> //當(dāng)遇到一樣名字的時候循環(huán)結(jié)束,那么這時的p1就是那個名字一樣的結(jié)點 { p2=p1; //p2永遠(yuǎn)在p1的前一個結(jié)點 p1=p1->next; //p1指針向后移 } }if<i==0> //當(dāng)i=0時,就是沒有這個名字的人,返回主菜單 {printf<"對不起,沒有找到要刪除的通訊名單,請檢查你要刪除的姓名是否正確\n">; printf<"請按任意鍵返回主菜單\n">; getch<>; //按下任意鍵就進(jìn)入下一條語句的函數(shù)} if<<i==1>&&<p1!=NULL>> //當(dāng)在遍歷完整個鏈表以后,存在一樣的名字〔即i==1,并且p1不為空,說明沒有走出這個鏈表{printf<"你要刪除的通訊錄人為:\n">;printf<"姓名:%s\t電話號碼:%s\t類型:%s\t郵箱:%s\n",p1->name,p1->tele,p1->style,p1->mail>;printf<"請確定是否要刪除該記錄?Y/N?\n">;scanf<"%c",&saveflag>; //輸入,存放YorN getchar<>; //吸收回車鍵if<saveflag=='y'||saveflag=='Y'> //當(dāng)輸入是的時候{if<p1==head> //判斷是不是在數(shù)據(jù)第一個head=p1->next; //把第一個結(jié)點去掉elsep2->next=p1->next; //p2的next域指向下下個結(jié)點的next域free<p1>; //把p1結(jié)點的空間釋放printf<"該電話記錄已刪除成功,是否存盤?Y/N?\n">;scanf<"%c",&temp>; //輸入,存放YorN getchar<>; //吸收回車鍵if<temp=='y'||temp=='Y'> //當(dāng)輸入是的時候 {Save<head>; //調(diào)用保存函數(shù) total--; //人數(shù)減一 }else {printf<"請在退出系統(tǒng)之前返回主菜單按3進(jìn)行保存\n">; printf<"請按任意鍵返回主菜單\n">; getch<>; //按下任意鍵就進(jìn)入下一條語句的函數(shù) }}else {printf<"該通訊錄沒有被刪除\n">; printf<"請按任意鍵返回主菜單\n">; getch<>; //按下任意鍵就進(jìn)入下一條語句的函數(shù) }} return<head>; //return一個已經(jīng)進(jìn)行修改的鏈表的頭指針}/*************************************************函數(shù)名:Add〔添加*功能:添加人物信息*返回值:ID*〔結(jié)構(gòu)體指針*************************************************/ID*Add<ID*head>{charsaveflag; //存放是或者否 intk=0; inti=0;ID*p1,*p2,*p3,*add; //add是用來放添加的信息的,p1,p2是用來臨時移動的p1=p2=head; //先讓它們都等于頭指針add=<ID*>malloc<sizeof<ID>>; //申請動態(tài)存儲空間system<"cls">; //清屏while<p1!=NULL> //這個是把p2移到最后一個結(jié)點上去,因為我是從后面插入的,到了后面p1就是為NULL了{(lán)p2=p1;p1=p1->next;}printf<"請輸入添加人的姓名:\n">;scanf<"%s",add->name>;printf<"請輸入添加人的電話號碼:\n">;scanf<"%s",add->tele>; printf<"請輸入添加人的類型:\n">; scanf<"%s",add->style>; printf<"請輸入添加人的郵箱:\n">; scanf<"%s",add->mail>; p3=head; //讓p3從頭開始遍歷 while<p3!=NULL> //當(dāng)p3不為空時 { if<<strcmp<add->name,p3->name>==0>&&<strcmp<add->tele,p3->tele>==0>> { free<add>; printf<"你重復(fù)輸入了,這一條不保存。請按任意鍵返回主菜單\n">; i=1; printf<"請按任意鍵返回主菜單\n">; getch<>; //按下任意鍵就進(jìn)入下一條語句的函數(shù) break; } if<<strcmp<add->name,p3->name>>&&<strcmp<add->tele,p3->tele>>&&<p3==p2>> //一旦到了最后一個結(jié)點,并且還沒有和他相同的信息的時候 { i=0; break; //跳出第一個循環(huán) } p3=p3->next; } if<i==0> { add->next=NULL; //指針域賦值為空,方面以后的判斷 if<p1==head> //當(dāng)頭結(jié)點沒有信息的時候 { head=add; //直接給head } else { p2->next=add; //最后一個p2結(jié)點的next插入add } total++; k++; free<p1>; printf<"新添加電話號碼成功,是否存盤?<Y/N>\n">; getchar<>; //吸收回車鍵 scanf<"%c",&saveflag>; //輸入,存放YorN if<saveflag=='y'||saveflag=='Y'> //當(dāng)輸入是的時候 { Save<head>; //調(diào)用保存函數(shù) total++; } else { printf<"請在退出系統(tǒng)之前返回主菜單按3進(jìn)行保存\n">; printf<"請按任意鍵返回主菜單\n">; getch<>; //按下任意鍵就進(jìn)入下一條語句的函數(shù) } }return<head>; //return一個已經(jīng)進(jìn)行修改的鏈表的頭指針}/*************************************************函數(shù)名:Change〔修改*功能:修改人物信息*返回值:ID*〔結(jié)構(gòu)體指針*************************************************/ID*Change<ID*head>{ID*p1,*p2,*p3; //定義p1和p2用來在單鏈表中移動charsaveflag; //存放YorNp1=p2=p3=head; //先讓它們都等于頭指針charn[10]; //存放待修改人的姓名 inti; //作用和刪除的一樣領(lǐng)導(dǎo)這個函數(shù)system<"cls">; //清屏printf<"請輸入要修改的姓名:\n">; scanf<"%s",n>; while<p3!=NULL> //這個while語句的作用是在遍歷整個單鏈表時,當(dāng)遇到一樣的名字時把i賦值,引導(dǎo)下面的工作 { if<strcmp<p3->name,n>==0> //判斷是不是你輸入的名字是不是和通訊錄中的相等 { i=1; //當(dāng)存在一樣的名字時,i=1 break; } else { i=0; //不存在一樣的名字時,i=1 break; } p3=p3->next;//p3指針向后移 } if<i==1> //當(dāng)i=1時,開始找那個一樣名字的結(jié)點在哪里 { while<strcmp<p1->name,n>&&p1!=NULL> //當(dāng)遇到一樣名字的時候循環(huán)結(jié)束,那么這時的p1就是那個名字一樣的結(jié)點 { p2=p1; //p2永遠(yuǎn)在p1的前一個結(jié)點 p1=p1->next; //p1指針向后移 } }if<i==0> //當(dāng)i=0時,就是沒有這個名字的人,返回主菜單 {printf<"對不起,沒有找到要刪除的通訊名單,請檢查你要刪除的姓名是否正確\n">; printf<"請按任意鍵返回主菜單\n">; getch<>; //按下任意鍵就進(jìn)入下一條語句的函數(shù)} if<<i==1>&&<p1!=NULL>> //當(dāng)在遍歷完整個鏈表以后,存在一樣的名字〔即i==1,并且p1不為空,說明沒有走出這個鏈表{printf<"你要修改的電話記錄為:\n">;printf<"姓名%s\t電話號碼%s\t類型:%s\t郵箱:%s\n",p1->name,p1->tele,p1->style,p1->mail>;printf<"請輸入修改后的號碼:\n">;scanf<"%s",p1->tele>; printf<"請輸入修改后的類型:\n">;scanf<"%s",p1->style>; printf<"請輸入修改后的郵箱:\n">;scanf<"%s",p1->mail>;printf<"該電話記錄已修改成功\n">;printf<"通訊人已經(jīng)新建成功,是否進(jìn)行保存?<Y/N>\n">;getchar<>; //吸收回車scanf<"%c",&saveflag>;if<saveflag=='y'||saveflag=='Y'> //當(dāng)輸入是的時候Save<head>; //調(diào)用保存函數(shù)elseprintf<"請在退出系統(tǒng)之前返回主菜單按3進(jìn)行保存\n">; printf<"請按任意鍵返回主菜單\n">; getch<>; //按下任意鍵就進(jìn)入下一條語句的函數(shù)} return<head>;//return一個已經(jīng)進(jìn)行修改的鏈表的頭指針}/*************************************************函數(shù)名:main<主函數(shù)>*功能:無*返回值:NULL*************************************************/voidmain<>{ ID*head=NULL;//這是這個程序的頭,什么功能都是靠這個來進(jìn)行鏈接的 intchoice;//存放用戶的選擇 intj=0; //這個j是用于功能之間的配合使用while<1> { system<"cls">; //清屏 printf<"\n\n">;printf<"\t

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論