C语言实现通讯录

实现一个通讯录

我们利用realloc动态内存开辟来实现通讯录,这样就可以存储无数个人的信息,每个人的信息包括: 
姓名、性别、年龄、电话、住址

提供功能:

1.增加联系人

2.删除联系人

3.修改联系人

4.查找联系人

5.显示联系人

6.排序联系人

7.清空联系人

8.以文件保存

思路分析:

  1. 首先我们可以分三个模块来解决这个问题,第一个模块我们需要一个头文件,这个头文件里可以包含一些相应信息,当实现文件和测试文件包含自己定义的头文件时便可以获得一些相关的信息。所以头文件里应该包括一个结构体,这个结构体里应包含姓名,性别,年龄,电话,住址。同时还可以定义一个结构体,这个结构体里包含通讯录,同时通讯录里人员的计数变量,以及当前容量,将通讯录的地址传到别的地方便可以实现对它遍历或者其他操作。
  2. 第二个模块便是我们的测试函数,测试函数便可以实现我们的菜单打印,同时由我们接收不同的值便可以实现不同的操作,就是相应的方法的实现,这里很明显可以通过一个switch语句来进行控制。
  3. 第三个模块便是我们的方法实现的函数,将模块2里定义的类型为通讯录的地址传到各个方法里,这样便可以实现对通讯录的操作。

Contact.h头文件

#ifndef __CONTACT_H__
#define __CONTACT_H__

#include 
#include 
#include 
#include 
#include 
#include 

#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 11
#define DEFAULT_SZ 1
#define DEFAULT_INC 1
enum
{
	EXIT,
	ADD,
	DEL,
	MODIFY,
	SEARCH,
	SHOW,
	SORT,
	EMPTY,
	SAVE,
};
typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;

typedef struct Contact 
{
	//PeoInfo  data[MAX];
	PeoInfo  *data;  //动态内存开辟
	int sz;
	int capacity;  //用来维护动态内存开辟的容量
}Contact,*pContact;

void InitContact(pContact p);
void AddContact(pContact p);
void DelContact(pContact p);
void ModifyContact(pContact p);
void SearchContact(pContact p);
void EmptyContact(pContact p);
void DestroyContact(pContact p);
//void SortInfo(pContact p);
void Sort_Name(pContact p);

void LoadContact(pContact p);
void SaveContact(pContact p);

void ShowContact(const pContact p);
static int Find(pContact p);
#endif  //__CONTACT_H__

test.c测试文件

#define  _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

void menu()
{
	printf("*********************************\n");
	printf("*****       CONTACT         *****\n");
	printf("*****   1.ADD      2.DEL    *****\n");
	printf("*****   3.MODIFY   4.SEARCH *****\n");
	printf("*****   5.SHOW     6.SORT   *****\n");
	printf("*****   7.EMPTY    0.Exit   *****\n");
	printf("*****	8.Save              *****\n");

}
void test()
{	
	int input = 0;
	Contact con;
	InitContact(&con);
	do 
	{
		menu();
		printf("请选择>>>");
		scanf("%d",&input);
		if (input<0 && input>9)
		{
			printf("1234\n");
			perror("选择错误");
		}
		else
		{
			switch (input)
			{
			case EXIT:
				DestroyContact(&con);
				return;
			case ADD:
				AddContact(&con);
				break;
			case DEL:
				DelContact(&con);
				break;
			case MODIFY:
				ModifyContact(&con);
				break;
			case SEARCH:
				SearchContact(&con);
				break;
			case SHOW:
				ShowContact(&con);
				break;
			case SORT:
				Sort_Name(&con);
				break;
			case EMPTY:
				EmptyContact(&con);
				break;
			case SAVE:
				SaveContact(&con);
			}
		}
		
	} while (1);
}

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

contact.c主要函数实现

#define  _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"


int check_capacity(pContact p)
{
	if (p->sz == p->capacity)
	{
		PeoInfo*tmp = realloc(p->data,(p->capacity+DEFAULT_INC)*sizeof(PeoInfo));
		if (tmp != NULL)
		{
			p->data = tmp;
			p->capacity += DEFAULT_INC;
		//	printf("增容成功\n");
		}
		else
		{
			return 1;
		}
	}
	return 0;
}

void LoadContact(pContact p)
{
	FILE *pf = fopen("contact.dat","rb");
	PeoInfo tmp = {0};
	if (pf == NULL)
	{
		perror("open contact fail");
		exit(EXIT_FAILURE);
	}
	while (fread(&tmp,sizeof(PeoInfo),1,pf))
	{
		check_capacity(p);
		p->data[p->sz++] = tmp;
	}
	fclose(pf);
	pf = NULL;
}

void InitContact(pContact p)
{
	assert(p != NULL);
	p->data = (PeoInfo*)malloc(DEFAULT_SZ*sizeof(PeoInfo));
	
	if (p->data == NULL)
	{
		//printf("%s\n",strerror(errno));
		perror("InitContact:malloc");
		exit(EXIT);
	}
	memset(p->data,0,DEFAULT_SZ*sizeof(PeoInfo));
	p->sz = 0;
	p->capacity = DEFAULT_SZ;
	LoadContact(p);
}

void AddContact(pContact p)
{
	if(check_capacity(p))
	{
		return ;
	}
		printf("请输入姓名>>>");
		scanf("%s",p->data[p->sz].name);
		printf("请输入年龄>>>");
		scanf("%d",&(p->data[p->sz].age));
		printf("请输入性别>>>");
		scanf("%s",p->data[p->sz].sex);
		printf("请输入地址>>>");
		scanf("%s",p->data[p->sz].addr);
		printf("请输入电话>>>");
		scanf("%s",p->data[p->sz].tele);
		p->sz++;
		printf("添加成功\n");

}

static int FindEntry(char* c,pContact p)
{
	int i = 0;
	for (i=0;isz;i++)
	{
		if (strcmp(c,p->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void DelContact(pContact p)
{
	char name[NAME_MAX];
	int ret = 0;
	printf("请输入删除人的姓名>>>");
	scanf("%s",name);
	ret = FindEntry(name,p);
	if (ret == -1)
	{
		printf("要删除的人不存在\n");
	}
	else
	{
		int i = 0;
		for (i=ret;isz-1;i++)
		{
			p->data[i] = p->data[i+1];
		}
		p->sz--;
		printf("删除成功\n");
	}
}

void ModifyContact(pContact p)
{
	int ret = 0;
	char name[NAME_MAX];
	printf("请输入修改人的姓名>>>");
	scanf("%s",name);
	ret = FindEntry(name,p);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
	}
	else
	{
		printf("\n\t\tContact\n");
		printf("%5s\t%s\t%2s\t%5s\t%5s\t\n",
			"name","age","sex","addr","tele");
		printf("%5s\t%d\t%3s\t%5s\t%5s\t\n",
			p->data[ret].name,
			p->data[ret].age,
			p->data[ret].sex,
			p->data[ret].addr,
			p->data[ret].tele);
		printf("请输入修改后的姓名>>>");
		scanf("%s",p->data[ret].name);
		printf("请输入修改后的年龄>>>");
		scanf("%d",&(p->data[ret].age));
		printf("请输入修改后的性别>>>");
		scanf("%s",p->data[ret].sex);
		printf("请输入修改后的地址>>>");
		scanf("%s",p->data[ret].addr);
		printf("请输入修改后的电话>>>");
		scanf("%s",p->data[ret].tele);

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

void SearchContact(pContact p)
{
	int ret = 0;
	char name[NAME_MAX];
	printf("请输入查找人的姓名>>>");
	scanf("%s",name);
	ret = FindEntry(name,p);
	if (ret == -1)
	{
		printf("没有该联系人\n");
	}
	else
	{
		printf("\n\t\tContact\n");
		printf("%5s\t%s\t%2s\t%5s\t%5s\t\n",
			"name","age","sex","addr","tele");
		printf("%5s\t%d\t%3s\t%5s\t%5s\t\n",
			p->data[ret].name,
			p->data[ret].age,
			p->data[ret].sex,
			p->data[ret].addr,
			p->data[ret].tele);
	}

}

void ShowContact(const pContact p)
{
	int i = 0;
	//int ret = 0;
	//for (i=0;isz;i++)
	//{
	//	if (p->data[0].name == NULL)
	//	{
	//		 ret = 1;
	//	}
	//}
	//if(ret == 1)
	//{
	//	printf("没有任何联系人");
	//}
	//else
	//{
		printf("\n\t\tContact\n");
		printf("%5s\t%s\t%2s\t%5s\t%5s\t\n",
			"name","age","sex","addr","tele");

		for (i=0;isz;i++)
		{
			printf("%5s\t%d\t%3s\t%5s\t%5s\t\n",
				p->data[i].name,
				p->data[i].age,
				p->data[i].sex,
				p->data[i].addr,
				p->data[i].tele);
		}
	//}
	
}

void EmptyContact(pContact p)
{
	int i = 0;
	if (p->sz == 0)
	{
		printf("没有联系人\n");
	}
	else
	{
		free(p->data);
		p->sz = 0;
		p->capacity = 0;
		p->data = NULL;
		printf("清空成功\n");
	}
}

//void SortContact(char* c,pContact p)
//{
//	int i ,j = 0;
//	PeoInfo  tmp ;
//	for (i=0;isz;i++)
//	{
//		for (j=0;jsz;j++)
//		{
//			if (p->data[j].age < p->data[j+1].age)
//			{
//				tmp = p->data[j];
//				p->data[j] = p->data[j+1];
//				p->data[j+1] = tmp;
//			}
//		}
//	}
//}
//

void Sort_Name(pContact p)   //以名字排序所有联系人
{
	int i = 0;
	int j = 0;
	int flag = 0;
	printf("以名字进行排序(a-->z)\n");
	while(1)
	{
		flag = 0;
		for (j = 0; j < p->sz - 1; j++)
		{
			if (strcmp(p->data[j].name, p->data[j + 1].name)>0)
			{
				PeoInfo tmp =  p->data[j];
				p->data[j] = p->data[j + 1];
				p->data[j + 1] = tmp;
				flag = 1;
			}
		}
		if (flag == 0)
			break;
	}
}

void SaveContact(pContact p)
{
	FILE *pf = fopen("contact.dat","w");
	int i = 0;
	if (pf == NULL)
	{
		perror("open contact fail");
		exit(EXIT_FAILURE);
	}
	for (i=0;isz;i++)
	{
		fwrite(&(p->data[i]),sizeof(PeoInfo),1,pf);
	}
	printf("Save success\n");
	fclose(pf);
	pf = NULL;
}

void DestroyContact(pContact p)
{
	free(p->data);
	p->capacity = 0;
	p->data = NULL;
	p->sz = 0;
}

程序到这就结束了,演示部分小编就不在这里放了,需要的话请自行测试

你可能感兴趣的:(C语言)