/* 實現一個通訊錄; 通訊錄可以用來存儲1000個人的信息,每個人的信息包括: 姓名、性別、年齡、電話、住址 提供方法: 1. 添加聯系人信息 2. 刪除指定聯系人信息 3. 查找指定聯系人信息 4. 修改指定聯系人信息 5. 顯示所有聯系人信息 6. 清空所有聯系人 7. 顯示文本電話簿信息 */ //頭文件 #ifndef __PHONE_BOOK_H__ #define __PHONE_BOOK_H__ typedef struct phone_book { char name[10]; char sex[5]; char addr[20]; int year; char phone_num[12]; struct phone_book *pNext; }Book,*pBook; pBook add_linkman(pBook head); pBook remove_linkman(pBook head); void traver_linkman(pBook head); pBook empty_linkman(pBook head); pBook amend_linkman(pBook head); void search_linkman(pBook head); void start(pBook *head); void write_file(pBook position);//寫入文本 void read_file(pBook head);//讀取文本信息 void amend_file(pBook position, char *name, int flag);//修改,刪除文本中的某一行信息 #endif //函數文件 #include<stdio.h> #include"phone_book.h" #include<string.h> #include<assert.h> extern char file_name[30]="\0"; void start(pBook *phead) { int i = -1; assert(phead); while (1) { printf("歡迎使用電話薄系統!選擇您的操作:\n\n"); printf("*********************************************\n" "*1.添加聯系人信息 2.刪除指定聯系人信息 *\n" "*3.查找指定聯系人信息 4.修改指定聯系人信息 *\n" "*5.顯示所有聯系人信息 6.清空所有聯系人 *\n" "*7.顯示電話文本內信息 0.結束系統! *\n" "* ————中情局專用———— *\n" "*********************************************\n"); scanf("%d",&i); switch (i) { case 0: printf("*****感謝使用本系統!*****\n"); printf(" 您的電話本存儲路徑為:%s 別忘記哦!\n", file_name); exit(0); case 1: *phead=add_linkman( phead); break; case 2: *phead = remove_linkman(phead); break; case 3: search_linkman(phead); break; case 4: *phead = amend_linkman(phead); break; case 5: traver_linkman(phead); break; case 6: empty_linkman( phead); break; case 7: read_file(phead); break; default: printf("選擇有誤!請重新選擇\n"); break; } } } pBook add_linkman(pBook head) { int i = 0; char name[10]; char sex[5]; char addr[20]; int year; long phone_num; pBook pBase = head; assert(head); flag: printf("你要添加多少個聯系人:"); scanf("%d",&i); if (i <= 0) { printf("輸入數量錯誤!\n"); goto flag; } if (head->pNext == NULL) { while (i--) { pBook pNew = (pBook)malloc(sizeof(Book)); assert(pNew); printf("請輸入聯系人信息:(姓名、性別、地址、年齡、電話號碼)\n"); scanf("%s", name); scanf("%s", sex); scanf("%s", addr); strcpy(pNew->name, name); strcpy(pNew->sex, sex); strcpy(pNew->addr, addr); scanf("%d", &pNew->year); scanf("%s", &pNew->phone_num); pBase->pNext = pNew; pNew->pNext = NULL; pBase = pNew; write_file(pNew); } } else { while (pBase->pNext != NULL) { pBase = pBase->pNext; } while (i--) { pBook pNew = (pBook)malloc(sizeof(Book)); assert(pNew); printf("請輸入聯系人信息:(姓名、性別、地址、年齡、電話號碼)\n"); scanf("%s", name); scanf("%s", sex); scanf("%s", addr); strcpy(pNew->name, name); strcpy(pNew->sex, sex); strcpy(pNew->addr, addr); scanf("%d", &pNew->year); scanf("%s", &pNew->phone_num); pBase->pNext = pNew; pNew->pNext = NULL; pBase = pNew; write_file(pNew); } } return head; } pBook remove_linkman(pBook head) { pBook link_man = head; char name[10]; if (!head) { printf("沒有聯系人,不能刪除!\n"); return NULL; } printf("請問你要刪除哪位聯系人? "); scanf("%s",name); while (link_man->pNext!=NULL) { if (strcmp(link_man->pNext->name, name) == 0) { amend_file(link_man->pNext,name,0); if (link_man->pNext->pNext == NULL) { free(link_man->pNext); link_man->pNext = NULL; printf("刪除完成!\n"); } else { pBook ptmp = NULL; ptmp = link_man->pNext; link_man->pNext = link_man->pNext->pNext; free(ptmp); printf("刪除完成!\n"); } return head; } else { link_man = link_man->pNext; } } printf("沒有找到該聯系人!\n"); return head; } void traver_linkman(pBook head) { pBook link_man = head; if (head->pNext == NULL) { printf("電話簿為空!\n"); } while (link_man->pNext!=NULL) { printf("%s\n", link_man->pNext->name); printf("%s\n", link_man->pNext->sex); printf("%s\n", link_man->pNext->addr); printf("%d\n", link_man->pNext->year); printf("%s\n", link_man->pNext->phone_num); printf("***********************************\n"); link_man = link_man->pNext; } } pBook empty_linkman(pBook head) { pBook ptmp = NULL; pBook link_man = head; if (head->pNext == NULL) { printf("電話簿為空!不用清空哦!(ˇ0ˇ) \n"); return NULL; } while (link_man->pNext != NULL) { if (link_man->pNext->pNext == NULL) { free(link_man->pNext); link_man->pNext = NULL; } else { ptmp = link_man->pNext; link_man->pNext = link_man->pNext->pNext; free(ptmp); } } printf("清空完成!\n"); write_file(NULL); return NULL; } pBook amend_linkman(pBook head) { char name[10]; char sex[5]; char addr[20]; pBook link_man = head; if (!head) { printf("沒有聯系人,不能修改!\n"); return NULL; } printf("請問你要修改哪位聯系人? "); scanf("%s", name); while (link_man->pNext != NULL) { if (strcmp(link_man->pNext->name, name) == 0) { printf("請輸入聯系人信息:(姓名、性別、地址、年齡、電話號碼)\n"); scanf("%s", name); scanf("%s", sex); scanf("%s", addr); strcpy(link_man->pNext->name, name); strcpy(link_man->pNext->sex, sex); strcpy(link_man->pNext->addr, addr); scanf("%d", &link_man->pNext->year); scanf("%s", &link_man->pNext->phone_num); amend_file(link_man->pNext,name,1); return head; } else link_man = link_man->pNext; } return head; } void search_linkman(pBook head) { char name[10]; pBook link_man = head; if (!head) { printf("沒有聯系人,查找失敗!\n"); return NULL; } printf("請問你要查找哪位聯系人? "); scanf("%s", name); while (link_man->pNext != NULL) { if (strcmp(link_man->pNext->name, name) == 0) { printf("%s\n", link_man->pNext->name); printf("%s\n", link_man->pNext->sex); printf("%s\n", link_man->pNext->addr); printf("%d\n", link_man->pNext->year); printf("%s\n", link_man->pNext->phone_num); printf("***********************************\n"); return 0; } else link_man = link_man->pNext; } printf("沒有找到!\n"); } void write_file(pBook position) { FILE *list; if (position != NULL) { if (strcmp(file_name,"\0")==0) { printf("請輸入你要存儲的文件路徑:"); scanf("%s", file_name); list = fopen(file_name, "wt"); fprintf(list, "%-10s", "姓名"); fprintf(list, "%-6s", "性別"); fprintf(list, "%-10s", "地址"); fprintf(list, "%-8s", "年齡"); fprintf(list, "%-20s", "號碼"); fprintf(list, "%s", "\n"); } else list = fopen(file_name, "a+"); fprintf(list,"%-10s",position->name); fprintf(list, "%-6s", position->sex); fprintf(list, "%-10s", position->addr); fprintf(list, "%-8d", position->year); fprintf(list, "%-20s", position->phone_num); fprintf(list, "%s", "\n"); } else { list = fopen(file_name, "w"); fprintf(list, "%s", " 已經銷毀的通訊錄 "); strcpy(file_name,"\0"); } fclose(list); } void read_file(pBook head) { if (head->pNext == NULL) { printf("空的通訊錄\n\n"); } else { FILE *list = fopen(file_name, "r"); char ch; while ((ch = fgetc(list)) != EOF) { putchar(ch); } } } void amend_file(pBook position,char *name,int i) { char str[100]; long num1=0; FILE * list = fopen(file_name, "r"); while (fgets(str, 100, list)!=NULL) { if (strstr(str, name) == NULL) { num1 += strlen(str) + 1; } else break; } fclose(list); list = fopen(file_name, "r+"); fseek(list, num1, SEEK_SET); if (i == 0) { fprintf(list, "%54s"," "); fprintf(list, "%s", "\n"); } else { fprintf(list, "%-10s", position->name); fprintf(list, "%-6s", position->sex); fprintf(list, "%-10s", position->addr); fprintf(list, "%-8d", position->year); fprintf(list, "%-20s", position->phone_num); fprintf(list, "%s", "\n"); } fclose(list); } //主函數 #include<stdio.h> #include"phone_book.h" char file_name[30]; int main() { pBook phead = NULL; start(&phead); return 0; }