我们在前文中介绍了如何实现简易通讯录,但是我们发现,如果直接在栈区开辟一个1000个大小为PeoInfo结构体大小的空间,而我们只使用了那么几个,不免有些过于浪费,于是我们考虑使用动态内存开辟来让空间使用更加合理。
具体不再赘述,需要动态修改的内容只在几个函数中有所改变,代码中已经加注 动态版本: 的部分就是需要修改的部分。完整代码如下:
addressBook.h文件:
#pragma once
//头文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_TELE 12
#define MAX_ADDR 20
#define MAX 1000
#define INIT_SZ 3
#define CAP_ADD 2
enum fun
{
EXIT,//从0开始,EXIT = 0
ADD,//1
DEL,//2
SEARCH,//3
MODIFY,//4
PRINT,
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 Book
//{
// PeoInfo data[MAX];//
// int size;//记录当前通讯录中有效的信息个数
//}Book;
//通讯录结构体:动态版本
typedef struct Book
{
PeoInfo* data;//动态版本:记录个人信息
int size;//记录当前通讯录中有效的信息个数
int cap;//记录当前的最大容量,以便满了通过动态内存管理来扩充
}Book;
//菜单函数声明:
void menu(void);
void menu_ins(void);
//初始化通讯录函数声明
void InitMsg(Book*);
//增加通讯录信息函数声明:
void AddMsg(Book* );
//打印通讯录信息函数声明:
void PrintMsg(Book* );
//删除通讯录信息函数声明:
void DelMsg(Book* );
//查找通讯录信息函数声明:
void SearchMsg(Book*);
//修改通讯录信息函数声明:
void ModMsg(Book*);
//排序通讯录信息函数声明:
void SortMsg(Book*);
//通讯录动态空间释放函数声明:
void DestroyMsg(Book*);
addressBook.c文件:
//
//本文件包括 各功能函数:
#include "addressBook.h"
//菜单显示:
void menu()
{
printf("********************************\n");
printf("****** 1.增加 2.删去 ******\n");
printf("****** 3.搜索 4.修改 *****\n");
printf("****** 5.浏览 6.排序 *****\n");
printf("****** 0.退出 ***********\n");
printf("********************************\n");
}
//菜单说明:
void menu_ins()
{
printf("菜单说明\n");
printf("增加:增加通讯录信息\n");
printf("删去:输入姓名,删去该姓名对应的通讯录信息\n");
printf("搜索:输入姓名,搜索并打印该姓名对应的通讯录信息\n");
printf("修改:输入姓名,修改该姓名对应的通讯录信息\n");
printf("浏览:打印出全部通讯录信息\n&#