C语言实现通讯录管理系统(简易版)

C语言实现通讯录管理系统(简易版),第1张

C语言实现通讯录管理系统(简易版)

实现一个通讯录:

通讯录可以用来存储个人信息,当通讯录空间已满时,可以自动扩充通讯录的存储空间,每个人的信息包括:姓名、性别、年龄、电话、住址。

提供方法:

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 
#include
#include

#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%sn", 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%sn", "姓名", "性别", "年龄", "电话", "地址");
	for (int i = 0; i < pcnt->size; ++i)
	{
		printf("%-8s%-6s%-6d%-13s%sn", 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("是否确定清除通讯录:>");
	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;
}

 

部分调试界面: 

 

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5693701.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存