用c語言實現簡易通訊錄(連結串列)
阿新 • • 發佈:2018-12-02
首先,這是本人第一次寫部落格。不當之處,望請見諒!(腦補一個doge)
最近在學習C語言,並實現了 下面連結中 簡易通訊錄的功能。區別是:我是用連結串列實現了其所有功能。並增加了檔案儲存模組!
本人初來乍到,c功底不是很紮實,且是第一次用c寫小專案,雖然實現了所有功能,但程式碼中定會有很多需優化的地方。所以,各位希望不吝賜教!萬分感謝!
下面開始啦:
標頭檔案:
# ifndef __TONGXUNLU_H # define __TONGXUNLU_H #include <stdio.h> #include <malloc.h> #include <string.h> #define LEN sizeof(address_list) //開闢空間 int n=0;//記錄通訊錄人員人數 typedef struct A { char name[100];//名字 char sex[5];//性別 char age[10];//年紀 char phone[15];//電話 char addr[100];//地址 struct A *next; }address_list; void show_feature(void);//選單函式 address_list * add(address_list *);//新增聯絡人 address_list * delete1(address_list *);//刪除特定聯絡人 void show_list(address_list *);//顯示所有聯絡人 void find_list(address_list *);//尋找特定聯絡人 address_list * sort(address_list *);//排序聯絡人 address_list * clear_list(address_list *);//清楚所有聯絡人 address_list * revision_list(address_list *);//修改特定聯絡人特定資訊 void save_list(address_list *);//儲存所有聯絡人資訊 void exit_list();//退出通訊錄系統 # endif // __TONGXUNLU_H
主功能原始碼:
#include "tongxunlu.h" int main() { int func; address_list *p1; p1 = (address_list *)malloc(LEN); //printf("%d",p1->next); do { show_feature();//選單函式 printf("請選擇您要進行的操作:"); scanf("%d" ,&func); fflush(stdin); switch(func) { case 1: p1=add(p1); break;//新增 case 2: p1=delete1(p1); break;//刪除 case 3: find_list(p1); break;//查詢 case 4: revision_list(p1); break;//修改 case 5: show_list(p1); break;//顯示 case 6: p1=clear_list(p1); break;//清除 case 7: p1=sort(p1); break;//排序 case 8: save_list(p1); break;//儲存 case 0: exit_list(); break;//退出 default: printf("選擇錯誤,請重新輸入!\n"); break; } }while(func); return 0 ; } //修改特定聯絡人特定資訊 address_list * revision_list(address_list *head) { char j[100],q[100],p[100]; address_list *A1; A1 = (address_list *)malloc(LEN); printf("請輸入你想要修改的人的姓名:"); scanf("%s",j); A1 = head; for (int i=1; i <= n; i++) { if(!(strcmp(j,A1->name))) { printf("成功找到 %s 的具體資訊:\n", A1->name); printf("名字:%4s,性別:%4s,年齡:%4s,電話:%4s,地址:%4s\n" ,A1->name,A1->sex,A1->age,A1->phone,A1->addr); printf("你想要修改%s的什麼資訊(name, sex, age, phone, addr):",j); scanf("%s",q); if((strcmp(q,"name"))&(strcmp(q,"sex"))&(strcmp(q,"age"))&(strcmp(q,"phone"))&(strcmp(q,"addr"))) {printf("請輸入正確的想要修改的資訊!\n");break;} printf("你想要把 %s 的 %s 修改成:",j,q); scanf("%s",p); if(!(strcmp(q,"name")))strcpy(A1->name, p); if(!(strcmp(q,"sex")))strcpy(A1->sex, p); if(!(strcmp(q,"age")))strcpy(A1->age, p); if(!(strcmp(q,"phone")))strcpy(A1->phone, p); if(!(strcmp(q,"addr")))strcpy(A1->addr, p); //A1->name = "x";這樣賦值是不行滴!! printf("成功把 %s 的 %s 修改為 %s!!!\n", j,q,p);break; } else { if(A1->next == NULL) printf("沒有找到%s的資訊!\n",j); A1 = A1->next; } } return head; } //清除聯絡人資訊 address_list * clear_list(address_list *head) { head = NULL; n = 0; printf("已清除全部通訊錄資訊!!\n"); return head; } //尋找特定聯絡人資訊 void find_list(address_list *head) { char j[100]; address_list *A1; A1 = (address_list *)malloc(LEN); printf("請輸入你要查詢人的姓名:"); scanf("%s",j); A1 = head; for (int i=1; i <= n; i++) { if(!(strcmp(j,A1->name))) { printf("%s 的具體資訊是:\n", A1->name); printf("名字:%4s,性別:%4s,年齡:%4s,電話:%4s,地址:%4s\n" ,A1->name, A1->sex,A1->age,A1->phone,A1->addr); break; } else { if(A1->next == NULL) printf("沒有找到%s的資訊\n",j); A1 = A1->next; } } //free(A1); } //刪除某通訊錄成員資訊 address_list * delete1(address_list *head1) { char j[100]; int i; address_list *p1,*p2,*p3,*p4; p1=p2=p3=p4=(address_list *)malloc(LEN); if (n == 0) { printf("There is no any data!"); goto END; } else { p1=p2=head1; p4=head1->next;//p4的作用:當刪除的是連結串列第一個資料時候。 printf("Please enter the name that you want to delete:"); scanf("%s",j); //遍歷連結串列,尋找要刪除的資料 if(!(strcmp(j,head1->name)))//刪除資料是否為第一個連結串列 { if(n==1) { head1 = NULL; printf("刪除成功!\n"); printf("現在通訊表沒有任何資訊,請新增或退出!\n"); } else { head1=p4; printf("刪除成功!"); } } //遍歷連結串列尋找要刪除的資訊(若p3在第一鏈,則p2在第二鏈,p1在第三鏈) for (i=1;i<=n;i++) { p1=p1->next; if(!(strcmp(j,p2->name))) { p3->next=p2->next; printf("刪除成功!"); n--; goto END; } else { p3=p2; p2=p1; } } } printf("遍歷通訊錄,並未發現想要刪除的資訊!"); END:return head1; } //按首字母從小到大排序聯絡人資訊 address_list * sort(address_list *head) { if(n == 0) { printf("沒有資料,請新增!\n"); return head; } else//能進入下面程式的,n>=2 { char j[100]; address_list *A1, *A2, *A3; A1 = A2 = A3 =(address_list *)malloc(sizeof(address_list));//這裡不開闢空間總會導致程式崩潰! printf("請選擇要排序的方式"); printf("(name, sex, age, phone, addr):"); scanf("%s" ,j); if((strcmp(j,"name"))&(strcmp(j,"sex"))&(strcmp(j,"age"))&(strcmp(j,"phone"))&(strcmp(j,"addr"))) {printf("輸入有誤!請輸入正確的想要修改的資訊!\n");goto END;} //A1 = A2 = A3 = head; if(head->next == NULL)//檢測是否只有一組資料 { printf("成功完成排序!\n"); //show_list(head); return head; } else { for (int ii=1; ii<=n-1; ii++) { A1 = head->next; A2 = head; for (int jj=1; jj<=n-ii; jj++) { if(jj == 2) {A3 = head;} if(jj > 2) {A3 = A3->next;} if(!(strcmp(j,"name"))) {if(strcmp(A2->name,A1->name)>0) goto Loop; else goto Loop1;} if(!(strcmp(j,"sex"))) {if(strcmp(A2->sex,A1->sex)>0) goto Loop; else goto Loop1;} if(!(strcmp(j,"age"))) {if(strcmp(A2->age,A1->age)>0) goto Loop; else goto Loop1;} if(!(strcmp(j,"phone"))) {if(strcmp(A2->phone,A1->phone)>0) goto Loop; else goto Loop1;} if(!(strcmp(j,"addr"))) {if(strcmp(A2->addr,A1->addr)>0) goto Loop; else goto Loop1;} Loop:{ if(jj == 1) {head = head->next;} if(jj >= 2) {A3->next = A1;} A2->next = A1->next; A1->next = A2; A1 = A1->next->next; continue; } Loop1:{ A2 = A1; A1 = A1->next; } } //show_list(head); } printf("成功完成排序!\n"); } END:return head; } } //新增通訊錄成員資訊 address_list * add(address_list *head) { int i; address_list *A1, *A2, *A3; A1 = A2 = A3 =(address_list *)malloc(sizeof(address_list));//這裡不開闢空間總會導致程式崩潰! A1 = head; if(n==0) { printf("新增通訊錄成員\n"); printf("請輸入名字:"); scanf("%s",A2->name); printf("請輸入性別:"); scanf("%s",A2->sex); printf("請輸入年齡:"); scanf("%s",A2->age); printf("請輸入電話:"); scanf("%s",A2->phone); printf("請輸入地址:"); scanf("%s",A2->addr); printf("新增成功!\n"); A2->next = NULL; head = A2; } else { for (i=1; i<=n; i++) { if(A1->next == NULL) { A1->next = A3; printf("\n新增通訊錄成員\n"); printf("請輸入名字:"); scanf("%s",A3->name); printf("請輸入性別:"); scanf("%s",A3->sex); printf("請輸入年齡:"); scanf("%s",A3->age); printf("請輸入電話:"); scanf("%s",A3->phone); printf("請輸入地址:"); scanf("%s",A3->addr); printf("新增成功!\n"); A3->next = NULL; } A1 = A1->next; } } n++; //free(A1);free(A2);free(A3);//釋放之後結果就不對了! //printf("%d",head->next); return head; } //顯示已存在通訊表資訊 void show_list(address_list *head) { int i; address_list *A1; A1 = (address_list *)malloc(sizeof(address_list));//這裡不開闢空間總會導致程式崩潰! A1 = head; if (n == 0) printf("沒有資料,請新增!\n"); else { printf("\n現在通訊錄中儲存 %d 個人的資訊!\n",n); for (i=1; i<=n; i++) { printf("名字:%4s,性別:%4s,年齡:%4s,電話:%4s,地址:%4s\n" ,A1->name, A1->sex,A1->age,A1->phone,A1->addr); A1 = A1->next; } } free(A1); } //儲存聯絡人資訊 void save_list(address_list *head) { address_list *A1; A1 = (address_list *)malloc(sizeof(address_list));//這裡不開闢空間總會導致程式崩潰! A1 = head; FILE *fp;//檔案指標 /*檔案的開啟*/ char data_list[100]; printf("請輸入想儲存的檔名稱(需帶檔案字尾):"); scanf("%s",data_list); fp=fopen(data_list,"w");//fopen開啟檔案,這個檔案可以是當前不存在的。“w”以寫入的形式開啟,“r”以讀的形式開啟 if(fp==NULL) //判斷如果檔案指標為空 { printf("不能開啟檔案! " ); //exit(0);//在以0的形式退出,必須在檔案開頭有#include <stdlib.h>,stdlib 標頭檔案即standard library標準庫標頭檔案 } //寫入資料 else { for (int i=1; i<=n; i++) { fprintf(fp, "名字:%6s,性別:%6s,年齡:%6s,電話:%6s,地址:%6s\n" ,A1->name, A1->sex,A1->age,A1->phone,A1->addr); A1 = A1->next; } printf("通訊錄資訊成功儲存至 %s 中!\n",data_list); } //關閉檔案 fclose(fp); free(A1); } //顯示功能 void show_feature(void) { printf("\n現在通訊錄中儲存 %d 個人的資訊!\n",n); printf("*********************************\n"); printf("***1. 新增 2. 刪除********\n"); printf("***3. 查詢 4. 修改********\n"); printf("***5. 顯示 6. 清空********\n"); printf("***7. 排序 8. 儲存********\n"); printf("***0. 退出 ********\n"); printf("*********************************\n"); } //退出通訊錄系統 void exit_list() { printf("歡迎您再次使用!"); printf("\n已成功退出通訊錄系統!\n"); }
結果顯示:
完事收工!