Contact.h
#define _CRT_SECURE_NO_WARNINGS #pragma once #include<cstdio> #include<memory.h> #include<cstring> #include<stdlib.h> #define MAX_NAME 20 #define MAX_SEX 10 #define MAX_TELE 12 #define MAX_ADDR 30 #define MAX 1000 #define DEFAULT_SZ 3 #define INC_SZ 2 //类型的定义 typedef struct PeoInfo { char name[MAX_NAME]; char sex[MAX_SEX]; int age; char tele[MAX_TELE]; char addr[MAX_ADDR]; }PeoInfo; //静态版本 //typedef struct Contact //{ // PeoInfo data[MAX];//存放添加人的信息 // int sz;//当前通讯录中的人数 //}Contact; //动态版本 typedef struct Contact { PeoInfo* data;//存放添加人的信息 int sz;//当前通讯录中的人数 int capacity; }Contact; //函数的定义 void InitContact(Contact* pc);//初始化通讯录 void AddContact(Contact* pc);//在通讯录中添加人物信息 void PrintContact(const Contact* pc);//现实当前通讯录中的人的信息 void DelContact(Contact* pc); void SearchContact(Contact* pc); void ModifyContact(Contact* pc); void DestoryContact(Contact* pc);
Contact.c函数的实现
#include"contact.h" //动态版本 void InitContact(Contact* pc) { pc->data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo)); if (pc->data == NULL) { perror("InitContact"); return; } pc->sz = 0; pc->capacity = DEFAULT_SZ; } void AddContact(Contact* pc) { printf("请输入姓名>:"); scanf("%s", pc->data[pc->sz].name); printf("请输入性别>:"); scanf("%s", pc->data[pc->sz].sex); printf("请输入年龄:>"); scanf("%d", &pc->data[pc->sz].age); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("\n增加成功!\n"); if (pc->capacity == pc->sz) { PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (DEFAULT_SZ + INC_SZ) * sizeof(PeoInfo)); if (ptr != NULL) { pc->data = ptr; pc->capacity += INC_SZ; printf("增容成功!\n"); } else { perror("AddContact"); printf("增加联系人失败!\n"); return; } } } void DestoryContact(Contact* pc) { free(pc->data); pc->capacity = NULL; pc->sz = 0; pc->capacity = 0; } static int FindByName(Contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i;//找到了,返回下标i } } return -1;//找不到 } void DelContact(Contact* pc) { int i = 0; char name[MAX_NAME] = { 0 }; if (pc->sz == 0) { printf("此通讯录为空无法删除信息\n"); return; } //查找要删除的人(yes/no)? printf("请输入要删除的人名\n"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要删除的人不存在\n"); return; } for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功\n"); } void SearchContact(Contact* pc) { char name[MAX_NAME] = {0}; printf("请输入要查找人的姓名.\n"); scanf("%s", name); int pos = FindByName(pc,name); if (pos == -1) { printf("查无此人。\n"); return; } printf("%-20s\t%-8s\t%-5s\t%-12s\t%-20s\n", "姓名", "性别", "年龄", "电话号码", "地址"); printf("%-20s\t%-8s\t%-5d\t%-12s\t%-20s\t\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr); } void ModifyContact(Contact* pc) { printf("请输入要修改人的姓名.\n"); char name[MAX_NAME] = { 0 }; scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("没有%s的信息。\n", name); } printf("%-20s\t%-8s\t%-5s\t%-12s\t%-20s\n", "姓名", "性别", "年龄", "电话号码", "地址"); printf("%-20s\t%-8s\t%-5d\t%-12s\t%-20s\t\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr); printf("请修改>:\n"); printf("请输入姓名>:"); scanf("%s", pc->data[pos].name); printf("请输入性别>:"); scanf("%s", pc->data[pos].sex); printf("请输入年龄:>"); scanf("%d", &pc->data[pos].age); printf("请输入电话:>"); scanf("%s", pc->data[pos].tele); printf("请输入地址:>"); scanf("%s", pc->data[pos].addr); printf("\n修改成功!\n"); } void PrintContact(const Contact* pc) { int count = 0; printf("%-20s\t%-8s\t%-5s\t%-12s\t%-20s\n", "姓名", "性别", "年龄", "电话号码", "地址"); for (count = 0; count < pc->sz; count++) { printf("%-20s\t", pc->data[count].name); printf("%-8s\t", pc->data[count].sex); printf("%-5d\t", pc->data[count].age); printf("%-12s\t", pc->data[count].tele); printf("%-20s\t", pc->data[count].addr); printf("\n"); } }
test.c通讯录功能测试;
#define _CRT_SECURE_NO_WARNINGS #include"contact.h" //通讯录(静态版本) //1.通讯录中能够保存1000人的信息 //每个人的信息: //姓名+年龄+性别+电话+地址 //2.增加人的信息 //3.删除指定人的信息 //4.修改指定人的信息 //5.查找指定人的信息 //6.排序通讯录的信息 //动态版本 //最初放3个人的信息,不够后增加两个人的信息 void menu() { printf("************************************\n"); printf("******* 1.add 2.delete *******\n"); printf("******* 3.search 4.modify *******\n"); printf("******* 5.sort 6.printf *******\n"); printf("******* 0.exit *******\n"); printf("************************************\n"); } enum Option { EXIT, ADD, DELETE, SEARCH, MODIFY, SORT, PRINTF }; int main() { int sz = 0; Contact con; int input = 0; InitContact(&con); do { menu(); printf("请选择>:"); scanf("%d", &input); switch (input) { //增加信息 case ADD: AddContact(&con); break; //删除信息 case DELETE: DelContact(&con); break; //查找 case SEARCH: SearchContact(&con); break; //修改信息 case MODIFY: ModifyContact(&con); break; //分类信息 case SORT: break; //打印信息 case PRINTF: PrintContact(&con); break; //退出 case EXIT: DestoryContact(&con); printf("退出通讯录!"); break; default: printf("Please input again!\n"); break; } } while (input); return 0; }