实现一个通讯录:
通讯录可以用来存储个人信息,当通讯录空间已满时,可以自动扩充通讯录的存储空间,每个人的信息包括:姓名、性别、年龄、电话、住址。
提供方法:
1.添加联系人信息;
2.删除指定联系人信息;
3.查找指定联系人信息;
4.修改指定联系人信息;
5.显示所有联系人信息;
6.清空所有联系人;
7.以名字排序所有联系人。
根据上述需求,我们依次定义出所需要的结构体、自定义函数等等。
个人信息结构体定义:
#define MAX_NAME_SIZE 20
#define MAX_SEX_SIZE 3
#define MAX_TEL_SIZE 12
#define MAX_ADDR_SIZE 256
typedef struct PersonInfo
{
char name[MAX_NAME_SIZE];
char sex[MAX_SEX_SIZE];
int age;
char tel[MAX_TEL_SIZE];
char address[MAX_ADDR_SIZE];
}PersonInfo;
在定义了个人信息结构体后,还需要定义出通讯录结构体,按照满足题目要求 “当通讯录空间已满时,可以自动扩充通讯录的存储空间”,通讯录结构体定义如下:
typedef struct Contact
{
PersonInfo* pCont;
size_t capacity;//通讯录的最大容量
size_t size;
};
根据题目要求,初步定义出以下函数接口:
void InitContact(Contact* pcnt);//初始化通讯录
void AddContact(Contact* pcnt);//添加联系人信息
void DelContact(Contact* pcnt);//删除指定联系人信息
void FindContact(Contact* pcnt);//查找指定联系人信息
void ModifyContact(Contact* pcnt);//修改指定联系人信息
void ShowContact(Contact* pcnt);//显示所有联系人信息
void ClearContact(Contact* pcnt);//清除所有联系人
void SortContact(Contact* pcnt);//以名字排序所有联系人
根据题目要求,利用顺序表的相关知识实现通讯录管理系统,代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include<stdbool.h>
#define MAX_NAME_SIZE 20
#define MAX_SEX_SIZE 3
#define MAX_TEL_SIZE 12
#define MAX_ADDR_SIZE 256
#define DEFAULT_CONTACT_SIZE 128//通讯录默认空间大小
#define CONTACT_INC_SIZE 20//通讯录空间每次扩容大小
enum { QUIT, ADD, DEL, FIND, MODIFY, SHOW, CLEAR, SORT };
typedef struct PersonInfo
{
char name[MAX_NAME_SIZE];
char sex[MAX_SEX_SIZE];
int age;
char tel[MAX_TEL_SIZE];
char address[MAX_ADDR_SIZE];
}PersonInfo;
typedef struct Contact
{
PersonInfo* pCont;
size_t capacity;
size_t size;
}Contact;
//函数声明
void InitContact(Contact* pcnt);//初始化通讯录
void AddContact(Contact* pcnt);//添加联系人信息
void DelContact(Contact* pcnt);//删除指定联系人信息
void FindContact(Contact* pcnt);//查找指定联系人信息
void ModifyContact(Contact* pcnt);//修改指定联系人信息
void ShowContact(Contact* pcnt);//显示所有联系人信息
void ClearContact(Contact* pcnt);//清除所有联系人
void SortContact(Contact* pcnt);//以名字排序所有联系人
void DestroyContact(Contact* pcnt);//程序结束时摧毁通讯录,防止内存泄漏
int FindByName(Contact* pcnt, char Name[]);
bool CheckCapacity(Contact* pcnt);
bool IsEmpty(Contact* pcnt);
int main(int argc, char* argv[])
{
//初始化通讯录
Contact cont;
InitContact(&cont);
int select = 1;
while (select)
{
printf("**************通 讯 录*****************\n");
printf("* [1] Add [2] Del *\n");
printf("* [3] Find [4] Modify *\n");
printf("* [5] Show [6] Clear *\n");
printf("* [7] Sort [0] Quit System *\n");
printf("***************************************\n");
printf("请选择:>");
scanf("%d", &select);
if (select == QUIT)
break;
switch (select)
{
case ADD:
AddContact(&cont);
break;
case DEL:
DelContact(&cont);
break;
case FIND:
FindContact(&cont);
break;
case MODIFY:
ModifyContact(&cont);
break;
case SHOW:
ShowContact(&cont);
break;
case CLEAR:
ClearContact(&cont);
break;
case SORT:
SortContact(&cont);
break;
}
}
printf("GoodBye,退出通讯录系统...\n");
DestroyContact(&cont);
return 0;
}
void InitContact(Contact* pcnt)
{
pcnt->pCont = (PersonInfo*)malloc(sizeof(PersonInfo) * DEFAULT_CONTACT_SIZE);
memset(pcnt->pCont, 0, sizeof(PersonInfo) * DEFAULT_CONTACT_SIZE);//将开辟的空间全部初始化为0
pcnt->capacity = DEFAULT_CONTACT_SIZE;
pcnt->size = 0;
}
bool CheckCapacity(Contact* pcnt)
{
if (pcnt->size >= pcnt->capacity)
{
//扩容
PersonInfo* new_cont = (PersonInfo*)realloc(pcnt->pCont,
sizeof(PersonInfo) * (pcnt->capacity + CONTACT_INC_SIZE));
if (pcnt->pCont == NULL)
return false;
pcnt->pCont = new_cont;
pcnt->capacity += CONTACT_INC_SIZE;
printf("扩容成功.\n");
}
return true;
}
bool IsEmpty(Contact* pcnt)
{
return pcnt->size == 0;
}
void AddContact(Contact* pcnt)
{
if (!CheckCapacity(pcnt))
{
printf("通讯录已满,不能增加联系人信息...\n");
return;
}
printf("姓名:>");
scanf("%s", pcnt->pCont[pcnt->size].name);
printf("性别:>");
scanf("%s", pcnt->pCont[pcnt->size].sex);
printf("年龄:>");
scanf("%d", &pcnt->pCont[pcnt->size].age);
printf("电话:>");
scanf("%s", pcnt->pCont[pcnt->size].tel);
printf("住址:>");
scanf("%s", pcnt->pCont[pcnt->size].address);
pcnt->size++;
printf("增添联系人信息成功...\n");
}
void DelContact(Contact* pcnt)
{
printf("请输入要删除的联系人姓名:>");
char Name[MAX_NAME_SIZE];
scanf("%s", Name);
int index = FindByName(pcnt, Name);
if (index = -1)
{
printf("要删除的联系人不存在...\n");
return;
}
for (int i = index; i < pcnt->size; i++)
{
pcnt->pCont[i] = pcnt->pCont[i + 1];
}
pcnt->size--;
printf("删除信息成功...\n");
}
void FindContact(Contact* pcnt)
{
if (IsEmpty(pcnt))
{
printf("通讯录为空,不能查找...\n");
return;
}
char Name[MAX_NAME_SIZE];
scanf("%s", Name);
int index = FindByName(pcnt, Name);
if (index = -1)
{
printf("要查找的联系人不存在...\n");
return;
}
printf("%-8s%-6s%-6d%-13s%s\n", pcnt->pCont[index].name,
pcnt->pCont[index].sex,
pcnt->pCont[index].age,
pcnt->pCont[index].tel,
pcnt->pCont[index].address);
}
void ModifyContact(Contact* pcnt)
{
if (IsEmpty(pcnt))
{
printf("通讯录为空,不能修改...\n");
return;
}
char Name[MAX_NAME_SIZE];
scanf("%s", Name);
int index = FindByName(pcnt, Name);
if (index = -1)
{
printf("要修改的联系人不存在...\n");
return;
}
printf("%s", "你想修改什么信息(1-姓名 2-性别 3-年龄 4-电话 5-住址)");
int select;
scanf("%d", &select);
switch (select)
{
case 1:
printf("请输入要修改的姓名:>");
scanf("%s", pcnt->pCont[index].name);
break;
case 2:
printf("请输入要修改的性别:>");
scanf("%s", pcnt->pCont[index].sex);
break;
case 3:
printf("请输入要修改的年龄:>");
scanf("%d", &pcnt->pCont[index].age);
break;
case 4:
printf("请输入要修改的电话:>");
scanf("%s", pcnt->pCont[index].tel);
break;
case 5:
printf("请输入要修改的住址:>");
scanf("%s", pcnt->pCont[index].address);
break;
}
printf("修改信息成功...\n");
}
void ShowContact(Contact* pcnt)
{
printf("%-8s%-6s%-6s%-13s%s\n", "姓名", "性别", "年龄", "电话", "地址");
for (int i = 0; i < pcnt->size; ++i)
{
printf("%-8s%-6s%-6d%-13s%s\n", pcnt->pCont[i].name,
pcnt->pCont[i].sex,
pcnt->pCont[i].age,
pcnt->pCont[i].tel,
pcnt->pCont[i].address);
}
}
void ClearContact(Contact* pcnt)
{
printf("是否确定清除通讯录<Y/N>:>");
fflush(stdin); //清除上一次的\n
char ch = getchar();
if (ch == 'N' || ch == 'n')
{
printf("清除通讯录取消....\n");
return;
}
else if (ch == 'Y' || ch == 'y')
{
pcnt->size = 0;
printf("清除通讯录成功....\n");
return;
}
printf("输入错误.....\n");
}
void SortContact(Contact* pcnt)
{
for (int i = 0; i < pcnt->size - 1; ++i)
{
for (int j = 0; j < pcnt->size - i - 1; ++j)
{
if (strcmp(pcnt->pCont[j].name, pcnt->pCont[j + 1].name) > 0)
{
PersonInfo tmp = pcnt->pCont[j];
pcnt->pCont[j] = pcnt->pCont[j + 1];
pcnt->pCont[j + 1] = tmp;
}
}
}
printf("排序成功.\n");
}
void DestroyContact(Contact* pcnt)
{
free(pcnt->pCont);
pcnt->pCont = NULL;
pcnt->capacity = pcnt->size = 0;
}
int FindByName(Contact* pcnt, char Name[])
{
for (int i = 0; i < pcnt->size; i++)
{
if (strcmp(pcnt->pCont[i].name, Name) == 0)
return i;
}
return -1;
}
?
部分调试界面:?
?
?
?
|