【C语言】C语言实现动态通讯录

来源:互联网 发布:java 字符串拼接 效率 编辑:程序博客网 时间:2024/05/14 17:35

C语言实现动态通讯录是在静态通讯录的基础上进行修改(静态通讯录点击打开链接),静态通讯录已经在前面博客中总结出来了仅供大家参考。

实现一个通讯录; 
通讯录可以用来存储个人的信息,每个人的信息包括: 
姓名、性别、年龄、电话、住址 


提供方法: 
1. 添加联系人信息 
2. 删除指定联系人信息 
3. 查找指定联系人信息 
4. 修改指定联系人信息 
5. 显示所有联系人信息 
6. 清空所有联系人 
7. 以名字排序所有联系人 

以上是实现通讯录的基本要求,代码如下,基本的注释已经在代码后面给出:

Contact.h
#ifndef __CONTACT_H__ #define __CONTACT_H__ #include<stdio.h> #include<assert.h>#include<stdlib.h>#include<string.h>#include<ctype.h>#define MAX 1000 #define NAME_MAX 20 #define SEX_MAX 5 #define ADDR_MAX 30 #define TELE_MAX 12 #define DEFSULT_SZ 5#define DEFAULT_INC 2typedef struct PeoInfo{char name[NAME_MAX];int age;char sex[SEX_MAX];char addr[ADDR_MAX];char tele[TELE_MAX];}PeoInfo;typedef struct Contact{PeoInfo *data;//数据存储的区域int sz; //有效元素的个数int capacity;//容量}Contact, *pContact;void InitContact(pContact pcon);void AddContact(pContact pcon);void ShowContact(const pContact pcon);void DelContact(pContact pcon);void SearchContact(pContact pcon);void ModifyContact(pContact pcon);//修改void SortContact(pContact pcon);void ClearContact(pContact pcon);void ExitContact(pContact pcon);void DestoryContact(pContact pcon);#endif

Contact.c
#define _CRT_SECURE_NO_WARNINGS#include"contact.h"void InitContact(pContact pcon){pcon->sz = 0;pcon->data = malloc(DEFSULT_SZ* sizeof(PeoInfo)); if (pcon->data == NULL){perror("use malloc");exit(EXIT_FAILURE);}memset(pcon->data, 0, DEFSULT_SZ* sizeof(PeoInfo));pcon->capacity = DEFSULT_SZ;}//添加void CheckCapacity(pContact pcon){if (pcon->sz == pcon->capacity){//增容PeoInfo*ptr = realloc(pcon->data, (pcon->capacity + DEFAULT_INC)*sizeof(PeoInfo));if (ptr == NULL){perror("realloc");exit(EXIT_FAILURE);}else{pcon->data = ptr;}pcon->capacity += DEFAULT_INC;printf("增容成功\n");}}void AddContact(pContact pcon){assert(pcon);CheckCapacity(pcon);/*if (pcon->sz == MAX){printf("通讯录满了!!!\n");return;*/printf("请输入名字:");scanf("%s", pcon->data[pcon->sz].name);printf("请输入年龄:");scanf("%d", &(pcon->data[pcon->sz].age));//年龄 取地址printf("请输入性别:");scanf("%s", (pcon->data[pcon->sz].sex));printf("请输入地址:");scanf("%s", (pcon->data[pcon->sz].addr));printf("请输入电话:");scanf("%s", (pcon->data[pcon->sz].tele));pcon->sz++;printf("添加成功 !\n");}//显示void ShowContact(const pContact pcon){int i = 0;printf("%15s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "年龄", "性别", "地址", "电话");for (i = 0; i < pcon->sz; i++){printf("%15s\t%5d\t%5s\t%15s\t%15s\n",pcon->data[i].name,pcon->data[i].age,pcon->data[i].sex,pcon->data[i].addr,pcon->data[i].tele);}}void DestoryContact(pContact pcon){free(pcon->data);pcon->data = NULL;pcon->capacity = 0;pcon->sz = 0;}static int FindEntry(pContact pcon, char name[]){int i = 0;for (i = 0; i < pcon->sz; i++){if (strcmp(pcon->data[i].name, name) == 0)return i;}return -1;}//删除void DelContact(pContact pcon){int pos = 0;char name[NAME_MAX] = { 0 };printf("请输入要删除人的名字:\n");scanf("%s", name);pos = FindEntry(pcon, name);if (pos == -1){printf("要删除的人不存在 !\n");return;}else{//删除int j = 0;for (j = pos; j < pcon->sz; j++){pcon->data[j] = pcon->data[j + 1];}pcon->sz--;printf("删除成功 !\n");}}//查找void SearchContact(pContact pcon){int pos = 0;char name[NAME_MAX] = { 0 };printf("请输入要查找人的名字:\n");scanf("%s", name);pos = FindEntry(pcon, name);if (pos == -1){printf("要查找的人不存在 !\n");return;}else{printf("%15s\t%5d\t%5s\t%15s\t%15s\n",pcon->data[pos].name,pcon->data[pos].age,pcon->data[pos].sex,pcon->data[pos].addr,pcon->data[pos].tele);}}//修改void ModifyContact(pContact pcon){int i = 0;char flag = 'Y';int mod = -1;char na[20] = { 0 };do{printf("请输入需要修改的人:");scanf("%s", na);for (i = 0; i < pcon->sz; i++){if (strcmp(pcon->data[i].name, na) == 0){mod = i;}}if (mod >= 0){printf("请输入修改后的名字:");scanf("%s", &(pcon->data[mod].name));printf("请输入修改后的年龄:");scanf("%d", &(pcon->data[mod].age));printf("请输入修改后的性别:");scanf("%s", &(pcon->data[mod].sex));printf("请输入修改后的地址:");scanf("%s", &(pcon->data[mod].addr));printf("请输入修改后的电话号码:");scanf("%s", &(pcon->data[mod].tele));printf("是否继续录入?(继续输入请输入Y,任意键退出):\n");getchar();scanf("%c", &flag);if (toupper(flag) != 'Y')break;}else{printf("没有你要修改的人!");printf("是否继续修改联系人?(继续则输入Y,按任意键退出):");getchar();scanf("%c", &flag);if (toupper(flag) != 'Y')break;}} while (toupper(flag) == 'Y');}//排序void  SortContact(pContact pcon){int i = 0, j = 0;for (i = 0; i < pcon->sz - 1; i++){for (j = 0; j < pcon->sz - 1 - i; j++){if (strcmp(pcon->data[j].name, pcon->data[j + 1].name) > 0){PeoInfo  peo = pcon->data[j];pcon->data[j] = pcon->data[j + 1];pcon->data[j + 1] = peo;}}}printf("%15s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "年龄", "性别", "地址", "电话");for (i = 0; i < pcon->sz; i++){printf("%4s\t%2d\t%2s\t%12s\t%12s\n",pcon->data[i].name,pcon->data[i].age,pcon->data[i].sex,pcon->data[i].addr,pcon->data[i].tele);}}//清空void ClearContact(pContact pcon){pcon->sz = 0;}

test.c
#include"contact.h"//#include<stdio.h>enum {EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT,CLEAR,DESTROY};void meau(){printf("        *********************************************\n");printf("        *********************************************\n");printf("        ###############My address book###############\n");printf("        * 1-add          2-del         3-search     *\n");printf("        * 4-modify       5-show        6-Sort       *\n");printf("        * 0-Exit                       7-clear      *\n");printf("        *********************************************\n");printf("        *********************************************\n");}void test(){int input = 0;Contact my_con;InitContact(&my_con);do{meau();printf("请选择:");scanf_s("%d", &input);switch (input){case ADD://添加AddContact(&my_con);break;case SHOW://显示ShowContact(&my_con);break;case DEL://删除DelContact(&my_con);break;case SEARCH://查找SearchContact(&my_con);break;case MODIFY://修改ModifyContact(&my_con);break;case SORT://排序SortContact(&my_con);break;case CLEAR://清除ClearContact(&my_con);break;/*case DESTROY:DestroyContact(&my_con);break;*/case EXIT://退出exit(0);break;}} while (input);}int main(){test();return 0;}

程序示意图;



以上就是动态通讯录的实现,动态通讯录的主要部分便是对原本静态的内容进行增容处理,当然结构体与指针依旧是重点。里面重要的内容都在代码后面做了注释共大家参考。由于个人的能力有限,有不足的地方欢迎大家批评指正,新手上路,大神勿喷!
原创粉丝点击