這篇文章將為大家詳細講解有關用C語言怎么實現個人通訊錄管理系統,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
主框架:

1、函數聲明
關于這里的函數聲明,主要是為了可以清楚的了解整個系統的功能,這里不做過多介紹。還有結構體鏈表的創建,貫穿了各個功能代碼部分,必不可少。
2、聯系人的添加
這部分主要涉及聯系人的姓名、地址、電話、QQ號和郵箱(當然需要其他功能可自行添加),考慮到數組操作不便前提下,使用鏈表的尾插法,通過不斷開創新的結點,然后不斷將新的結點的地址指向尾結點,使尾結點不斷后移,而新創的結點時按照添加的先后順序進行連接(參考下圖可快速理解,此圖片來源于網絡),當然其中某些項的條件限制也是必不可少的。比如:電話、QQ號、郵箱

int Addpeo() //添加聯系人
{
int t,n,a;
char flag='y'; //僅作為第一次執行條件
ptcs p=head,q;
while(flag!='n'&&flag!='N') //判斷是否繼續添加
{
q=(ptcs)malloc(sizeof(pcs)); //申請內存
p->next=q; //賦予下一個節點
p=q;
q->next=NULL; //尾結點地址賦空值 ,尾插法
printf("\n\t請輸入:\n");
printf("\t\t姓名:");
scanf("\t\t%s",q->chat.name);
printf("\t\t地址:");
scanf("\t\t%s",q->chat.add);
printf("\t\t手機號:");
scanf("\t\t%s",q->chat.tel);
do
{
n=0; //僅做記錄
if(strlen(q->chat.tel)!=11) //計算手機號的長度 ,判斷是否輸入規范
{
n=1;
printf("\t\t您輸入的手機號格式不存在,請重新輸入:");
scanf("\t\t%s",q->chat.tel);
}
else
{
for(t=0;t<11;t++)
{
if(q->chat.tel[t]<'0'||q->chat.tel[t]>'9')
{
n=1;
printf("\t\t您輸入的手機號格式不合理,請重新輸入:");
scanf("\t\t%s",q->chat.tel);
break;
}
}
}
}while(n);
//輸入QQ號
printf("\t\tQQ號:");
scanf("\t\t%s",q->chat.tecent);
do
{
n=0;
if(strlen(q->chat.tecent)>10) //以10位QQ號為準,判斷是否符合規范
{
n=1;
printf("\t\t您輸入的QQ號格式不存在,請重新輸入:");
scanf("\t\t%s",q->chat.tecent);
}
else
{
for(t=0;t<10;t++)
{
if(q->chat.tecent[t]<'0'||q->chat.tecent[t]>'9')
{
n=1;
printf("\t\t您輸入的QQ號格式不合理,請重新輸入:");
scanf("\t\t%s",q->chat.tecent);
break;
}
}
}
}while(n);
//輸入郵箱
printf("\t\tEmail:");
scanf("\t\t%s",q->chat.email);
do
{
//判斷郵箱 @符號輸入規范(這里不限定郵箱號碼位數)
a=0;
for(t=0;q->chat.email[t]!='\0';t++)
{
if(q->chat.email[t]=='@')
a++; //@數為1
}
if(a!=1)
{
printf("\t\t輸入的郵箱格式不合理,請重新輸入:");
scanf("\t\t%s",q->chat.email);
}
}while(a!=1); //是否輸入@ ,為1則終止循環
printf("\n\t是否繼續添加?(Y/N)");
scanf("\t%c",&flag);
}
return 0;
}3、聯系人的查詢
這步使用的是遍歷查詢,共設置了三種方式,在定義鏈表指針的前提下,通過遍歷鏈表進行信息的對比,從而判斷聯系人是否存在,如果存在就直接顯示給用戶,不存在就直接退回功能選項。
int Query()
{
int m,n; //m記錄選項
char flag='y';
ptcs p=head->next;
while(flag!='n'&&flag!='N') //是否繼續查詢
{
printf("\n");
printf("\t*************查詢方式**************\n");
printf("\t-----------------------------------\n");
printf("\t 1.按姓名查找 \n");
printf("\t 2.手機號查找 \n");
printf("\t 3.按QQ號碼查找 \n");
printf("\t 4.返回 \n");
printf("\t-----------------------------------\n");
printf("\n\t請選擇查詢方式:");
scanf("\t%d",&m);
do
{
n=0;
if(m!=1&&m!=2&&m!=3&&m!=4)
{
n=1;
printf("\t您輸入的查詢方式不存在,請重新輸入:");
scanf("\t%d",&m);
}
}while(n); //是否輸入正確
if(!p) //判斷鏈表是否為空
{
printf("\t該通訊錄為空!\n");
return 0;
}
if(m==1)
{
char nm[15]; //要查詢的聯系人
printf("\t請輸入您要查詢的聯系人姓名:");
scanf("\t%s",nm);
//若鏈表不為空,且聯系人不相符,則繼續往后遍歷
while(p!=NULL&&strcmp(p->chat.name,nm)!=0)
p=p->next; //遍歷鏈表
if(!p)
{
printf("\t您要查詢的聯系人不存在!\n");
return 0;
}
printf("\t地址:%s\n",p->chat.add);
printf("\t手機號:%s\n",p->chat.tel);
printf("\tQQ號:%s\n",p->chat.tecent);
printf("\tEmail:%s\n",p->chat.email);
}
if(m==2)
{
char te[20]; //要查詢的手機號碼
printf("\t請輸入您要查詢的手機號:");
scanf("\t%s",te);
while(p!=NULL&&strcmp(p->chat.tel,te)!=0)
p=p->next;
if(!p)
{
printf("\t您要查詢的聯系人不存在!\n");
return 0;
}
printf("\t姓名:%s\n",p->chat.name);
printf("\t地址:%s\n",p->chat.add);
printf("\tQQ號:%s\n",p->chat.tecent);
printf("\tEmail:%s\n",p->chat.email);
}
if(m==3)
{
char qq[15]; //要查詢的qq號
printf("\t請輸入您要查詢的QQ號:");
scanf("\t%s",qq);
while(p!=NULL&&strcmp(p->chat.tecent,qq)!=0)
p=p->next;
if(!p)
{
printf("\t您要查詢的聯系人不存在!\n");
return 0;
}
printf("\t姓名:%s\n",p->chat.name);
printf("\t地址:%s\n",p->chat.add);
printf("\t手機號:%s\n",p->chat.tecent);
printf("\tEmail:%s\n",p->chat.email);
}
if(m==4)
return 0;
printf("\t是否繼續查詢?(Y/N)"); //Y則繼續執行while循環,否則退出
scanf("\t%c",&flag);
}
return 0;
}4、聯系人的刪除
這部分提供按姓名刪除,通過遍歷鏈表查詢到指定節點,使用指針使該節點的上一個節點直接指向下一個節點,以此來實現對聯系人的刪除操作。詳解圖奉上

int Delete()
{
char nm[20]; //要刪除的聯系人姓名
char flag='y';
ptcs p=head->next,bh,pre; //bh,pre均為過度節點指針
if(!p) //判斷鏈表是否為空
{
printf("\t該通訊錄為空!\n");
return 0;
}
while(flag!='n'&&flag!='N')
{
p=head->next;
printf("\t請輸入您要刪除的聯系人姓名:");
scanf("\t%s",nm);
while(p!=NULL&&strcmp(p->chat.name,nm)!=0) //比較輸入的聯系人是否正確
{
pre=p;
p=p->next; //往后遍歷鏈表,直至找到聯系人,并賦給p
}
if(!p)
{
printf("\t該聯系人不存在!\n");
return 0;
}
bh=p->next; //將next值賦給bh,指向要刪除的聯系人的下一個地址
if(p==head->next)
head->next=bh;
else
pre->next=bh; //使當前聯系人的上一個地址,直接指向聯系人的下一個地址
printf("\t該聯系人已刪除!\n");
printf("\t是否繼續刪除?(Y/N)");
scanf("\t%c",&flag);
}
return 0;
}5、聯系人信息的修改
關于聯系人的修改,它其實是對鏈表的某一節點進行修改,通過遍歷鏈表查詢到指定節點并直接進行修改,修改過程中依舊沿用部分格式限定條件,若輸入某項不符合要求,則一直重復輸入,直到該項輸入符合要求為止。話不多說,上代碼
//修改姓名
int changename(ptcs p)
{
scanf("\t%s",p->chat.name);
printf("\t修改成功!\n");
return 0;
}
//修改地址
int changeadd(ptcs p)
{
scanf("\t%s",p->chat.add);
printf("\t修改成功!\n");
return 0;
}
//修改手機號內容
int changetel(ptcs p)
{
int n,t;
scanf("\t%s",p->chat.tel);
do
{
n=0;
if(strlen(p->chat.tel)!=11)
{
n=1;
printf("\t您輸入的手機號格式不存在,請重新輸入:");
scanf("\t%s",p->chat.tel);
}
else
{
for(t=0;t<11;t++)
{
if(p->chat.tel[t]<'0'||p->chat.tel[t]>'9')
{
n=1;
printf("\t您輸入的手機號格式不合理,請重新輸入:");
scanf("\t%s",p->chat.tel);
break;
}
}
}
}
while(n);
printf("\t修改成功!\n");
return 0;
}
//修改QQ號碼
int changeQQ(ptcs p)
{
int n,t;
scanf("%s",p->chat.tecent);
do
{
n=0;
if(strlen(p->chat.tecent)!=10)
{
n=1;
printf("\t您輸入的QQ號格式不存在,請重新輸入:");
scanf("\t%s",p->chat.tecent);
}
else
{
for(t=0;t<10;t++)
{
if(p->chat.tecent[t]<'0'||p->chat.tecent[t]>'9')
{
n=1;
printf("\t您輸入的QQ號格式不合理,請重新輸入:");
scanf("\t%s",p->chat.tecent);
break;
}
}
}
}
while(n);
printf("\t修改成功!\n");
return 0;
}
//修改電子郵箱
int changeEmail(ptcs p)
{
int t,a;
scanf("\t%s",p->chat.email);
do
{
a=0;
for(t=0;p->chat.email[t]!='\0';t++)
{
if(p->chat.email[t]=='@')
a++;
}
if(a!=1)
{
printf("\t輸入的郵箱格式不合理,請重新輸入:");
scanf("\t%s",p->chat.email);
}
}
while(a);
printf("\t修改成功!\n");
return 0;
}6、聯系人的輸出
關于輸出就是按照輸入的順序依次將聯系人輸出
//輸出通訊錄列表
int Display()
{
ptcs p=head->next;
if(!p) //判斷鏈表是否為空
{
printf("\t該通訊錄為空!\n");
return 0;
}
printf("\n\t**********************************通訊錄列表*************************************\n\n");
printf("\t姓名\t地址\t\t\t手機號\t\tQQ號\t\tEmail\n");
printf("\t---------------------------------------------------------------------------------\n");
while(p)
{
printf("\t%-8s%-24s%-16s%-16s%-20s\n",p->chat.name,p->chat.add,p->chat.tel,p->chat.tecent,p->chat.email);
p=p->next; //繼續往后遍歷輸出
printf("\t---------------------------------------------------------------------------------\n");
}
return 0;
}7、文件的寫入與讀出
通過新建一個文件并且指定文件的權限,將數據寫入到指定文件中,以此實現對文件的整體寫入操作。它的讀出操作是通過訪問已建立的文件,使用fgets函數獲取文件中的信息并保存在指定的字符數組中,之后逐個進行輸出。
//將數據寫入文件
int fwrite()
{
ptcs p=head->next;
FILE* fp;
char filename[30];
if(!p)
{
printf("\t該通訊錄為空!");
return 0;
}
printf("\t請輸入所寫入的文件名:");
scanf("\t%s",filename);
if((fp=fopen(filename,"a+"))==NULL)
{
printf("\t無法打開文件!\n");
system("pause"); //暫停
return 0;
}
fprintf(fp,"**********************************通訊錄列表*************************************\n\n");
fprintf(fp,"姓名\t地址\t\t\t手機號\t\tQQ號\t\tEmail\n");
fprintf(fp,"---------------------------------------------------------------------------------\n");
while(p)
{
fprintf(fp,"%-8s%-24s%-16s%-16s%-20s\n",p->chat.name,p->chat.add,p->chat.tel,p->chat.tecent,p->chat.email);
p=p->next;
fprintf(fp,"---------------------------------------------------------------------------------\n");
}
fprintf(fp,"\n**********************************共%d個聯系人************************************\n",cacu(head->next));
fclose(fp); //關閉文件
printf("\t寫入成功!\n");
return 0;
}
//讀取文件
int fread()
{
char str[100];
char filename[30];
FILE* fp; //定義文件指針
printf("\t請輸入要讀出的文件名:");
scanf("\t%s",filename);
if((fp=fopen(filename,"a+"))==NULL)
{
printf("\t無法打開文件!\n");
system("pause");
return 0;
}
while((fgets(str,100,fp))!=NULL) //fgets獲取文件中的信息 ,存入str中
{
printf("\t%s",str); //輸出文件中的信息
}
return 0;
}8、模擬通話
通過調用time函數來獲取隨機數(從1970.1.1算起),根據當前系統時間,利用相關函數產生一個隨機數的種子,再利用對應函數產生一個隨機數,隨后判斷是否與通訊錄中聯系人的項數相符,若相符,則直接將該聯系人的信息寫入指定文件中,若不相符,則在該文件中寫入未知聯系人。
//呼叫或被呼叫
int call()
{
int n;
ptcs p=head->next;
//用時間做種,每次產生隨機數不一樣,隨著系統時間的改變而改變
srand((unsigned) time(NULL));
n=rand()%(cacu(p)+5)+1; //產生一個從1到聯系人總數+5之間的一個隨機數
return n;
}
int save(int n,char *filename)//保存通話記錄
{
FILE* fp;
ptcs p=head->next;
int i=1;
if((fp=fopen(filename,"a+"))==NULL)
{
printf("\t通話記錄將失去!\n");
system("pause");
return 0;
}
if(n<=cacu(p))
{
while(i<n)
{
p=p->next;
i++;
}
//輸出對應聯系人信息
fprintf(fp,"%-16s%-16s%-16s%-20s\n",p->chat.name,p->chat.tel,p->chat.tecent,p->chat.email);
fprintf(fp,"----------------------------------------------------------------------\n");
}
else
fprintf(fp,"未知號碼\n");
fclose(fp); //關閉文件
return 0;
}附上系統功能運行圖:

說明:為什么選擇使用鏈表結構呢?主要是因為在添加聯系人之前并不會指定添加的個數,因此它是一個動態添加的過程,鏈表大小可變,擴展性強,并且針對于聯系人的刪除操作,使用鏈表不需要改變內存地址,只需要修改節點指針的指向以及節點的值即可,而數組大小固定,不適合于動態的存儲,并且在對數組元素進行操作的過程中,這個元素以后的所有元素的內存地址都要移動,操作起來比較麻煩。
關于用C語言怎么實現個人通訊錄管理系統就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。