简单实现通讯录

实现通讯录

1.分3个文件实现

1.1contact.h(主要包含函数实现的一些头文件和声明)

在编译器中创建一个头文件contact.h,这个文件主要包括一些库函数头文件的引用,结构体的创建,还有一些枚举和define 定义的一些常量。

1.2contact.c(功能函数实现)

这个文件主要包括一些实现通讯录功能的函数的编写和一些其他的辅助函数

1.3test.c(包含主函数)

这个文件包括主函数,我把菜单的打印也放在了这个文件中,还有一些选择通讯录功能的switch语句

2.开始之前的准备工作

2.1声明储存联系人的结构体


typedef struct PeoInfo
{
	char name[NAME];
	int age;
	char sex[SEX];
	char tele[TELE];
	char adress[ADRESS];
}PeoInfo;
typedef struct contact
{
	int sz;
	PeoInfo* data;
	int contact;
}contact;

2.3创建通讯录

Init_contact(&con);//初始化通讯录

2.3初始化通讯录

创建一个函数初始化通讯录

void Init_contcat(contact* pc)
{
	pc->sz = 0;
	pc->contact = SIZE;
	pc->data = (PeoInfo*)malloc(pc->contact * sizeof(PeoInfo));//动态开辟空间
	if (pc->data  == NULL)//当动态空间开辟不成功时报错
	{
		perror(malloc);
	}
	memset(pc->data, 0, pc->contact* sizeof(PeoInfo));
}

3.通讯录的基本功能实现(由各部分的函数实现)

3.1添加联系人Add

开辟动态空间,当空间不足时,增容,可以更有效的利用空间

void Increase_contact(contact* pc)//当空间不足时增容
{
	if (pc->sz == pc->contact)
	{
		PeoInfo* tmp = (PeoInfo*)realloc(pc->data, sizeof(PeoInfo) * (pc->contact + 2));
		if (tmp == NULL)
		{
			perror(realloc);
			return;
		}
		else
		{
			pc->data = tmp;
		}
		pc->contact += 2;
		printf("增容成功\n");
	}
}

添加联系人的函数

void Add_contact(contact* pc)//添加联系人
{
	/*if (pc->sz == MAX)
	{
		printf("通讯录已满,添加失败\n");
	}*/
	Increase_contact(pc);
	printf("请输入名字\n");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入性别\n");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入年龄\n");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入地址\n");
	scanf("%s", pc->data[pc->sz].adress);
	printf("请输入电话\n");
	scanf("%s", pc->data[pc->sz].tele);
	pc->sz++;
	printf("添加成功\n");
}

3.2删除联系人Delete

先写一个比较函数

int Is_by_name(contact* pc, char* name[])
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (0 == srcmp(pc->data->name, name))
		{
			return i;
		}
	}
	return -1;
}

然后是Delete_contact函数

void Delete_contact(contact* pc)
{
	printf("输入要删除联系人的名字:>\n");
	char name[20];
	scanf("%s", name);
	int len=Is_by_name(pc, name);
	if (pc->sz == 0)
	{
		printf("通讯录已空无法删除\n");
		return;
	}
	if (len == -1)
	{
		printf("查无此人\n");
		return;
	}
	else
	{
		for (int i = len; i < pc->sz; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
		printf("删除成功\n");
	}
	
}

3.3搜索联系人Search

搜索联系人并且将搜索到的联系人打印,这里就需要上面写的Is_by_name函数

void Search_contact(contact* pc)
{
	printf("输入要搜索联系人的姓名:>\n");
	char name[20];
	scanf("%s", name);
	int len = Is_by_name(pc, name);
	if (-1==len)
	{
		printf("查无此人\n");
	}
	else
	{
		printf(" % 10s\t % 4s\t % 5s\t % 12s\t % 20s\n", "姓名", "性别", "年龄", "电话", "住址");
		printf(" % 10s\t % 4s\t % 5d\t % 12s\t % 20s\n",
			pc->data [len].name ,
			pc->data [len].sex ,
			pc->data [len].age ,
			pc->data [len].tele ,
			pc->data [len].adress );
	}
}

3.4修改联系人Modify

void Modify_contact(contact* pc)
{
	printf("输入需要修改的联系人:>\n;");
	char name[20];
	scanf("%s", name);
	int len=Is_by_name(pc, name);
	rintf("请输入名字:>\n");
	scanf("%s", pc->data[len].name );
	printf("请输入性别:>\n");
	scanf("%s", pc->data [len].sex );
	printf("请输入年龄:>\n");
	scanf("%d", &pc->data[len].age );
	printf("请输入电话:>\n");
	scanf("%s", pc->data[len].tele );
	printf("请输入住址:>\n");
	scanf("%s", pc->data ->adress );
	printf("修改成功\n");
}

3.5打印联系人Print

void Print_contact(contact* pc)
{
	printf(" % 10s\t % 4s\t % 5s\t % 12s\t % 20s\n", "姓名", "性别", "年龄", "电话", "住址");
	for (int i = 0; i < pc->sz; i++)
	{
		printf(" % 10s\t % 4s\t % 5d\t % 12s\t % 20s\n",
			pc->data[i].name,
			pc->data[i].sex,
			pc->data[i].age,
			pc->data[i].tele,
			pc->data[i].adress);
	}
}

3.6让联系人以某种方式排序Sort

这里用了qsort

int cmp_by_name(const void* e1, const void* e2)
{
	return strcmp((const char*)e1, (const char*)e2);
}
void Sort_contact(contact* pc)
{
	qsort(pc->data->name , pc->sz, sizeof(PeoInfo), cmp_by_name);
}

3.7退出通讯录Exit,并且销毁

释放开辟的动态空间

void Destory_contact(contact* pc)
{
	free(pc);
	pc->contact = 0;
	pc->sz = 0;
	pc->data = NULL;
	printf("销毁成功\n");

3.8菜单Menu

void Menu()
{
	printf("**************************\n");
	printf("*** 1.Add    2.Delete  ***\n");
	printf("*** 3.Search 4.Modify  ***\n");
	printf("*** 5.Print  6.Sort*******\n");
	printf("***      0.Exit     ******\n");
	printf("**************************\n");
}
void test()
{
	contact con;
	Init_contact(&con);//初始化通讯录
	int input = 0;
	do
	{
		Menu();
		printf("输入你的选择:>\n");
		scanf("%d", &input);
		
		switch (input)
		{
		case Add:
			Add_contact(&con);//添加联系人
			printf("%d", con.sz);
			break;
		case Delete:
			Delete_contact(&con);//删除联系人
			break;
		case Search:
			Search_contact(&con);//搜索联系人
			break;
		case Modify:
			Modify_contact(&con);//修改联系人
			break;
		case Print:
			Print_contact(&con);//打印联系人
			break;
		case Sort:
			Sort_contact(&con);//排序
			break;
		case Exit:
			Destory_contact(&con);//销毁通讯录
			printf("退出\n");
			break;
		default:
			printf("输入错误\n");
			break;
 
		}
	} while (input);
}

4.全部代码

contact.h

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>


#define SIZE 3
#define NAME 20
#define SEX 5
#define TELE 14
#define ADRESS 30

typedef struct PeoInfo
{
	char name[NAME];
	int age;
	char sex[SEX];
	char tele[TELE];
	char adress[ADRESS];
}PeoInfo;
typedef struct contact
{
	int sz;
	PeoInfo* data;
	int contact;
}contact;

enum
{
	Exit,
	Add,
	Delete,
	Search,
	Modify,
	Print,
	Sort,
};

void Init_contact(contact* pc);
void Add_contact(contact* pc);
void Delete_contact(contact* pc);
void Search_contact(contact* pc);
void Modify_contact(contact* pc);
void Print_contact(contact* pc);
void Sort_contact(contact* pc);
void Destory_contact(contact* pc);

contact.c

#define  _CRT_SECURE_NO_WARNINGS

#include"contact.h"

void Init_contact(contact* pc)
{
	pc->sz = 0;
	pc->contact = SIZE;
	pc->data = (PeoInfo*)malloc(pc->contact * sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		perror(malloc);
	}

	memset(pc->data, 0, pc->contact * sizeof(PeoInfo));
}
void Increase_contact(contact* pc)
{
	if (pc->sz == pc->contact)
	{
		PeoInfo* tmp = (PeoInfo*)realloc(pc->data, sizeof(PeoInfo) * (pc->contact + 2));
		if (tmp == NULL)
		{
			perror(tmp);
			return;
		}
		else
		{
			pc->data = tmp;
		}
		pc->contact += 2;
		printf("增容成功\n");
	}
}
void Add_contact(contact* pc)//添加联系人
{
	/*if (pc->sz == MAX)
	{
		printf("通讯录已满,添加失败\n");
	}*/
	Increase_contact(pc);
	printf("请输入名字\n");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入性别\n");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入年龄\n");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入地址\n");
	scanf("%s", pc->data[pc->sz].adress);
	printf("请输入电话\n");
	scanf("%s", pc->data[pc->sz].tele);
	pc->sz++;
	printf("添加成功\n");
}
int Is_by_name(contact* pc, char name[])//查找要的联系人
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}
void Delete_contact(contact* pc)
{
	printf("输入要删除联系人的名字:>\n");
	char name[20];
	scanf("%s", name);
	int len=Is_by_name(pc, name);
	if (pc->sz == 0)
	{
		printf("通讯录已空无法删除\n");
		return;
	}
	if (len == -1)
	{
		printf("查无此人\n");
		return;
	}
	else
	{
		for (int i = len; i < pc->sz; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
		printf("删除成功\n");
	}
	
}
void Search_contact(contact* pc)
{
	assert(pc);
	char name[20];
	printf("输入你要查找的联系人的名字\n");
	scanf("%s", name);
	int ret = Is_by_name(pc, name);
	if (-1 == ret)
	{
		printf("查无此人\n");
		return;
	}
	else
	{
		printf("%10s\t%4s\t%5s\t%12s\t%20s\n", "姓名", "性别", "年龄", "电话", "住址");
		printf("%10s\t%4s\t%5d\t%12s\t%20s\n",
			pc->data[ret].name,
			pc->data[ret].sex,
			pc->data[ret].age,
			pc->data[ret].tele,
			pc->data[ret].adress);
	}


	return;
}
void Modify_contact(contact* pc)
{
	printf("输入需要修改的联系人:>\n;");
	char name[20];
	scanf("%s", name);
	int len=Is_by_name(pc, name);
	rintf("请输入名字:>\n");
	scanf("%s", pc->data[len].name );
	printf("请输入性别:>\n");
	scanf("%s", pc->data [len].sex );
	printf("请输入年龄:>\n");
	scanf("%d", &pc->data[len].age );
	printf("请输入电话:>\n");
	scanf("%s", pc->data[len].tele );
	printf("请输入住址:>\n");
	scanf("%s", pc->data ->adress );
	printf("修改成功\n");
}
void Print_contact(contact* pc)
{
	printf(" % 10s\t % 4s\t % 5s\t % 12s\t % 20s\n", "姓名", "性别", "年龄", "电话", "住址");
	for (int i = 0; i < pc->sz; i++)
	{
		printf(" % 10s\t % 4s\t % 5d\t % 12s\t % 20s\n",
			pc->data[i].name,
			pc->data[i].sex,
			pc->data[i].age,
			pc->data[i].tele,
			pc->data[i].adress);
	}
}
int cmp_by_name(const void* e1, const void* e2)
{
	return strcmp((const char*)e1, (const char*)e2);
}
void Sort_contact(contact* pc)
{
	qsort(pc->data->name , pc->sz, sizeof(PeoInfo), cmp_by_name);
}
void Destory_contact(contact* pc)
{
	free(pc);
	pc->contact = 0;
	pc->sz = 0;
	pc->data = NULL;
	printf("销毁成功\n");
}

test.c

#define  _CRT_SECURE_NO_WARNINGS


#include"contact.h"


void Menu()
{
	printf("**************************\n");
	printf("*** 1.Add    2.Delete  ***\n");
	printf("*** 3.Search 4.Modify  ***\n");
	printf("*** 5.Print  6.Sort*******\n");
	printf("***      0.Exit     ******\n");
	printf("**************************\n");
}
void test()
{
	contact con;
	Init_contact(&con);//初始化通讯录
	int input = 0;
	do
	{
		Menu();
		printf("输入你的选择:>\n");
		scanf("%d", &input);
		
		switch (input)
		{
		case Add:
			Add_contact(&con);//添加联系人
			printf("%d", con.sz);
			break;
		case Delete:
			Delete_contact(&con);//删除联系人
			break;
		case Search:
			Search_contact(&con);//搜索联系人
			break;
		case Modify:
			Modify_contact(&con);//修改联系人
			break;
		case Print:
			Print_contact(&con);//打印联系人
			break;
		case Sort:
			Sort_contact(&con);//排序
			break;
		case Exit:
			Destory_contact(&con);//销毁通讯录
			printf("退出\n");
			break;
		default:
			printf("输入错误\n");
			break;
 
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值