实现一个通讯录:

通讯录可以用来存储1000个人的信息,每个人的信息包括:

姓名、性别、年龄、电话、住址

提供方法:

1.添加联系人信息

2.删除指定联系人信息

3.查找指定联系人信息

4.修改指定联系人信息

5.显示所有联系人信息

6.清空所有联系人

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

建立一个源文件phone.h和两个头文件main.c,hanshu.c来实现

代码如下:

源文件phone.h如下:

#ifndef __PHONE_H__
#define __PHONE_H__

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 1000
#define NAME 10
#define SEX 5
#define PHONE 12
#define ADDRESS 20

enum OP
{
	EXIT,
	ADD,
	DELETE,
	FIND,
	CHANGE,
	SHOW,
	EMPTY,
	NAME_SORT,
};

typedef struct linkman
{
	char name[NAME];
	char sex[SEX];
	int age;
	char phone[PHONE];
	char address[ADDRESS];
}link;

typedef struct Phonebook
{
	link linkman[MAX];
	int count;
}Phonebook, *Pho;//Pho为指针类型

void init(Pho phobook);
void add(Pho phobook);
void delete(Pho phobook);
void find(Pho phobook);
void change(Pho phobook);
void show(Pho phobook);
void empty(Pho phobook);
void name_sort(Pho phobook);

#endif

头文件mian.c如下:

#include"phone.h"
#include<stdlib.h>

void menu()
{
	printf("\n\t\t*************简易通讯录*************\n");
	printf("\t\t\t    1.添加联系人信息\n");
	printf("\t\t\t    2.删除指定联系人信息\n");
	printf("\t\t\t    3.查找指定联系人信息\n");
	printf("\t\t\t    4.修改指定联系人信息\n");
	printf("\t\t\t    5.显示所有联系人信息\n");
	printf("\t\t\t    6.清空所有联系人\n");
	printf("\t\t\t    7.以名字排序所有联系人\n");
	printf("\t\t\t    8.退出系统\n");
}

int main()
{
	Phonebook phob;
	int input=1;
	init(&phob);
	while (input)
	{
		menu();
		printf("请输入你要选择的序号>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD: add(&phob);break;//添加
		case DELETE: delete(&phob); break;//删除
		case FIND: find(&phob); break;//查找
		case CHANGE:change(&phob); break;//修改
		case SHOW: show(&phob); break;//显示
		case EMPTY: empty(&phob); break;//清空
		case NAME_SORT:name_sort(&phob); break;//名字排序
		case EXIT:
			printf("感谢使用!"); system("pause"); return 0;
		default:
			printf("序号输入错误,请重新输入>"); break;
		}
	}
	system("pause");
	return 0;
}

头文件hanshu.c如下:

#include"phone.h"
//由于删除或查找或修改联系人都需要判断是否存在该联系人,所以设置一个静态函数判断联系人是否存在
static int search_linkman(Pho phobook, const char *name)
{
	for (int i = 0; i < (phobook->count); i++)
	{
		if (0 == strcmp(name, (phobook->linkman[i]).name))
		{
			return i;
		}
	}
	return -1;
}

void init(Pho phobook)
{
	phobook->count = 0;
}

void add(Pho phobook)//通讯录中添加联系人
{
	if ((phobook->count) > MAX)
	{
		printf("通讯录容量已满,不能再添加!");
		return;
	}
	printf("请输入要添加的联系人姓名>");
	scanf("%s", (phobook->linkman)->name);
	printf("请输入要添加的联系人性别>");
	scanf("%s", (phobook->linkman)->sex);
	printf("请输入要添加的联系人年龄>");
	scanf("%d", &(phobook->linkman)->age);
	printf("请输入要添加的联系人电话>");
	scanf("%s", (phobook->linkman)->phone);
	printf("请输入要添加的联系人地址>");
	scanf("%s", (phobook->linkman)->address);
	printf("\n添加成功\n");
	(phobook->count)++;
}

void delete(Pho phobook)
{
	char nam[10];
	int ret = 0;
	if ((phobook->count) <= 0 || (phobook->count) > MAX)
	{
		printf("此通讯录中没有此联系人!\n");
	}
	printf("请输入联系人的姓名>");
	scanf("%s", &nam);
	ret = search_linkman(phobook, nam);
    if (ret != -1)
	{
		for (int j = ret; j < (phobook->count-1); j++)
		{
			phobook->linkman[j]=phobook->linkman[j+1];
		}
		(phobook->count)--;
		printf("删除成功!\n");
	}
    else printf("此通讯录中没有此联系人!\n");
}

void find(Pho phobook)
{
	char nam[10];
	int ret = 0;
	if ((phobook->count) <= 0 || (phobook->count) > MAX)
	{
		printf("此通讯录中没有此联系人!\n");
		return;
	}
	printf("请输入联系人的姓名>");
	scanf("%s", &nam);
	ret = search_linkman(phobook, nam);
	if (ret != -1)
	{
		printf("你查找的联系人信息为:\n");
		printf("---------姓名:%s\n", phobook->linkman[ret].name);
		printf("---------性别:%s\n", phobook->linkman[ret].sex);
		printf("---------年龄:%d\n", phobook->linkman[ret].age);
		printf("---------电话:%s\n", phobook->linkman[ret].phone);
		printf("---------地址:%s\n\n", phobook->linkman[ret].address);
	}
	else printf("没有找到你要查找的联系人!\n");
}

void change(Pho phobook)
{
	char nam[10];
	int ret = 0;
	if ((phobook->count) <= 0 || (phobook->count) > MAX)
	{
		printf("此通讯录中没有此联系人!\n");
		return;
	}
	printf("请输入联系人的姓名>");
	scanf("%s", &nam);
	ret = search_linkman(phobook, nam);
	if (ret != -1)
	{
		printf("请输入联系人新的姓名>");
		scanf("%s", (phobook->linkman[ret]).name);
		printf("请输入联系人新的性别>");
		scanf("%s", (phobook->linkman[ret]).sex);
		printf("请输入联系人新的年龄>");
		scanf("%d", &(phobook->linkman[ret]).age);
		printf("请输入联系人新的电话号码>");
		scanf("%s", (phobook->linkman[ret]).phone);
		printf("请输入联系人新的地址>");
		scanf("%s", (phobook->linkman[ret]).address);
		printf("修改成功\n");
	}
	else printf("此通讯录中此联系人不存在!\n");
}

void show(Pho phobook)
{
	if ((phobook->count) == 0)
	{
		printf("该通讯录中没有联系人!\n");
	}
	else
	{
		printf("***********该通讯录中所有人信息如下>\n");
		printf("%10s\t%5s\t%3s\t%10s\t%10s\t\n","姓名","性别","年龄","电话号码","地址");
		for (int i = 0; i < phobook->count; i++)
		{
			printf("%10s\t%5s\t%3d\t%10s\t%10s\t",(phobook->linkman[i]).name,
				(phobook->linkman[i]).sex, (phobook->linkman[i]).age, 
				(phobook->linkman[i]).phone, (phobook->linkman[i]).address);
		}
	}
}

void empty(Pho phobook)
{
	if ((phobook->count) == 0)
		printf("此通讯录中没有联系人!\n");
	else
	{
		(phobook->count) = 0;
		printf("清空成功!\n");
	}
}

void name_sort(Pho phobook)//冒泡排序通讯录中所有联系人
{
	int i = 0, j = 0;
	int k = phobook->count;
	if ((phobook->count) == 0)
	{
		printf("此通讯录中没有联系人!\n");
		return;
	}
	for (i = 0; i < (phobook->count) - 1; i++)
	{
		for (j = 0; j < (phobook->count) - i - 1; j++)
		{
			if (strcmp((phobook->linkman[j]).name, (phobook->linkman[j+1]).name)>0)
			{
				link temp = phobook->linkman[j];
				phobook->linkman[j] = phobook->linkman[j+1];
				phobook->linkman[j+1] = temp;
			}
		}
	}
}