1.contact.h
//#pragma once #ifndef _CONTACT_H_ #define _CONTACT_H_ #include <stdio.h> #include <windows.h> #pragma warning (disable:4996) #define MAX_NAME 10 #define MAX_SEX 5 #define MAX_TELE 20 #define MAX_ADDR 30 #define CON_START 2 //初始通讯录大小 #define INC_COUNT 10 //每次增容大小 #define FILENAME "contact.txt" //用来保存信息的文件 typedef struct PeoInfo { //个人信息结构体 char name[MAX_NAME]; int age; char sex[MAX_SEX]; char tele[MAX_TELE]; char addr[MAX_ADDR]; }Peo; typedef struct Contact { //通讯录信息结构体 Peo* con;//结构体指针,数据存放的位置 int count;//现在存放的个数 int capacity;//容量 }Con, *pCon; /*接口函数*/ void initContact(pCon pcon);//初始化通讯录 void add(pCon pcon); void dele(pCon pcon); void search(pCon pcon); void modify(pCon pcon); void show(pCon pcon); void empty(pCon pcon); void sort(pCon pcon); void Loadcontact(pCon pcon); void Savecontact(pCon pcon); #endif
2.contact.c
#include "contact.h" /*初始化*/ void initContact(pCon pcon) { pcon->con = (Peo*)malloc(CON_START * sizeof(Peo)); if (pcon->con == NULL) { printf("Out Of Memory\n"); exit(EXIT_FAILURE); } memset(pcon->con, 0, CON_START * sizeof(Peo)); pcon->count = 0; pcon->capacity = CON_START;//初始化最大容量为CON_START } void check(pCon pcon) //检测 { Peo *ptr = NULL; if (pcon->count == pcon->capacity) { ptr = (Peo*)realloc(pcon, (pcon->count + INC_COUNT) * sizeof(Peo)); if (ptr == NULL) { printf("Out Of Memory\n"); exit(EXIT_FAILURE); } else { pcon->con = ptr; pcon->capacity = pcon->capacity + INC_COUNT; } } } /*增加成员*/ void add(pCon pcon) { check(pcon); printf("name:"); scanf("%s", pcon->con[pcon->count].name); printf("age:"); scanf("%d", &(pcon->con[pcon->count].age)); printf("sex:"); scanf("%s", pcon->con[pcon->count].sex); printf("tele:"); scanf("%s", pcon->con[pcon->count].tele); printf("addr:"); scanf("%s", pcon->con[pcon->count].addr); pcon->count++; } int find(pCon pcon) { char name[10] = { 0 }; int i = 0; printf("请输入姓名: "); scanf("%s", name); for (i = 0; i < pcon->count; i++) { if (strcmp(name, pcon->con[i].name) == 0) { return i; } } return -1; } /*删除成员*/ void dele(pCon pcon) { int i = 0; int ret = 0; if (pcon->count == 0) { printf("通讯录为空\n"); return; } ret = find(pcon); if (ret == -1) { printf("没有找到!\n"); } else { for (i = ret; i < pcon->count - 1; i++) { pcon->con[i] = pcon->con[i + 1]; } pcon->count--; printf("删除成功!\n"); } } /*查找成员*/ void search(pCon pcon) { int ret = 0; if (pcon->count == 0) { printf("通讯录为空\n"); return; } ret = find(pcon); if (ret == -1) { printf("没有找到\n"); } else { printf("%5s\t%s\t%5s\t%5s\t%5s\n", "name", "age", "sex", "tele", "addr"); printf("%5s\t%d\t%5s\t%5s\t%5s\n", \ pcon->con[ret].name, \ pcon->con[ret].age, pcon->con[ret].sex, \ pcon->con[ret].tele, pcon->con[ret].addr); } } /*修改*/ void modify(pCon pcon) { int ret = 0; if (pcon->count == 0) { printf("通讯录为空\n"); return; } ret = find(pcon); if (ret == -1) { printf("没有找到\n"); } else { printf("name:"); scanf("%s", &(pcon->con[ret].name)); printf("age:"); scanf("%d", &(pcon->con[ret].age)); printf("sex:"); scanf("%s", &(pcon->con[ret].sex)); printf("tele:"); scanf("%s", &(pcon->con[ret].tele)); printf("addr:"); scanf("%s", &(pcon->con[ret].addr)); } } /*排序*/ void sort(pCon pcon) //从小到大 { int flag = 0; int i = 0; int j = 0; for (i = 0; i<pcon->count - 1; i++) { flag = 1; for (j = 0; j<pcon->count - i - 1; j++) { if (strcmp(pcon->con[j].name, pcon->con[j + 1].name)>0) { Peo tmp = pcon->con[j]; pcon->con[j] = pcon->con[j + 1]; pcon->con[j + 1] = tmp; flag = 0; } } if (flag == 1) break; } //show(pcon); printf("排序完成\n"); } /*展示信息*/ void show(pCon pcon) { int i = 0; printf("%5s\t%s\t%5s\t%5s\t%5s\n", "name", "age", "sex", "tele", "addr"); //printf("%d\n",pcon->count ); for (i = 0; i<pcon->count; i++) { printf("%5s\t%d\t%5s\t%5s\t%5s\n", \ pcon->con[i].name, \ pcon->con[i].age, pcon->con[i].sex, \ pcon->con[i].tele, pcon->con[i].addr); } } void empty(pCon pcon) { if (pcon->con != NULL) { free(pcon->con); pcon->con = NULL; } } /*加载*/ void Loadcontact(pCon pcon) { Peo tmp = { 0 }; FILE *pfread = fopen(FILENAME, "r"); if (pfread == NULL){ perror(FILENAME); exit(EXIT_FAILURE); } while (fread(&tmp, sizeof(Peo), 1, pfread)){ //读取 check(pcon); pcon->con[pcon->count++] = tmp; //赋值 } fclose(pfread); } /*保存*/ void Savecontact(pCon pcon) { FILE *pfwrite = fopen(FILENAME, "w"); int i = 0; if (pfwrite == NULL){ perror(FILENAME); exit(EXIT_FAILURE); } for (i = 0; i<pcon->count; i++){ fwrite(pcon->con + i, sizeof(Peo), 1, pfwrite); } fclose(pfwrite); }
3.test.c
#include "contact.h" /* 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 7. 以名字排序所有联系人 0. 退出 */ enum Option //枚举,增加代码可读性 { Exit,//从0开始 Add, Dele, Search, Modify, Show, Empty, Sort }; void menu() { printf("##############################\n"); printf("###### Design By Liyuan ####\n"); printf("##############################\n"); printf("###### 1.add 2.dele ####\n"); printf("###### 3.search 4.modify ####\n"); printf("###### 5.show 6.empty ####\n"); printf("###### 7.sort 0.exit ####\n"); printf("##############################\n"); } test() { Con myCon;//创建的一个Con类型变量,即新创建一个通讯录名 int input = 0; initContact(&myCon);//初始化 while (1) { menu(); printf("Please Select<0-7>:"); scanf("%d", &input); switch (input) { case Add: add(&myCon); break; case Dele: dele(&myCon); break; case Search: search(&myCon); break; case Modify: modify(&myCon); break; case Show: show(&myCon); break; case Empty: empty(&myCon); break; case Sort: sort(&myCon); break; case Exit: Savecontact(&myCon); empty(&myCon);//释放内存,防止内存泄漏 exit(0); break; default: printf("Select Erro.Please Reselect!\n"); break; } } } int main() { test(); system("pause"); return 0; }