通讯录进阶——动态通讯录

来源:互联网 发布:深圳网站seo 编辑:程序博客网 时间:2024/05/17 20:55

上次的通讯录存储空间是固定的,如果朋友人少就会造成内存的浪费,使用动态版可以使内存浪费情况减轻,用多少就开辟多少,满了就重新开辟。

头文件

Contact.h#define _CRT_SECURE_NO_WARNINGS#ifndef __CONTACT_H__ #define __CONTACT_H__ #include <stdio.h>#include <assert.h>#include <string.h>#include <stdlib.h>#define MAX 3 //通讯录最大存储量#define NAME_MAX 20//名字最大长度 #define SEX_MAX 5 //性别...#define ADDR_MAX 30 //地址...#define TELE_MAX 12 //电话...#define DEFAULT_SIZE 3//有效量#define DEFAULT_CIN 2//增长typedef 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 CheckCapacity(pContact pcon);void DestroyContact(pContact pcon);#endif

测试程序

test.c#define _CRT_SECURE_NO_WARNINGS#include "Contact.h"void menu()//菜单{printf("*******************************************************\n");printf("*************      1.ADD         2.DEL   **************\n");printf("********           3.SEARCH      4..MODIFY     ********\n");printf("*************      5.SHOW        6.CLEAR   ************\n");printf("*************      7.SORT        0.EXIT  **************\n");printf("*******************************************************\n");}enum{EXIT,//0ADD,//1DEL,//2SEARCH,//3MODIFY,//4SHOW,//5CLEAR,//6SORT//7 };void test(){int input = 0;Contact my_con;InitContact(&my_con);//初始化通讯录do {menu();//打印菜单printf("请选择:>");scanf("%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 CLEAR:ClearContact(&my_con);break;case SORT:SortContact(&my_con);break;case  EXIT:DestroyContact(&my_con);break;default:break;}} while (input);}int main(){test();return 0;}

功能实现程序:

Contact.c#define _CRT_SECURE_NO_WARNINGS#include "Contact.h"void InitContact(pContact pcon)//初始化通讯录{pcon->sz = 0;pcon->data = malloc(DEFAULT_SIZE*sizeof(PeoInfo));if (pcon->data == NULL){perror("malloc:");exit(EXIT_FAILURE);}memset(pcon->data, 0, DEFAULT_SIZE*sizeof(PeoInfo));pcon->capacity = DEFAULT_SIZE;}void CheckCapacity(pContact pcon){PeoInfo *str = NULL;assert(pcon!=NULL);if (pcon->sz == pcon->capacity){ str = realloc(pcon->data, (pcon->capacity+DEFAULT_CIN)*sizeof(PeoInfo));if (str == NULL){perror("realloc:");exit(EXIT_FAILURE);}else{ pcon->data = str;}pcon->capacity += DEFAULT_CIN;printf("增容成功\n");}}void AddContact(pContact pcon)//添加联系人{assert(pcon!=NULL);CheckCapacity(pcon);printf("请输入姓名:>\n");scanf("%s",pcon->data[pcon->sz].name);printf("请输入性别:>\n");scanf("%s",pcon->data[pcon->sz].sex);printf("请输入年龄:>\n");scanf("%d",&(pcon->data[pcon->sz].age));printf("请输入地址:>\n");scanf("%s",pcon->data[pcon->sz].addr);printf("请输入电话:>\n");scanf("%s",pcon->data[pcon->sz].tele);pcon->sz++;printf("录入成功!\n");}int find(pContact pcon,char name[])//通用的查找函数{int i = 0;   assert(pcon!=NULL);for (i=0; i<pcon->sz; i++){if (strcmp(pcon->data[i].name ,name) == 0){return i;}}return -1;}void DelContact(pContact pcon)//删除联系人{int ret = 0;char name[NAME_MAX] = {0};assert(pcon!=NULL);printf("请输入要删除人的名字:>");scanf("%s",name);ret = find(pcon, name);if (ret == -1){printf("要查找的人不存在\n");return;}else{int i =0;for (i=ret; i<pcon->sz; i++){pcon->data[i] = pcon->data[i+1];}pcon->sz--;printf("删除成功\n");}}void SearchContact(pContact pcon)//查找联系人{int ret = 0;   char name[NAME_MAX] = {0};   assert(pcon!=NULL);   printf("请输入要查找的名字:>");   scanf("%s",name);ret = find(pcon,name);if (ret == -1){printf("要查找的人不存在\n");return;}else{printf("%10s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "性别", "年龄", "地址", "电话");printf("%10s\t%5s\t%5d\t%15s\t%15s\n", pcon->data[ret].name, pcon->data[ret].sex,pcon->data[ret].age,pcon->data[ret].addr, pcon->data[ret].tele);}}void ModifyContact(pContact pcon)//修改联系人{int ret = 0;char name[NAME_MAX] = {0};assert(pcon!=NULL);printf("请输入要修改人的名字:>");scanf("%s",name);ret = find(pcon,name);if (ret == -1){printf("要查找的人不存在\n");}else{printf("请输入姓名:>\n");scanf("%s",pcon->data[ret].name);printf("请输入性别:>\n");scanf("%s",pcon->data[ret].sex);printf("请输入年龄:>\n");scanf("%d",&(pcon->data[ret].age));printf("请输入地址:>\n");scanf("%s",pcon->data[ret].addr);printf("请输入电话:>\n");scanf("%s",pcon->data[ret].tele);}}void ShowContact(const pContact pcon)//展示联系人{int i = 0;assert(pcon!=NULL);printf("%10s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "性别", "年龄", "地址", "电话");for (i=0; i<pcon->sz; i++){printf("%10s\t%5s\t%5d\t%15s\t%15s\n", pcon->data[i].name, pcon->data[i].sex,pcon->data[i].age,pcon->data[i].addr, pcon->data[i].tele);}}void ClearContact(pContact pcon)//清空联系人{assert(pcon!=NULL);pcon->sz = 0;}void SortContact(pContact pcon)//按名字进行排序{int i = 0;int j = 0;PeoInfo tmp;assert(pcon!=NULL);for (i=0; i<pcon->sz; i++){for (j=0; j<pcon->sz-i-1; j++){if (strcmp(pcon->data[j].name, pcon->data[j+1].name)>0){tmp = pcon->data[j];pcon->data[j] = pcon->data[j+1];pcon->data[j+1] = tmp;}}}ShowContact(pcon);}void DestroyContact(pContact pcon){assert(pcon != NULL);free(pcon->data);pcon ->data= NULL;pcon ->sz =  0;pcon->capacity = 0;}


原创粉丝点击