模拟实现动态通讯录

来源:互联网 发布:淘宝网评价管理网页. 编辑:程序博客网 时间:2024/05/16 17:11

       动态内存开辟较静态内存开辟而言,内存比较灵活,静态内存是事先就给定的,动态内存开辟既节约内存空间,使用起来有比较灵活。

      在动态内存开辟的过程中要熟练掌握malloc、realloc以及free函数的使用;为了测试比较容易一点,我们在注意#define定义的初始容量大小,不要太大。;和静态版通讯录一样,分别定义三个文件,代码如下:

Contact.h

#ifndef __CONTACT_H__ #define __CONTACT_H__ #include <stdio.h>#include <stdlib.h>//#include <iostream> #include<string.h>#define MAX 1000 #define NAME_MAX 20 #define SEX_MAX 5 #define ADDR_MAX 30 #define TELE_MAX 12#define Set_size 3#define Incre_size 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 SortContach(pContact pcon);//按姓名给联系人排序void ClearContact(pContact pcon);//清空联系人void FreeContact(pContact pcon);//释放内存空间#endif
Contact.c

#define _CRT_SECURE_NO_WARNINGS 1#include"Contact.h"void InitContact(pContact pcon){pcon->sz = 0;pcon->data = malloc(Set_size*sizeof(PeoInfo));if (pcon->data == NULL){perror("malloc");exit(EXIT_FAILURE);}memset(pcon->data, 0, Set_size*sizeof(PeoInfo));pcon->capacity = Set_size;}void CheckCapacity(pContact pcon){if (pcon->data == pcon->capacity){PeoInfo* ptr = realloc(pcon->data, (pcon->capacity + Incre_size)*sizeof(PeoInfo));if (ptr = NULL){perror("realloc");exit(EXIT_FAILURE);}else{pcon->data = ptr;}pcon->capacity += Incre_size;printf("增容成功");}}void AddContact(pContact pcon){CheckCapacity(pcon);printf("输入联系人的信息:\n");printf("姓名:");scanf("%s", pcon->data[pcon->sz].name);printf("年龄:");scanf("%2d", &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 FreeContact(pContact pcon){free(pcon->data);pcon -> data = NULL;pcon->sz = 0;}static int search(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 SearchContact(pContact pcon){int i = 0;char name[NAME_MAX] = { 0 };printf("请输入你要查找的名字:");scanf("%s", &name);int ret = search(pcon, name);if (ret == -1){printf("没有您要查找的名字!\n");return;}else{printf("\t姓名\t年龄\t性别\t地址\t电话");printf("\n");printf("\t%s\t%d\t%s\t%s\t%s\t\n",pcon->data[ret].name,pcon->data[ret].age,pcon->data[ret].sex,pcon->data[ret].addr,pcon->data[ret].tele);}}//删除联系人void DelContact(pContact pcon){int i = 0;char name[NAME_MAX] = { 0 };printf("请输入你要删除的名字:");scanf("%s", &name);int ret = search(pcon, name);if (ret == -1){printf("没有您要删除的姓名\n");return;}else{for (i = ret; i < pcon->sz; i++){pcon->data[i] = pcon->data[i + 1];}printf("删除成功!");pcon->sz--;}}//修改联系人信息void ModifyContact(pContact pcon){char name[NAME_MAX] = { 0 };printf("请输入你要修改的名字:");scanf("%s", &name);int ret = search(pcon, name);if (ret == -1){printf("没有您要修改的名字\n");return;}else{printf("请输入姓名:");scanf("%s", pcon->data[ret].name);printf("请输入年龄:");scanf("%d", &pcon->data[ret].age);printf("请输入性别:");scanf("%s", pcon->data[ret].sex);printf("请输入地址:");scanf("%s", pcon->data[ret].addr);printf("请输入电话:");scanf("%s", pcon->data[ret].tele);printf("修改成功!");}}//显示联系人void ShowContact(const pContact pcon){int i = 0;printf("\t姓名\t年龄\t性别\t地址\t电话");printf("\n");for (i = 0; i < pcon->sz; i++){printf("\t%s\t%d\t%s\t%s\t%s\t\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;memset(pcon->data, 0, sizeof(pcon->data));printf("清空成功\n");}//按姓名排序void SortContach(pContact pcon){int i = 0;int j = 0;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){PeoInfo tmp = pcon->data[j];pcon->data[j] = pcon->data[j + 1];pcon->data[j + 1] = tmp;}}}}
test.c
#define _CRT_SECURE_NO_WARNINGS 1#include"Contact.h"void menu(){printf("\t********** 通讯录管理 **********\n");printf("\t*** 1.添加联系人 2.查找联系人***\n");printf("\t*** 3.删除联系人 4.修改联系人***\n");printf("\t*** 5.清空联系人 6.显示联系人***\n");printf("\t*** 7.按姓名排序 0.退出系统  ***\n");printf("\t**********  请选择:  ***********\n");}int main(){int input = 0;PeoInfo pcon[MAX];InitContact(pcon);do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:AddContact(&pcon);break;case 2:SearchContact(&pcon);break;case 3:DelContact(&pcon);break;case 4:ModifyContact(&pcon);break;case 5:ClearContact(&pcon);break;case 6:ShowContact(&pcon);break;case 7:SortContach(&pcon);break;case 0:exit(EXIT_FAILURE);default:break;}}while (input != 0);FreeContact(&pcon);system("pause");return 0;}