C语言中通讯录的实现

目录

<1 实现通讯录的那些功能

<3 主函数的建立

<3 通讯录功能的具体实现步骤

<4 全部代码的呈现

1 实现通讯录的那些功能

实现一个通讯录;

通讯录可以用来存储个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

提供方法:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人

2  主函数的建立

 先打印出菜单,选择需要执行的指令,同时利用枚举来实现指令的选择,使其更加方便;

 利用老套路,do while  循环里嵌套switch case语句来实现多组循环;

3.1:创建一个通讯录,存放个人信息

  创建一个结构体struct peroinfo,用来存放个人信息,再创建一个结构体struct contact,来表示通讯录内存放的多个 个人信息,同时利用#define宏定义个人信息结构体每个元素的大小,方便修改;

3.2 初始化通讯录(利用malloc,申请动态内存空间)

创建通讯录struct contact  con      初始化通讯录,初始化函数initcontact(&con);

通过初始化函数initcontact实现申请动态内存空间,减少非必要的内存浪费,用多少申请多少,如果不够,可通过realloc追加内存;(在此函数中,max_size为3,可通过宏定义随时更改初始化时通讯录的大小capacity)

3.3 添加联系人信息到通讯录中

             添加函数addcontact(&con)    判断是否追加内存空间函数  cheak_capacity(pc)     

 我初始化通讯录时只开辟三个人的个人信息空间,当通讯录成员没超过3个时,不需要追加,当超过是,利用追加内存空间函数cheak_capacity(pc) 来追加内存空间(主要利用realoc函数),所以添加联系人信息时,需要判断是否追加内存空间。

3.4 删除通讯录中指定联系人信息

        删除函数delcontact(&con)             寻找指定联系人函数 fine_contact(pc,name)

 想要删除指定联系人,首先需要找到指定联系人,此时通过寻找指定函数fine_contact(pc,name)(其中name表示用姓名查找,也可以换成其他,例如年龄,性别等)然后通过循环将指定删除对象的后面个人信息覆盖到前面,这样就形成了删除指定联系人

3.5 查找指定联系人信息

       查找函数  seekcontact(&con)         寻找指定联系人函数 fine_contact(pc,name)

 想要查找指定联系人信息,此时,可以调用寻找指定联系人函数 fine_contact(pc,name)(同样,其中name表示用姓名查找,也可以换成其他,例如年龄,性别等)找到指定联系人之后,打印出来

3.6修改指定联系人信息

修改函数   molcontact(&con)           寻找指定联系人函数 fine_contact(pc,name)

 想要修改指定联系人信息,同样还是需要先指定联系人,此时可以调用寻找指定联系人函数 fine_contact(pc,name)(同样,其中name表示用姓名查找,也可以换成其他,例如年龄,性别等)找到指定联系人后,对其进行修改,重新输入姓名,性别,年龄等;

3.7  显示通讯录中所有联系人信息

        显示函数  discontact(&con)         

显示所有通讯录中联系人的信息,为了整齐好看,可以先打印出一个表头,来表示联系人信息的种类,主要利用 \t  水平制表符让其更整齐,然后通过循环来打印通讯录中的所有联系人的信息,

3.8   清空通讯录中的所有信息

    清空函数   empcontact(&con)

 

通过memset函数来将其通讯录中的个人信息全部置为0;

3.9  排序通讯录中联系人的信息

     排序函数sortcontact(&con)

 利用qsort函数来排序通讯录中的联系人信息,在此我分别以姓名和年龄排序,也可以用号码,地址等排序,毕竟qsort可以排序各种类型的数据;

3.10  退出通讯录

  退出函数   sign_outcontact(&con)

 既然退出通讯录,那么需要销毁通讯录所申请的动态内存空间,通过free函数来释放通讯录中联系人的信息,同时将其他元素置为0;

4  全部代码的呈现

                                                             放在1.c中

#define _CRT_SECURE_NO_WARNINGS 1
#include "txl.h"
void menu()
{
	printf("*************************************\n");
	printf("**********1.add    2.del*************\n");
	printf("**********3.seek   4.mod*************\n");
	printf("**********5.dis    6.emp*************\n");
	printf("**********7.sort   0.end*************\n");
	printf("*************************************\n");
}
enum input
{
	end,
	add,
	del,
	seek,
	mod,
	dis,
	emp,
	sort,
};
int main()
{
	int input = 0;
	struct contact con;
	//初始化通讯录
	initcontact(&con);

	do
	{
		menu();
		printf("请输入要执行的指令\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			addcontact(&con);
			break;
		case 2:
			delcontact(&con);
			break;
		case 3:
			seekcontact(&con);
			break;
		case 4:
			molcontact(&con);
			break;
		case 5:
			discontact(&con);
			break;
		case 6:
			empcontact(&con);
			break;
		case 7:
			sortcontact(&con);
			break;
		case 0:
			sign_outcontact(&con);
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);

	return 0;
}

                                                 放在txl.c中

#define _CRT_SECURE_NO_WARNINGS 1
#include "txl.h"
//初始化通讯录
void initcontact(struct contact* pc)
{
	pc->date =( struct peroinfo* )malloc(max_size * sizeof(struct peroinfo));
	if (pc->date == NULL)
	{
		return;
	}
	pc->sz = 0;
	pc->capacity = max_size;
}


//添加联系人
int cheak_capacity(struct contact* pc)//判断是否需要追加内存空间
{
	if (pc->sz == pc->capacity)
	{
		struct peroinfo* ptr =realloc(pc->date, (pc->capacity + 2) * sizeof(struct peroinfo));
		if (ptr != NULL)
		{
			pc->date = ptr;
			pc->capacity += 2;
			printf("增容成功\n");
			return 1;
		}
		else
		{
			return 0;

		}
	}
	else
		return 1;
}
void addcontact(struct contact* pc)
{
	assert(pc);
	if (0 == cheak_capacity(pc))
	{
		return;
	}
	printf("请输入姓名:");
	scanf("%s", pc->date[pc->sz].name);

	printf("请输入性别:");
	scanf("%s", pc->date[pc->sz].sex);

	printf("请输入年龄:");
	scanf("%d", &pc->date[pc->sz].age);

	printf("请输入号码:");
	scanf("%s", pc->date[pc->sz].number);

	printf("请输入地址:");
	scanf("%s", pc->date[pc->sz].addre);

	pc->sz++;
	printf("成功添加联系人\n");
}


//删除联系人
int fine_contact(struct contact* pc, char*name)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->date[i].name, name))
		{
			return i;
		}
	}
	return -1;
}
void delcontact(struct contact* pc)
{
	char name[max_name];
	printf("请输入要删除的联系人姓名:");
	scanf("%s", &name);
	int ret = fine_contact(pc,name);
	if (-1 == ret)
	{
		printf("通讯录查无此人,无法删除\n");
	}
	else
	{
		int i = 0;
		for (i = ret; i < pc->sz - 1; i++)
		{
			pc->date[i] = pc->date[i + 1];
		}
		pc->sz--;
		printf("成功删除联系人\n");
	}
}

//查找联系人
void seekcontact(struct contact* pc)
{
	char name[max_name];
	printf("请输入要查找的联系人姓名:");
	scanf("%s", &name);
	int ret = fine_contact(pc, name);
	if (-1 == ret)
	{
		printf("通讯录查无此人\n");
	}
	else
	{
		printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n", "姓名", "性别", "年龄", "号码", "地址");
		printf("%-10s\t%-10s\t%-10d\t%-10s\t%-10s\t\n", pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].number, pc->date[ret].addre);

	}

}

//修改指定联系人
void molcontact(struct contact* pc)
{
	char name[max_name];
	printf("请输入要修改的联系人姓名:");
	scanf("%s", &name);
	int ret = fine_contact(pc, name);
	if (-1 == ret)
	{
		printf("通讯录查无此人,无法修改\n");
	}
	else
	{
		printf("请输入姓名:");
		scanf("%s", pc->date[ret].name);

		printf("请输入性别:");
		scanf("%s", pc->date[ret].sex);

		printf("请输入年龄:");
		scanf("%d", &pc->date[ret].age);

		printf("请输入号码:");
		scanf("%s", pc->date[ret].number);

		printf("请输入地址:");
		scanf("%s", pc->date[ret].addre);
		printf("修改成功\n");
	}
}


//打印通讯录
void discontact(struct contact* pc)
{
	int i = 0;
	printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t\n", "姓名", "性别", "年龄", "号码", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s\t%-10s\t%-10d\t%-10s\t%-10s\t\n", pc->date[i].name, pc->date[i].sex, pc->date[i].age, pc->date[i].number, pc->date[i].addre);
	}
}


//清空通讯录
void empcontact(struct contact* pc)
{
	pc->sz = 0;
	memset(pc->date, 0, (pc->capacity) * sizeof(struct peroinfo));
		pc->capacity = max_size;

}


//排序通讯录联系人
//按姓名排序;
//int cmp_name(const void* e1, const void* e2)
//{
//	return ((struct peroinfo*)e1)->name  - ((struct peroinfo*)e2)->name ;
//}
//void sortcontact(struct contact* pc)
//{
//	qsort(pc->date, pc->sz, sizeof(struct peroinfo), cmp_name);
//}

//按年龄排序:
int cmp_age(const void* e1, const void* e2)
{
	return ((struct peroinfo*)e1)->age - ((struct peroinfo*)e2)->age;
}
void sortcontact(struct contact* pc)
{
	qsort(pc->date, pc->sz, sizeof(struct peroinfo), cmp_age);
}


//退出通讯录,销毁申请的动态内存空间
void sign_outcontact(struct contact* pc)
{
	pc->capacity = 0;
	pc->sz = 0;
	free(pc->date);
	pc->date = NULL;
}

                                                     放在txl.h中

#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#define max_size 3
#define max_name 10
#define max_sex 5
#define max_number 10
#define max_addre 10
struct peroinfo//姓名、性别、年龄、电话、住址
{
	char name[max_name];
	char sex[max_sex];
	int age;
	char number[max_number];
	char addre[max_addre];
};

struct contact
{
	struct peroinfo* date;//表示指向每一个存放个人信息的结构体指针;
	int sz;//表示通讯录中多少个 个人信息;
	int capacity;//表示向内存申请的多大内存空间,例如,我只存一个人的信息,capaticy=1;
	//则申请的空间大小为malloc(1* sizeof(struct peroinfo)
};

//初始化通讯录
void initcontact(struct contact* pc);
//添加通讯录信息
void addcontact(struct contact* pc);
//删除联系人
void delcontact(struct contact* pc);
//查找联系人
void seekcontact(struct contact* pc);
//修改指定联系人
void molcontact(struct contact* pc);
//打印通讯录
void discontact(struct contact* pc);
//清空通讯录
void empcontact(struct contact* pc);
//排序通讯录联系人
void sortcontact(struct contact* pc);
//退出通讯录,销毁申请的动态内存空间
void sign_outcontact(struct contact* pc);

 至此,这是我对C语言如何实现通讯录的全部理解,如有不足之处,请各位指正!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值