1.contact.h
//#ifndef _CONTACT_H_ //#endif #ifdef _CONTACT_H_ #endif #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 //每次增容大小 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);
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; } }
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: empty(&myCon);//释放内存,防止内存泄漏 exit(0); break; default: printf("Select Erro.Please Reselect!\n"); break; } } } int main() { test(); system("pause"); return 0; }