实现通讯录(使用动态内存存储)

实现一个通讯录

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

提供方法: 
1. 添加联系人信息 
2. 删除指定联系人信息 
3. 查找指定联系人信息 
4. 修改指定联系人信息 
5. 显示所有联系人信息 
6. 清空所有联系人 

7. 以名字排序所有联系人

头文件Contact.h

#pragma once  
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
enum
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	EMPTY,
	SORT
};
#define MAX_NAME 20  
#define MAX_SEX 5  
#define MAX 2  
#define MAX_NUM 11  
#define GRE 20  
typedef struct PeoInfo
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char num[MAX_NUM];
	char gre[GRE];
}PeoInfo;
typedef struct Contact
{
	PeoInfo *data;
	int count;//当前个数
	int max;//最大容量
}Contact, *pContact;
void InitContact(pContact pc);//通讯录初始化  
void AddContact(pContact pc);// 添加联系人信息  
void DelContact(pContact pc);//删除指定联系人信息   
int SearchContact(char name[], pContact pc);//查找指定联系人信息  
void ModifyContact(pContact pc);//  修改指定联系人信息  
void ShowContact(pContact pc);//    显示所有联系人信息   
void EmptyContact(pContact pc);//清空所有联系人   
void SortContact(pContact pc);//以名字排序所有联系人  
void increase(pContact pc);//增容

各个函数的实现Contact.c

#define _CRT_SECURE_NO_WARNINGS 1  
#include"Contact.h"  
void InitContact(pContact pc)
{
	pc->count = 0;
	pc->max = MAX;
	pc->data = (PeoInfo*)calloc(sizeof(PeoInfo), pc->max);//置0  
}
void increase(pContact pc)
{
	PeoInfo *p = (PeoInfo*)realloc(pc->data, sizeof(PeoInfo)*(pc->max + 2));
	if (p != NULL)
	{
		pc->data = p;
		p = NULL;

	}
	pc->max += 2;	
	printf("增容成功\n");
}
void AddContact(pContact pc)
{
	int i = 0;
	if (pc->count == pc->max)
	{
		printf("通讯录已满\n");
		printf("是否增容\n");
		printf("请选择:》\n");
		printf("1 增容 2 不增容\n");
		scanf("%d", &i);
		if (i == 1)
		{
			increase(pc);
		}
		else
		{
			printf("空间已满\n");;
			return;
		}
	}
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->count].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->count].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->count].num);
	printf("请输入住址:>");
	scanf("%s", pc->data[pc->count].gre);
	pc->count++;
}
void DelContact(pContact pc)
{
	char name[MAX_NAME] = { 0 };
	int i = 0;
	int j = 0;
	if (pc->count == 0)
	{
		printf("通讯录是空的\n");
		return;
	}
	//删除  
	printf("输入要删除的人名字");
	scanf("%s", name);
	i = SearchContact(name, pc);
	if (i == -1)
	{
		printf("没有找到这个人");
	}
	for (j = i; j < pc->count - 1; j++)
	{
		pc->data[j] = pc->data[j + 1];
	}
	pc->count--;
}
int SearchContact(char name[], pContact pc)
{
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		if (strcmp((pc->data[i].name), name) == 0);
		{
			printf("%d\n", i);
			return i;
		}
	}
	return -1;
}
void ModifyContact(pContact pc)
{
	int i = 0;
	char name[MAX_NAME] = { 0 };
	if (pc->count == 0)
	{
		printf("通讯录为空");
		return;
	}
	printf("请输入要修改的人名字");
	scanf("%s", name);
	i = SearchContact(name, pc);
	if (i == -1)
	{
		printf("没有找到这个人\n");
	}
	else
	{
		printf("输入名字:>");
		scanf("%s", pc->data[i].name);
		printf("输入年龄:>");
		scanf("%d", &(pc->data[i].age));
		printf("输入性别:>");
		scanf("%s", pc->data[i].sex);
		printf("输入手机号:>");
		scanf("%s", pc->data[i].num);
		printf("输入地址:>");
		scanf("%s", pc->data[i].gre);
	}
}
void ShowContact(pContact pc)
{
	int i = 0;
	if (pc->count == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	for (i = 0; i<pc->count; i++)
	{
		printf("%s %d %s %s %s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].num, pc->data[i].gre);
	}
	printf("-----------------------------\n");
}
void EmptyContact(pContact pc)
{
	pc->count = 0;
	memset(pc->data, 0, sizeof(pc->data));//置0  
	printf("已经清除成功\n");
}
void SortContact(pContact pc)
{
	int i = 0;
	int j = 0;
	PeoInfo tmp;
	if (pc->count == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	for (i = 0; i < pc->count - 1; i++)//对名字进行冒泡排序  
	{
		for (j = 0; j < pc->count - i - 1; j++)
		{
			if ((strcmp((pc->data[j].name), pc->data[j + 1].name)) > 0)
			{
				tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}
}

主函数main.c

#define _CRT_SECURE_NO_WARNINGS 1  
#pragma once  
#include<stdio.h>  
#include"Contact.h"  
void menu()
{
	printf("**************************\n");
	printf("******1.add     2.del*****\n");
	printf("******3.sea     4.mod*****\n");
	printf("******5.show    6.emp*****\n");
	printf("******7.sort   0.exit*****\n");
	printf("**************************\n");
}
int main()
{
	int input = 0;
	Contact my_con;
	char name[MAX_NAME] = { 0 };
	InitContact(&my_con);
	do
	{
		menu();
		printf("请选择你的操作:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&my_con);
			break;
		case DEL:
			DelContact(&my_con);
			break;
		case SEARCH:
		{
					   printf("输入要查找的名字\n");
					   scanf("%s", name);
					   SearchContact(name, &my_con);
					   break;
		}
		case MODIFY:
			ModifyContact(&my_con);
			break;
		case SHOW:
			ShowContact(&my_con);
			break;
		case EMPTY:
			EmptyContact(&my_con);
			break;
		case SORT:
			SortContact(&my_con);
		}
	} while (input);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/CHR_1s/article/details/80452021