通讯录的制作

目录

1.通讯录的头文件 

2.通讯录的逻辑

3.通讯录的实现


1.通讯录的头文件 

contest.h

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX 1000
#define MAX_NAME 10
#define MAX_SEX 10
#define MAX_TEL 15
#define MAX_ADDR 20

#define	MAX_CAPACITY 3


 //类型的声明
//人的类型,封装成一个结构体

 

typedef struct peoinfo
{
	char name[MAX_NAME]; //   名字
	int  age;             //年龄
	char sex[MAX_SEX];   //性别
	char tel[MAX_TEL];  //电话
	char addr[MAX_ADDR];  //地址
}peoinfo;


//静态版本
//通讯录的声明 ,封装成一个结构体
//typedef struct contest
//{
//	 peoinfo date[MAX];  //通讯录中可以存储的人数
//
//	 int count; //通讯录中实际的人数
//
//}contest;



//动态版本
typedef struct contest
{
	peoinfo* date;  //通讯录中可以存储的人数

	int count; //通讯录中实际的人数

	int capacity; //通讯里中最大容量
}contest;





//初始化通讯录
void initcontest(contest* pc );  //地址用结构体指针来接收

//通讯录的加法
void addcontest(contest* pc); 

//通讯录的打印
void showcontest(contest* pc);

//通讯录的减法
void delcontest(contest* pc);

//通讯录的查找
void searchcontest(contest* pc);

//通讯录的修改
void modifycontest(contest* pc);

//排序通讯录
void sortcontest(contest* pc);

//释放通讯录
void freecontest(contest* pc);

2.通讯录的逻辑

test.c

#include"contest.h"


void menu()
{
	printf("********  1.add        2.del      **********\n");
	printf("********  3.search     4.modify   **********\n");
	printf("********  5.show       6.sort     **********\n");
	printf("********  0.exit                  **********\n");
}


void test()
{
	int input = 0;

	contest con;  //创建一个通讯录变量
	initcontest(&con);  //初始化通讯录,通讯录是一个结构体要传地址

	do
	{
		menu();
		printf("请输入选择的数字>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			addcontest(&con);
			break;
		case 2:
			delcontest(&con);
			break;
		case 3:
			searchcontest(&con);
			break;
		case 4:
			modifycontest(&con);
			break;
		case 5:
			showcontest(&con);
			break;
		case 6:
			sortcontest(&con);
			break;
		case 0:
			//动态内存开辟的话最后要释放空间
			freecontest(&con);
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}

	} while (input);

}


int main()
{
	test();
	return 0;
}

3.通讯录的实现

contest.c

#include"contest.h"


//静态版本
//初始化通讯录
//void initcontest(contest* pc)
//{
//	pc->count = 0;  //通讯录中实际上放的人初始化为0
//	
//	memset(pc->date,0,sizeof(pc->date)); 
//
//	//memset(首地址,值,sizeof(地址总大小));
//	//    
//	//pc->date,是一个数组,数组名是首元素的地址 
//	//sizeof(数组名)是整个数组的大小
//}


//动态版本
void initcontest(contest* pc)
{
	pc->count = 0;  //通讯录中实际上放的人初始化为0

	pc->capacity = MAX_CAPACITY;  //通讯录最大容量为3,这个可以自定义

	//给通讯录开辟空间
	pc->date = (peoinfo*)malloc(pc->capacity * sizeof(peoinfo));
	//容量乘以一个人的信息,开辟一个字节个数,3容量乘以一个人信息,得到的是3个人的信息,

	if (pc->date==	NULL)//如果得到空指针则开辟失败要返回错误
	{
		perror("initcontest::malloc");
	}

	memset(pc->date,0, pc->capacity * sizeof(peoinfo));
	//把这里面的数初始化成0
	
}



//静态版本
// 
通讯录的加法
//void addcontest(contest* pc)
//{
//	if (pc->count == MAX)
//	{
//		printf("通讯录已满,无法添加\n");
//	}
//
//	printf("请输入名字>");
//	scanf("%s", pc->date[pc->count].name);   
//	//count作为date的下标,当date没人的时候count是里面0
//	//当date里面有一个人的时候,把这个人放在下标为count  0的下标里面,再放入的时候date里面有2个人
//	//他的下标就是count里的1 ,count可以作为date的下标使用
//	printf("请输入年龄>");
//	scanf("%d", &(pc->date[pc->count].age));  //int 是整形,要用%d来打印,需要取地址,别的是arr数组,首元素就是地址
//
//	printf("请输入性别>");
//	scanf("%s", pc->date[pc->count].sex);
//
//	printf("请输入电话>");
//	scanf("%s", pc->date[pc->count].tel);
//
//	printf("请输入地址>");
//	scanf("%s", pc->date[pc->count].addr);
//
//	pc->count++;
//	printf("添加成功\n");
//}




void checkaddtest(contest* pc)
{
	if (pc->capacity == pc->count)
		//扩容的时候每次加2个
	{
		peoinfo* tmp = (peoinfo*)realloc(pc->date, (pc->capacity + 2) * sizeof(peoinfo));
		 
		if (tmp != NULL)
		{
			pc->date = tmp;
		}
		pc->capacity = pc->capacity+2;
		printf("增容成功\n");
	}
}





//动态版本
//通讯录的加法
void addcontest(contest* pc)
{
     
	checkaddtest(pc);

	printf("请输入名字>");
	scanf("%s", pc->date[pc->count].name);
	//count作为date的下标,当date没人的时候count是里面0
	//当date里面有一个人的时候,把这个人放在下标为count  0的下标里面,再放入的时候date里面有2个人
	//他的下标就是count里的1 ,count可以作为date的下标使用
	printf("请输入年龄>");
	scanf("%d", &(pc->date[pc->count].age));  //int 是整形,要用%d来打印,需要取地址,别的是arr数组,首元素就是地址

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

	printf("请输入电话>");
	scanf("%s", pc->date[pc->count].tel);

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

	pc->count++;
	printf("添加成功\n");
}



//释放通讯录
void freecontest(contest* pc)
{
	pc->count = 0;
	pc->capacity = 0;
	free(pc->date);
	pc->date = NULL;
	printf("销毁成功\n");
}



//通讯录的打印实现
void showcontest(contest* pc)
{

	//首先遍历一下已经存的人数
	int i = 0;

	printf("%20s %5s %10s %15s %20s\n", "姓名", "年龄", "性别","电话","地址");
	for (i = 0; i < pc->count; i++)
	{
		printf("%20s %5d %10s %15s %20s\n", pc->date[i].name, pc->date[i].age, pc->date[i].sex
			, pc->date[i].tel, pc->date[i].addr);
	}
}



//查找函数
int findcontest(contest* pc,char name[])
{
	//首先遍历一下已经存的人数
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		//看看通讯录中有没有名字一样的人数
		if (0 == strcmp(pc->date[i].name, name))
		{
			return i;   //有的话返回下标
		}
		return -1;
	}

}


//通讯录减法的实现
void delcontest(contest* pc)
{
	char name[MAX_NAME] = { 0 };
	if (pc->count == 0)
	{
		printf("通讯录为空\n");
	}

	//1.查找
	printf("请输入要删除人的名字");
	scanf("%s", name);

	int pos = findcontest(pc,name);

	if (pos == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//2.删除
	int j = 0;
	for (j = 0; j < pc->count-1; j++)
		//容量是1000,如果是pc->count,那么j最大是999,下面要+1,会造成越界
		//pc->count-1的话,j最大是998,下面加一是999,容量是1000不会越界
	{
		pc->date[j] = pc->date[j + 1];
	}
	pc->count--;
	printf("删除成功\n");
}


//通讯录的查找

void searchcontest(contest* pc)
{
	//1.查找
	char name[MAX_NAME] = { 0 };

	if (pc->count == 0)
	{
		printf("通讯录为空\n");
	}

	printf("请输入要查找人的名字");
	scanf("%s", name);

	int pos = findcontest(pc, name);

	if (pos == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	printf("%20s %5s %10s %15s %20s\n", "姓名", "年龄", "性别", "电话", "地址");

	printf("%20s %5d %10s %15s %20s\n", pc->date[pos].name, pc->date[pos].age, pc->date[pos].sex
		, pc->date[pos].tel, pc->date[pos].addr);
	
}


//通讯录修改的实现
void modifycontest(contest* pc)
{
	//1.查找
	char name[MAX_NAME] = { 0 };

	if (pc->count == 0)
	{
		printf("通讯录为空\n");
	}

	printf("请输入要修改人的名字");
	scanf("%s", name);

	int pos = findcontest(pc, name);

	if (pos == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	//2.修改

	printf("请输入名字>");
	scanf("%s", pc->date[pos].name);

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

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

	printf("请输入电话>");
	scanf("%s", pc->date[pos].tel);

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

	
	printf("修改成功\n");

}



int cmp_sort(const void* e1, const void* e2)
{
	return strcmp(((peoinfo*)e1)->name, ((peoinfo*)e2)->name);
}

//排序通讯录
void sortcontest(contest* pc)
{
	//用qsort函数
	qsort(pc->date,pc->count,sizeof(peoinfo),cmp_sort);
	//地址,元素个数,元素大小,比较函数
	printf("排序成功\n");
}

这就是一个完整的通讯录实现啦

谢谢大家的观看!!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值