前言
本篇将会介绍如何用c语言实现一个通讯录管理系统,将会制作一个简易版的通讯录,通讯录记录有名字、年龄、性别、地址、电话;通讯录可实现的功能有:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
一、创建结构体存放一个联系人信息
#define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30 typedef struct PeoInfo { char name[MAX_NAME]; //名字 int age; //年龄 char sex[MAX_SEX]; //性别 char tele[MAX_TELE]; //电话 char addr[MAX_ADDR]; //地址 }PeoInfo;
二、创建结构体存放多个联系人
typedef struct Contact { PeoInfo* data; //指向了存放数据的空间 int sz; //记录的当前放的有效元素的个数 int capacity; //通讯录当前的最大容量 }Contact;
三、通讯录的功能
//初始化通讯录 void InitContact(Contact* pc); //添加通讯录 void AddContact(Contact* pc); //删除通讯录 void DelContact(Contact* pc); //显示所有联系人的信息 void ShowContact(const Contact* pc); //删除指定联系人 void DelContact(Contact* pc); //查找指定联系人 void SearchContact(const Contact* pc); //按照名字排序联系人 void SortContact(contact* pc); //修改指定联系人 void ModifyContact(Contact* pc); //销毁通讯录 void DestroyContact(Contact* pc);
初始化通讯录函数
#define DEFAULT_SZ 3 void InitContact(Contact* pc) { assert(pc); pc->sz = 0; pc -> data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));//向内存申请空间 if (pc->data == NULL)//申请失败 { perror("InitContact"); return; } //申请成功 pc->sz = 0;//初始化sz pc->capacity = DEFAULT_SZ; }
检查通讯录容量并对其增容
#define INC_SZ int CheckCapacity(Contact* pc) { if (pc->sz == pc->capacity) { PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo)); if (ptr == NULL) { perror("CheckCapacity"); return 0; } else { pc->data = ptr; pc->capacity += INC_SZ; printf("增容成功\n"); return 1; } } return 1; }
添加通讯录
void AddContact(Contact* pc) { assert(pc); if (0 == CheckCapacity(pc)) { printf("通讯录已满,无法添加\n"); return; } printf("请输入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("成功添加联系人\n"); }
显示所有联系人
void ShowContact(const Contact* pc) { assert(pc); int i = 0; printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址"); for (i = 0; i < pc->sz; i++) { printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } }
删除通讯录的信息
首先要找到删除的人的名字,进行名字匹配。
static int FindByName(const Contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i;//找到了 } } return -1;//找不到 }
再进行删除操作
void DelContact(Contact* pc) { if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); return; } char name[MAX_NAME] = { 0 }; assert(pc); printf("请输入你要删除的人名字:>"); scanf("%s", name); //找到要删除的人 int del = FindByName(pc, name); if (del == -1) { printf("要删除的人不存在\n"); return; } int i = 0; for (i = del; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("成功删除联系人\n"); }
查找指定联系人
void SearchContact(const Contact* pc) { assert(pc); char name[MAX_NAME] = { 0 }; printf("请输入要查找人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要查找的人不存在\n"); } else { printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } }
按照名字排序联系人
void SortContact(Contact* pc) { if (pc->sz <= 0) { printf("通讯录没有联系人,请添加\n"); } else { int i = 0; for (i = 0; i < pc->sz - 1; i++) { int j = 0; for (j = 0; j < pc->sz - 1 - i; j++) { if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0) { PeoInfo tmp = pc->data[j]; pc->data[j] = pc->data[j + 1]; pc->data[j + 1] = tmp; } } } printf("排序成功!"); } }
修改指定联系人
void ModifyContact(Contact* pc) { assert(pc); char name[MAX_NAME] = { 0 }; printf("请输入要修改人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) printf("要修改的人不存在\n"); else { printf("请输入名字:>"); scanf("%s", pc->data[pos].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pos].age)); printf("请输入性别:>"); scanf("%s", pc->data[pos].sex); printf("请输入电话:>"); scanf("%s", pc->data[pos].tele); printf("请输入地址:>"); scanf("%s", pc->data[pos].addr); printf("修改成功\n"); } }
销毁通讯录
void DestroyContact(Contact* pc) { free(pc->data); pc->data = NULL; pc->capacity = 0; pc->sz = 0; }
四、测试函数
#define _CRT_SECURE_NO_WARNINGS 1 enum OPTION { EXIT,//0 ADD, DEL, SEARCH, MODIFY, SHOW, SORT }; void menu() { printf("********************************\n"); printf("***** 1. add 2. del *****\n"); printf("***** 3. search 4. modify *****\n"); printf("***** 5. show 6. sort *****\n"); printf("***** 0. exit *****\n"); printf("********************************\n"); } void test() { int intput = 0; Contact con; InitContact(&con); do { printf("请选择:>\n"); scanf("%d",&intput); switch (intput) { case ADD: AddContact(&con); break; case DEL: DelContact(&con); break; case SEARCH: SearchContact(&con); break; case MODIFY: ModifyContact(&con); break; case SHOW: ShowContact(&con); break; case SORT: SortContact(&con); break; case EXIT: DestroyContact(&con); printf("退出通讯录\n"); break; default: printf("选择错误, 重新选择\n"); break; } } while (intput); } int main() { menu(); test(); return 0; }
五、 完整代码
//放于自建头文件contact.h中 #pragma once #include<stdio.h> #include<string.h> #include<assert.h> #include<stdlib.h> #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30 #define DEFAULT_SZ 3 #define INC_SZ 2 enum OPTION { EXIT,//0 ADD, DEL, SEARCH, MODIFY, SHOW, SORT }; typedef struct PeoInfo { char name[MAX_NAME]; int age; char sex[MAX_SEX]; char tele[MAX_TELE]; char addr[MAX_ADDR]; }PeoInfo; typedef struct Contact { struct PeoInfo * data; int sz; int capacity; }Contact; //初始化通讯录 void InitContact(Contact* pc); //添加通讯录 void AddContact(Contact* pc); //删除通讯录 void DelContact(Contact* pc); //显示所有联系人的信息 void ShowContact(const Contact* pc); //删除指定联系人 void DelContact(Contact* pc); //查找指定联系人 void SearchContact(const Contact* pc); //修改指定联系人 void ModifyContact(Contact* pc); //销毁联系人 void DestroyContact(Contact* pc); //放于自建源文件contact.c中 #define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h" void InitContact(Contact* pc) { assert(pc); pc->sz = 0; pc -> data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo)); if (pc->data == NULL) { perror("InitContact"); return; } pc->sz = 0; pc->capacity = DEFAULT_SZ; } int CheckCapacity(Contact* pc) { if (pc->sz == pc->capacity) { PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo)); if (ptr == NULL) { perror("CheckCapacity"); return 0; } else { pc->data = ptr; pc->capacity += INC_SZ; printf("增容成功\n"); return 1; } } return 1; } void AddContact(Contact* pc) { assert(pc); if (0 == CheckCapacity(pc)) { printf("通讯录已满,无法添加\n"); return; } printf("请输入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("成功添加联系人\n"); } void ShowContact(const Contact* pc) { assert(pc); int i = 0; printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址"); for (i = 0; i < pc->sz; i++) { printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); } } static int FindByName(const Contact* pc, char name[]) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i;//找到了 } } return -1;//找不到 } void DelContact(Contact* pc) { if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); return; } char name[MAX_NAME] = { 0 }; assert(pc); printf("请输入你要删除的人名字:>"); scanf("%s", name); //找到要删除的人 int del = FindByName(pc, name); if (del == -1) { printf("要删除的人不存在\n"); return; } int i = 0; for (i = del; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("成功删除联系人\n"); } void SearchContact(const Contact* pc) { assert(pc); char name[MAX_NAME] = { 0 }; printf("请输入要查找人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) { printf("要查找的人不存在\n"); } else { printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址"); //打印数据 printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); } } void ModifyContact(Contact* pc) { assert(pc); char name[MAX_NAME] = { 0 }; printf("请输入要修改人的名字:>"); scanf("%s", name); int pos = FindByName(pc, name); if (pos == -1) printf("要修改的人不存在\n"); else { printf("请输入名字:>"); scanf("%s", pc->data[pos].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pos].age)); printf("请输入性别:>"); scanf("%s", pc->data[pos].sex); printf("请输入电话:>"); scanf("%s", pc->data[pos].tele); printf("请输入地址:>"); scanf("%s", pc->data[pos].addr); printf("修改成功\n"); } } void DestroyContact(Contact* pc) { free(pc->data); pc->data = NULL; pc->capacity = 0; pc->sz = 0; } //按照名字排序 void SortContact(Contact* pc) { if (pc->sz <= 0) { printf("通讯录没有联系人,请添加\n"); } else { int i = 0; for (i = 0; i < pc->sz - 1; i++) { int j = 0; for (j = 0; j < pc->sz - 1 - i; j++) { if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0) { PeoInfo tmp = pc->data[j]; pc->data[j] = pc->data[j + 1]; pc->data[j + 1] = tmp; } } } printf("排序成功!"); } } //放于自建源文件test.c中 #define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h" void menu() { printf("********************************\n"); printf("***** 1. add 2. del *****\n"); printf("***** 3. search 4. modify *****\n"); printf("***** 5. show 6. sort *****\n"); printf("***** 0. exit *****\n"); printf("********************************\n"); } void test() { int intput = 0; Contact con; InitContact(&con); do { printf("请选择:>\n"); scanf("%d",&intput); switch (intput) { case ADD: AddContact(&con); break; case DEL: DelContact(&con); break; case SEARCH: SearchContact(&con); break; case MODIFY: ModifyContact(&con); break; case SHOW: ShowContact(&con); break; case SORT: SortContact(&con); break; case EXIT: DestroyContact(&con); printf("退出通讯录\n"); break; default: printf("选择错误, 重新选择\n"); break; } } while (intput); } int main() { menu(); test(); return 0; }
总结
行文至此,已经结束,如有疑惑或不同见解,欢迎在评论区下留言!!!