通讯录代码编写

前提概要:本代码完全避免了重名现象而无法正确更改或删除联系人信息的问题。

先将代码演示出来:

为了便于讲解,我将代码分为一个头文件部分和两个源文件部分: 

contact.h头文件:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <windows.h>
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
#define MAX 1000
typedef struct PeoInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;
typedef struct Contact
{
	PeoInfo data[MAX];
	int sz;
}Contact;
void InitContact(Contact* pc);
void AddContact(Contact* pc);
void PrintContact(const Contact* pc);
void DelContact(Contact* pc);
void SearchContact(const Contact* pc);
void ModifyContact(Contact* pc);
void SortContact(Contact* pc);

test,c源文件:

#include "contact.h"
void menu()
{
	printf("1.ADD          2.DEL\n");
	printf("3.SEARCH       4.MODIFY\n");
	printf("5.SORT         6.PRINT\n");
	printf("-------->0.EXIT<---------\n");
}
enum option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	PRINT
};
int main()
{
	Contact con;
	int input = 0;
	char eve[10] = {'a'};
	InitContact(&con);
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch(input)
		{
		case EXIT:
			printf("退出通讯录");
			break;
		case ADD:
			AddContact(&con);
			printf("按任意键回车返回");
			scanf("%s",&eve);
			system("cls");
			break;
		case DEL:
			DelContact(&con);
			printf("按任意键回车返回");
			scanf("%s",&eve);
			system("cls");
			break;
		case SEARCH:
			SearchContact(&con);
			printf("按任意键回车返回");
			scanf("%s", &eve);
			system("cls");
			break;
		case MODIFY:
			ModifyContact(&con);
			printf("按任意键回车返回");
			scanf("%s", &eve);
			system("cls");
			break;
		case SORT:
			SortContact(&con);
			printf("按任意键回车返回");
			scanf("%s", &eve);
			system("cls");
			break;
		case PRINT:
			PrintContact(&con);
			printf("按任意键回车返回");
			scanf("%s", &eve);
			system("cls");
			break;
		default:
			printf("输入错误");
			Sleep(1500);
			system("cls");
		}
	} while (input);
	return 0;
}

 接下来是重点,contact.c源文件:

#include "contact.h"
void InitContact(Contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}
void AddContact(Contact* pc)
{
	if (pc->sz == MAX)
	{
		printf("通讯录已满,添加失败\n");
		return;
	}
	printf("请输入姓名:");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("添加成功\n");
}
void PrintContact(const Contact* pc)
{
	int i = 0;
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
		pc->data[i].name,
		pc->data[i].age,
		pc->data[i].sex,
		pc->data[i].tele,
		pc->data[i].addr);
	}
}
static int FindByName(const Contact* pc, char name[], int* p)
{
	int count = 0;
	int i = 0;
	for (i = *p; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			*p = i + 1;
			return i;
		}
	}
	return -1;
}
void DelContact(Contact* pc)
{
	int arr[MAX] = { 0 };
	int k = 0;
	int* p = &k;
	int j = 0;
	int pos = 0;
	int count = 0;
	int input = 0;
	if (pc->sz == 0)
	{
		printf("通讯录为空,无需删除\n");
		return;
	}
	printf("请输入要删除人的姓名:");
	char name[MAX_NAME] = { 0 };
	scanf("%s", name);
	pos = FindByName(pc, name, p);
	if (pos == -1)		
	{
		printf("找不到该联系人\n");
		return;
	}	
	arr[j++] = pos;
	count++;
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
		pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].tele,
		pc->data[pos].addr);
	while (1)
	{
		pos = FindByName(pc, name, p);
		if (pos == -1)
		{
			break;
		}
		arr[j++] = pos;
		count++;
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
	if(count==1)
	{
		for (int i = pos; i < pc->sz - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
		printf("删除成功\n");
	}
	else
	{
		printf("请输入您要删除的联系人所在排数:");
		scanf("%d", &input);
		if (input > count)
		{
			printf("输入有误");
		}
		else
		{
			for (int i = arr[input-1]; i < pc->sz - 1; i++)
			{
				pc->data[i] = pc->data[i + 1];
			}
			pc->sz--;
			printf("删除成功\n");
		}
	}
}
void SearchContact(const Contact* pc)
{
	int k = 0;
	int* p = &k;
	char name[MAX_NAME] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法查找\n");
		return;
	}
	printf("请输入要查找的人的姓名:");
	scanf("%s", name);
	int pos = FindByName(pc, name, p);
	if (pos == -1)
	{
		printf("找不到该联系人\n");
		return;
	}
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
		pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].tele,
		pc->data[pos].addr);
	while (1)
	{
		pos = FindByName(pc, name, p);
		if (pos == -1)
		{
			return;
		}
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}
void ModifyContact(Contact* pc)
{
	int arr[MAX] = { 0 };
	int k = 0;
	int* p = &k;
	int j = 0;
	int pos = 0;
	int count = 0;
	int input = 0;
	int input1 = 0;
	if (pc->sz == 0)
	{
		printf("通讯录为空,无需更改\n");
		return;
	}
	printf("请输入要修改的人的姓名:");
	char name[MAX_NAME] = { 0 };
	scanf("%s", name);
	pos = FindByName(pc, name, p);
	if (pos == -1)
	{
		printf("找不到该联系人\n");
		return;
	}
	arr[j++] = pos;
	count++;
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
		pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].tele,
		pc->data[pos].addr);
	while (1)
	{
		pos = FindByName(pc, name, p);
		if (pos == -1)
		{
			break;
		}
		arr[j++] = pos;
		count++;
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
	if (count == 1)
	{
		printf("您想单个修改还是整体修改\n");
		printf("单个修改请按1,否则请按其他键:");
		scanf("%d", &input1);
		if (input1 == 1)
		{
			do
			{
				system("cls");
				printf("请输入您想修改的部分:\n");
				printf("1.姓名          2.年龄\n");
				printf("3.性别       4.电话\n");
				printf("5.地址       0.返回\n");
				scanf("%d", &input1);
				switch (input1)
				{
				case 0:
					break;
				case 1:
					printf("请输入姓名:");
					scanf("%s", pc->data[pos].name);
					break;
				case 2:
					printf("请输入年龄:");
					scanf("%d", &pc->data[pos].age);
					break;
				case 3:
					printf("请输入性别:");
					scanf("%s", pc->data[pos].sex);
					break;
				case 4:
					printf("请输入电话:");
					scanf("%s", pc->data[pos].tele);
					break;
				case 5:
					printf("请输入地址:");
					scanf("%s", pc->data[pos].addr);
					break;
				default:
					printf("请输入正确选项\n");
					Sleep(1500);
					break;
				}
			} while (input1);
		}
		else
		{
			printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
			printf("请输入姓名:");
			scanf("%s", pc->data[pos].name);
			printf("请输入年龄:");
			scanf("%d", &pc->data[pos].age);
			printf("请输入性别:");
			scanf("%s", pc->data[pos].sex);
			printf("请输入电话:");
			scanf("%s", pc->data[pos].tele);
			printf("请输入地址:");
			scanf("%s", pc->data[pos].addr);
			printf("修改成功\n");
		}
	}
	else
	{
		printf("请输入您要修改的联系人所在排数:");
		scanf("%d", &input);
		if (input > count)
		{
			printf("输入有误");
		}
		else
		{
			system("cls");
			printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
			printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
				pc->data[arr[input - 1]].name, 
				pc->data[arr[input - 1]].age,
				pc->data[arr[input - 1]].sex,
				pc->data[arr[input - 1]].tele,
				pc->data[arr[input - 1]].addr);
			printf("您想单个修改还是整体修改\n");
			printf("单个修改请按1,否则请按其他键:");
			scanf("%d", &input1);
			if (input1 == 1)
			{
				do
				{
					system("cls");
					printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
					printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
						pc->data[arr[input - 1]].name,
						pc->data[arr[input - 1]].age,
						pc->data[arr[input - 1]].sex,
						pc->data[arr[input - 1]].tele,
						pc->data[arr[input - 1]].addr);
					printf("请输入您想修改的部分:\n");
					printf("1.姓名          2.年龄\n");
					printf("3.性别       4.电话\n");
					printf("5.地址       0.返回\n");
					scanf("%d", &input1);
					switch (input1)
					{
					case 0:
						break;
					case 1:
						printf("请输入姓名:");
						scanf("%s", pc->data[arr[input - 1]].name);
						break;
					case 2:
						printf("请输入年龄:");
						scanf("%d", &pc->data[arr[input - 1]].age);
						break;
					case 3:
						printf("请输入性别:");
						scanf("%s", pc->data[arr[input - 1]].sex);
						break;
					case 4:
						printf("请输入电话:");
						scanf("%s", pc->data[arr[input - 1]].tele);
						break;
					case 5:
						printf("请输入地址:");
						scanf("%s", pc->data[arr[input - 1]].addr);
						break;
					default:
						printf("请输入正确选项\n");
						Sleep(1500);
						break;
					}
				} while (input1);
			}
			else
			{
				printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
				printf("请输入姓名:");
				scanf("%s", pc->data[arr[input - 1]].name);
				printf("请输入年龄:");
				scanf("%d", &pc->data[arr[input - 1]].age);
				printf("请输入性别:");
				scanf("%s", pc->data[arr[input - 1]].sex);
				printf("请输入电话:");
				scanf("%s", pc->data[arr[input - 1]].tele);
				printf("请输入地址:");
				scanf("%s", pc->data[arr[input - 1]].addr);
				printf("修改成功\n");
			}
		}
	}
}
void SortContact(Contact* pc)
{
	int i = 0;
	int j = 0;
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法修改\n");
		return;
	}
	for (i = 0; i < pc->sz - 1; i++)
	{
		for (j = 0; j < pc->sz - 1 - i; j++)
		{
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0)
			{
				PeoInfo tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功\n");
}

 首先建立通讯录菜单,然后根据用户的需求执行不同的指令,通讯录的功能大致分为5类:1、增加联系人;2、删除联系人;3、查找联系人;4、改变联系人信息;5、排列联系人信息(根据名字首位大小从大到小进行排序)

联系人的信息大致分为5类:姓名、年龄、性别、电话号码、地址,因此我们要先建立联系人的基本信息,这里可以用结构体来实现:

#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
#define MAX 1000
typedef struct PeoInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

因为联系人信息的结构体在三个文件中都得应用,故将其建立在头文件中,而其他两个源文件只需要将头文件"contact.h"引用就可以了,而联系人的五种信息需要一定的空间,故我们可以将每种信息的空间大小定义出来方便后面代码直接引用,而将结构体用typedef重定义方便后面引用该结构体。

接着就要建立一个结构体用来存放联系人的信息

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

 这里我们在结构体中存放一个PeoInfo结构体的数组,大小就定义为1000(可以存放1000个人的信息),后面为了方便访问联系人的信息,再添加一个整型sz,这样就可以通过sz来间接访问信息了,而这里的结构体嵌套使用其实也就是一种链式结构,后面将通过链式访问来获取联系人信息。为了方便书写,将结构体重命名为Contact。

首先我们执行代码的时候,应当将通讯录内部信息初始化

Contact con;
InitContact(&con);
void InitContact(Contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}

 这里我们先将sz初始化为0,然后通过内存函数memset将通讯录内信息初始化为0

既然我们将空间建立好了,那么我们就可以开始写操作通讯录部分的代码了

void menu()
{
	printf("1.ADD          2.DEL\n");
	printf("3.SEARCH       4.MODIFY\n");
	printf("5.SORT         6.PRINT\n");
	printf("-------->0.EXIT<---------\n");
}
enum option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	PRINT
};
int main()
{
	Contact con;
	int input = 0;
	char eve[10] = {'a'};
	InitContact(&con);
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch(input)
		{
		case EXIT:
			printf("退出通讯录");
			break;
		case ADD:
			AddContact(&con);
			printf("按任意键回车返回");
			scanf("%s",&eve);
			system("cls");
			break;
		case DEL:
			DelContact(&con);
			printf("按任意键回车返回");
			scanf("%s",&eve);
			system("cls");
			break;
		case SEARCH:
			SearchContact(&con);
			printf("按任意键回车返回");
			scanf("%s", &eve);
			system("cls");
			break;
		case MODIFY:
			ModifyContact(&con);
			printf("按任意键回车返回");
			scanf("%s", &eve);
			system("cls");
			break;
		case SORT:
			SortContact(&con);
			printf("按任意键回车返回");
			scanf("%s", &eve);
			system("cls");
			break;
		case PRINT:
			PrintContact(&con);
			printf("按任意键回车返回");
			scanf("%s", &eve);
			system("cls");
			break;
		default:
			printf("输入错误");
			Sleep(1500);
			system("cls");
		}
	} while (input);
	return 0;
}

 首先建立菜单,供用户选择,然后将通讯录的功能枚举出来,然后通过do~while语句编写一个循环结构,供用户反复操作,通过switch语句监视用户的选择。由于上面已经将6项功能(含退出)枚举出来了,因此我们只需要在case后面写相对应的功能就可以了,这样就显得更加直观。而每次用完功能后,为了美观都会清屏然后重新打印菜单,因此我们让用户在执行完一项操作后任意输入一个字符然后回车以回到菜单界面。

接下来就是重头戏contact.c部分,也就是5项功能(不包括退出)的实现:

第一部分是添加联系人部分的函数: 

void AddContact(Contact* pc)
{
	if (pc->sz == MAX)
	{
		printf("通讯录已满,添加失败\n");
		return;
	}
	printf("请输入姓名:");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:");
	scanf("%s", pc->data[pc->sz].tele);
	printf("请输入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("添加成功\n");
}

 首先监测通讯录是否满员了,如果已经保存了1000个人的信息就没有多余的空间存放联系人信息了。

每次添加时会让用户输入联系人的5项信息,然后让sz++,而当sz=MAX(1000)时就不能再存放联系人了。

第二部分是打印联系人信息部分的函数:

void PrintContact(const Contact* pc)
{
	int i = 0;
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
		pc->data[i].name,
		pc->data[i].age,
		pc->data[i].sex,
		pc->data[i].tele,
		pc->data[i].addr);
	}
}

 打印信息没有什么技巧,就是通过链式访问来打印每一个联系人的信息。

第三部分是删除联系人信息部分的函数:

static int FindByName(const Contact* pc, char name[], int* p)
{
	int count = 0;
	int i = 0;
	for (i = *p; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			*p = i + 1;
			return i;
		}
	}
	return -1;
}
void DelContact(Contact* pc)
{
	int arr[MAX] = { 0 };
	int k = 0;
	int* p = &k;
	int j = 0;
	int pos = 0;
	int count = 0;
	int input = 0;
	if (pc->sz == 0)
	{
		printf("通讯录为空,无需删除\n");
		return;
	}
	printf("请输入要删除人的姓名:");
	char name[MAX_NAME] = { 0 };
	scanf("%s", name);
	pos = FindByName(pc, name, p);
	if (pos == -1)		
	{
		printf("找不到该联系人\n");
		return;
	}	
	arr[j++] = pos;
	count++;
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
		pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].tele,
		pc->data[pos].addr);
	while (1)
	{
		pos = FindByName(pc, name, p);
		if (pos == -1)
		{
			break;
		}
		arr[j++] = pos;
		count++;
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
	if(count==1)
	{
		for (int i = pos; i < pc->sz - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
		printf("删除成功\n");
	}
	else
	{
		printf("请输入您要删除的联系人所在排数:");
		scanf("%d", &input);
		if (input > count)
		{
			printf("输入有误");
		}
		else
		{
			for (int i = arr[input-1]; i < pc->sz - 1; i++)
			{
				pc->data[i] = pc->data[i + 1];
			}
			pc->sz--;
			printf("删除成功\n");
		}
	}
}

 首先监测通讯录里面是否有信息,如果没有信息(sz=0)就没有必要删除,然后再让用户输入联系人的姓名,通过FindByName函数查找联系人:

static int FindByName(const Contact* pc, char name[], int* p)
{
	int count = 0;
	int i = 0;
	for (i = *p; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			*p = i + 1;
			return i;
		}
	}
	return -1;
}

通过strcmp函数监测用户输入的联系人是否存在,如果存在则strcmp函数会返回0,如果将通讯录内已有信息全部检测后仍未发现该联系人,则说明该联系人不存在,这里就返回-1,而DelContact函数检测到-1时则会告诉用户不存在该联系人。

而即便该联系人存在,也无法避免出现重名的现象,如果直接删除的话那每次删除的一定是最先找到的那个联系人,因此我们就将第一个找到的联系人的信息打印下了,然后通过while函数循环查找其他同名的联系人

这里我们用k来表示前一次查找到的人的位置,将k值传给指针p,将指针p传给寻找联系人的函数,每次查找到同名的联系人时顺便将k赋值为i+1,这样一来下一次查找同名联系人时就会从上一次查找到的联系人的后面一位开始继续查找,知道把所有同名联系人的姓名都查找出来为止。而我们再将所有联系人的姓名打印出来,让用户自己选择想要删除哪一个人的信息:

这样就完全意义上的解决了重名现象,而且即便重名人的年龄、性别等都一样也没事,因为我们将选择权完全交给了用户。

for (int i = arr[input-1]; i < pc->sz - 1; i++)
{
	pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功\n");

而删除操作我们只需要将需要删除的联系人的那一块覆盖,将预删除联系人后面所有联系人的信息全部往前移动一位就可以了,然后将sz--;这样在查找联系人信息的时候就不会出现该联系人的信息了。

而寻找部分的函数是完全包含于删除函数中的,如果我们遇到了同名现象,只需要将所有同名人的信息全部都打印出来就可以了,因此这里就不多做解释。

void SearchContact(const Contact* pc)
{
	int k = 0;
	int* p = &k;
	char name[MAX_NAME] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法查找\n");
		return;
	}
	printf("请输入要查找的人的姓名:");
	scanf("%s", name);
	int pos = FindByName(pc, name, p);
	if (pos == -1)
	{
		printf("找不到该联系人\n");
		return;
	}
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
		pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].tele,
		pc->data[pos].addr);
	while (1)
	{
		pos = FindByName(pc, name, p);
		if (pos == -1)
		{
			return;
		}
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}

 接下来就是修改联系人信息部分的函数:

void ModifyContact(Contact* pc)
{
	int arr[MAX] = { 0 };
	int k = 0;
	int* p = &k;
	int j = 0;
	int pos = 0;
	int count = 0;
	int input = 0;
	int input1 = 0;
	if (pc->sz == 0)
	{
		printf("通讯录为空,无需更改\n");
		return;
	}
	printf("请输入要修改的人的姓名:");
	char name[MAX_NAME] = { 0 };
	scanf("%s", name);
	pos = FindByName(pc, name, p);
	if (pos == -1)
	{
		printf("找不到该联系人\n");
		return;
	}
	arr[j++] = pos;
	count++;
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
		pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].tele,
		pc->data[pos].addr);
	while (1)
	{
		pos = FindByName(pc, name, p);
		if (pos == -1)
		{
			break;
		}
		arr[j++] = pos;
		count++;
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
	if (count == 1)
	{
		printf("您想单个修改还是整体修改\n");
		printf("单个修改请按1,否则请按其他键:");
		scanf("%d", &input1);
		if (input1 == 1)
		{
			do
			{
				system("cls");
				printf("请输入您想修改的部分:\n");
				printf("1.姓名          2.年龄\n");
				printf("3.性别       4.电话\n");
				printf("5.地址       0.返回\n");
				scanf("%d", &input1);
				switch (input1)
				{
				case 0:
					break;
				case 1:
					printf("请输入姓名:");
					scanf("%s", pc->data[pos].name);
					break;
				case 2:
					printf("请输入年龄:");
					scanf("%d", &pc->data[pos].age);
					break;
				case 3:
					printf("请输入性别:");
					scanf("%s", pc->data[pos].sex);
					break;
				case 4:
					printf("请输入电话:");
					scanf("%s", pc->data[pos].tele);
					break;
				case 5:
					printf("请输入地址:");
					scanf("%s", pc->data[pos].addr);
					break;
				default:
					printf("请输入正确选项\n");
					Sleep(1500);
					break;
				}
			} while (input1);
		}
		else
		{
			printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
			printf("请输入姓名:");
			scanf("%s", pc->data[pos].name);
			printf("请输入年龄:");
			scanf("%d", &pc->data[pos].age);
			printf("请输入性别:");
			scanf("%s", pc->data[pos].sex);
			printf("请输入电话:");
			scanf("%s", pc->data[pos].tele);
			printf("请输入地址:");
			scanf("%s", pc->data[pos].addr);
			printf("修改成功\n");
		}
	}
	else
	{
		printf("请输入您要修改的联系人所在排数:");
		scanf("%d", &input);
		if (input > count)
		{
			printf("输入有误");
		}
		else
		{
			system("cls");
			printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
			printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
				pc->data[arr[input - 1]].name, 
				pc->data[arr[input - 1]].age,
				pc->data[arr[input - 1]].sex,
				pc->data[arr[input - 1]].tele,
				pc->data[arr[input - 1]].addr);
			printf("您想单个修改还是整体修改\n");
			printf("单个修改请按1,否则请按其他键:");
			scanf("%d", &input1);
			if (input1 == 1)
			{
				do
				{
					system("cls");
					printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
					printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
						pc->data[arr[input - 1]].name,
						pc->data[arr[input - 1]].age,
						pc->data[arr[input - 1]].sex,
						pc->data[arr[input - 1]].tele,
						pc->data[arr[input - 1]].addr);
					printf("请输入您想修改的部分:\n");
					printf("1.姓名          2.年龄\n");
					printf("3.性别       4.电话\n");
					printf("5.地址       0.返回\n");
					scanf("%d", &input1);
					switch (input1)
					{
					case 0:
						break;
					case 1:
						printf("请输入姓名:");
						scanf("%s", pc->data[arr[input - 1]].name);
						break;
					case 2:
						printf("请输入年龄:");
						scanf("%d", &pc->data[arr[input - 1]].age);
						break;
					case 3:
						printf("请输入性别:");
						scanf("%s", pc->data[arr[input - 1]].sex);
						break;
					case 4:
						printf("请输入电话:");
						scanf("%s", pc->data[arr[input - 1]].tele);
						break;
					case 5:
						printf("请输入地址:");
						scanf("%s", pc->data[arr[input - 1]].addr);
						break;
					default:
						printf("请输入正确选项\n");
						Sleep(1500);
						break;
					}
				} while (input1);
			}
			else
			{
				printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
				printf("请输入姓名:");
				scanf("%s", pc->data[arr[input - 1]].name);
				printf("请输入年龄:");
				scanf("%d", &pc->data[arr[input - 1]].age);
				printf("请输入性别:");
				scanf("%s", pc->data[arr[input - 1]].sex);
				printf("请输入电话:");
				scanf("%s", pc->data[arr[input - 1]].tele);
				printf("请输入地址:");
				scanf("%s", pc->data[arr[input - 1]].addr);
				printf("修改成功\n");
			}
		}
	}
}

 前面部分和删除函数极为相似,当发现通讯录没有信息的时候就无法修改,当监测不到用户所查找的联系人姓名时也无法修改,而遇到同名的时候则将所有联系人信息都列举出来供用户参考,而该函数最大的优点就是可以对欲修改的联系人的信息选择部分修改还是全部修改,该部分代码如下:

printf("您想单个修改还是整体修改\n");
printf("单个修改请按1,否则请按其他键:");
scanf("%d", &input1);
if (input1 == 1)
{
	do
	{
		system("cls");
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
			pc->data[arr[input - 1]].name,
			pc->data[arr[input - 1]].age,
			pc->data[arr[input - 1]].sex,
			pc->data[arr[input - 1]].tele,
			pc->data[arr[input - 1]].addr);
		printf("请输入您想修改的部分:\n");
		printf("1.姓名          2.年龄\n");
		printf("3.性别       4.电话\n");
		printf("5.地址       0.返回\n");
		scanf("%d", &input1);
		switch (input1)
		{
		case 0:
			break;
		case 1:
			printf("请输入姓名:");
			scanf("%s", pc->data[arr[input - 1]].name);
			break;
		case 2:
			printf("请输入年龄:");
			scanf("%d", &pc->data[arr[input - 1]].age);
			break;
		case 3:
			printf("请输入性别:");
			scanf("%s", pc->data[arr[input - 1]].sex);
			break;
		case 4:
			printf("请输入电话:");
			scanf("%s", pc->data[arr[input - 1]].tele);
			break;
		case 5:
			printf("请输入地址:");
			scanf("%s", pc->data[arr[input - 1]].addr);
			break;
		default:
			printf("请输入正确选项\n");
			Sleep(1500);
			break;
		}
	} while (input1);

如果是部分修改,就先打印修改菜单,让用户选择欲修改的内容,然后通过switch语句监测用户所选择的要修改的部分,然后让用户输入修改的信息即可。如果是全部修改,则让用户将所有信息全部都重新输入一遍即可。

而在修改完成后我们仍然能够继续操作修改,而不用退出该函数后重新进入该函数,极大地减少了代码运行的压力。

最后则是排序函数:

void SortContact(Contact* pc)
{
	int i = 0;
	int j = 0;
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法修改\n");
		return;
	}
	for (i = 0; i < pc->sz - 1; i++)
	{
		for (j = 0; j < pc->sz - 1 - i; j++)
		{
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0)
			{
				PeoInfo tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功\n");
}

 如果没有联系人信息则告诉用户无法修改,否则就根据名字字母首字母进行排序,这里采用的是传统的冒泡排序法。

至此,该通讯录代码就介绍好了!

  • 48
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘家炫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值