结构体 静态通讯录的实现

通讯录可以存储500个人的信息; 包括:姓名,年龄,性别,地址,电话号码。

功能包括联系人的添加,查看,删除,查找,修改,排序,清空。

//头文件contact.h
#ifndef __CONTACT_H__ 
#define __CONTACT_H__ 

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

#define MAX 500//最多存储500个联系人
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12 

typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;//struct PeoInfo a; <=> PeoInfo a;

typedef struct Contact
{
	PeoInfo data[MAX];
	int sz;
}Contact, *pContact;

//函数声明
int find(pContact pcon, char *name1);//查找函数
void InitContact(pContact pcon);//初始化
void AddContact(pContact pcon);//添加
void ShowContact(const pContact pcon);//浏览
void DelContact(pContact pcon);//删除
void SearchContact(pContact pcon);//查找
void ModifyContact(pContact pcon);//修改
void SortContach(pContact pcon);//排序
void ClearContact(pContact pcon);//清空

#endif

//函数实现功能contact.c
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
void InitContact(pContact pcon)//对1000个联系人及联系人的个数初始化
{
	pcon->sz = 0;
	memset(pcon->data, 0, sizeof(pcon->data));
}
void AddContact(pContact pcon)//添加
{
	int ret = 1;
	assert(pcon);//断言,用于检验是否为NULL,便于调试,
	             //若函数错误的接受了一个NULL参数,程序就会停止,并打印出提示信息;
	             //若表达式为真(非零),它不会打印任何东西,程序继续执行。
	do
	{
		if (pcon->sz == MAX)
		{
			printf("内存已满,无法添加\n");
			return;
		}
		printf("请输入名字:) ");
		scanf("%s", pcon->data[pcon->sz].name);
		printf("请输入年龄:) ");
		scanf("%d", &pcon->data[pcon->sz].age);
		printf("请输入性别:) ");
		scanf("%s", pcon->data[pcon->sz].sex);
		printf("请输入地址:) ");
		scanf("%s", pcon->data[pcon->sz].addr);
		printf("请输入电话:) ");
		scanf("%s", pcon->data[pcon->sz].tele);
		pcon->sz++;
		printf("\n保存成功!\n");
		printf("是否继续添加,继续选择1,结束选择0:) ");
		scanf("%d", &ret);
		while (ret != 0 && ret != 1)
		{
			printf("选择错误!请重新选择:) ");
			scanf("%d", &ret);
		}
	} while (ret);
}
void ShowContact(const pContact pcon)//浏览所有联系人
{
	int i = 0;
	assert(pcon);
	printf("%8s\t%8s\t%8s\t%8s\t%8s\n", "name", "age", "sex", "addr", "tele");
	for (i = 0; i < pcon->sz; i++)
	{
		printf("%8s\t", pcon->data[i].name);
		printf("%8d\t", pcon->data[i].age);
		printf("%8s\t", pcon->data[i].sex);
		printf("%8s\t", pcon->data[i].addr);
		printf("%8s\n", pcon->data[i].tele);
	}
}

int find(pContact pcon,char *name1)//查找函数,如果找到返回联系人所在的排名,否则返回-1
{
	int i = 0;
	assert(pcon);
	assert(name1);
	for (i = 0; i < pcon->sz; i++)
	{
		if (strcmp(pcon->data[i].name, name1) == 0)
		{
			return i;
		}
	}
	return -1;
}
void DelContact(pContact pcon)//删除
{
	int ret = 0;
	int find_name;
	int i = 0;
	char name1[20];
	assert(pcon);
	do
	{
		printf("请输入姓名:) ");
		scanf("%s", name1);
		find_name = find(pcon, name1);
		if (find_name != -1)
		{
			for (i = find_name; i < pcon->sz; i++)
				pcon->data[i] = pcon->data[i + 1];//后一个人信息覆盖到前一个
			pcon->sz--;
			printf("删除成功\n");
		}
		if (find_name == -1)
			printf("没找到要删除的人\n");
		printf("是否继续删除,继续选择1,结束选择0:) ");
		scanf("%d", &ret);
		while (ret != 0 && ret != 1)
		{
			printf("选择错误!请重新选择:) ");
			scanf("%d", &ret);
		}
	} while (ret);
}
void SearchContact(pContact pcon)//查找联系人
{
	int ret = 0;
	int find_name = 0;
	char name1[20];
	assert(pcon);
	do
	{
		printf("请输入名字:) ");
		scanf("%s", name1);
		find_name = find(pcon, name1);
		if (find_name != -1)
		{
			printf("\n");
			printf("姓名:%s\n", pcon->data[find_name].name);
			printf("年龄:%d\n", pcon->data[find_name].age);
			printf("性别:%s\n", pcon->data[find_name].sex);
			printf("地址:%s\n", pcon->data[find_name].addr);
			printf("电话:%s\n", pcon->data[find_name].tele);
		}
		else
			printf("没有找到此人\n");
		printf("是否继续查找,继续选择1,结束选择0:) ");
		scanf("%d", &ret);
		while (ret != 0 && ret != 1)
		{
			printf("选择错误!请重新选择:) ");
			scanf("%d", &ret);
		}
	} while (ret);
}
void ModifyContact(pContact pcon)//修改信息
{
	int ret = 0;
	int find_name = 0;
	char name1[20];
	assert(pcon);
	do
	{
		printf("请输入名字:) ");
		scanf("%s", name1);
		find_name = find(pcon, name1);
		if (find_name != -1)
		{
			printf("\n");
			printf("请输入修改后的姓名:");
			scanf("%s", pcon->data[find_name].name);
			printf("请输入修改后的年龄:");
			scanf("%d", &pcon->data[find_name].age);
			printf("请输入修改后的性别:");
			scanf("%s", pcon->data[find_name].sex);
			printf("请输入修改后的地址:");
			scanf("%s", pcon->data[find_name].addr);
			printf("请输入修改后的电话:");
			scanf("%s", pcon->data[find_name].tele);
		}
		else
			printf("没有找到此人\n");
		printf("是否继续修改,继续选择1,结束选择0:) ");
		scanf("%d", &ret);
		while (ret != 0 && ret != 1)
		{
			printf("选择错误!请重新选择:) ");
			scanf("%d", &ret);
		}
	} while (ret);
}
void SortContach(pContact pcon)//对联系人按姓名排序
{
	int i = 0;
	int j = 0;
	assert(pcon);
	printf("姓名从A-Z的顺序为:\n");
	for (i = 0; i < pcon->sz; i++)
	{
		for (j = 0; j < pcon->sz - i - 1; j++)
		{
			if (strcmp(pcon->data[j].name, pcon->data[j + 1].name)>0)
			{
				PeoInfo tmp;
				tmp = pcon->data[j];
				pcon->data[j] = pcon->data[j + 1];
				pcon->data[j + 1] = tmp;
			}
		}
	}
	ShowContact(pcon);
}
void ClearContact(pContact pcon)//清空联系人
{
	int ret = 0;
	assert(pcon);
	printf("确定清空?确定选择1,取消选择0:) ");
	scanf("%d", &ret);
	if (ret == 1)
	{
		pcon->sz = 0;
		memset(pcon->data, 0, sizeof(pcon->data));
		printf("删除成功\n");
	}
	while (ret != 0 && ret != 1)
	{
		printf("选择错误!请重新选择:) ");
		scanf("%d", &ret);
	}
}

//测试test.c
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
void menu()//菜单
{
	printf("\n\n\n");
	printf("******************************************\n");
	printf("***********1.add       2.show  ***********\n");
	printf("***********3.del       4.search***********\n");
	printf("***********5.modefiy   6.sort  ***********\n");
	printf("***********7.clear     0.exit  ***********\n");
	printf("******************************************\n");
}
enum//枚举
{
	EXIT,//0.退出
	ADD,//1.添加
	SHOW,//2.浏览
	DEL,//3.删除
	SEARCH,//4.查找
	MODIFY,//5.修改
	SORT,//6.排序
	CLEAR,//7.清空
};
void test()
{
	int input = 0;
	Contact my_con;
	InitContact(&my_con);
	do
	{
		menu();
		printf("\nPlease input your choice:) ");
		scanf("%d", &input);
		switch (input)
		{
		case ADD://添加联系人
			AddContact(&my_con);
			break;
		case SHOW://浏览联系人
			ShowContact(&my_con);
			break;
		case DEL://删除联系人
			DelContact(&my_con);
			break;
		case SEARCH://查找联系人
			SearchContact(&my_con);
			break;
		case MODIFY://修改联系人
			ModifyContact(&my_con);
			break;
		case SORT://按姓名排序联系人
			SortContach(&my_con);
			break;
		case CLEAR://清空联系人
			ClearContact(&my_con);
			break;
		default:
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值