【C语言】实现通讯录(详解)

一.前言

本文将会用c语言实现一个通讯录的系统,并且存储若干人的信息,每个人的信息包括:姓名,性别,年龄,电话号码,住址。此通讯录系统的功能包括: 1.增加联系人 2.删除对应的联系人 3.查找联系人 4.修改联系人的信息 5.排序此通讯录 6.打印出通讯录每个人的信息

二.实现代码

1.0 前期准备:

具体框架设计:
 

//菜单选择
void my_switch(int op, AL* my_al) {
	switch (op) {
	case 1:
		//增加联系人信息
		expansion(my_al);
		op_add(my_al);
		break;
	case 2:
		//删除联系人信息
		delete(my_al);
		break;
	case 3:
		//修改联系人信息
		modify(my_al);
		break;
	case 4:
		date_find(my_al);
		//查找联系人信息
		break;
	case 5:
		//显示所有联系人
		print_exit(my_al);
		break;
	case 6:
		date_sort(my_al);
		break;
	default:
		printf("\033[32m你的选择错误,请重新选择!\033[0m\r\n\n");
		break;
	}
}
int main() {
	SL my_sl;
	AL my_al;
	//初始化通讯录
	init_address(&my_al);
	//菜单
	int op = -1;
	do {
		menu();
		scanf("%d", &op);
		system("cls");
		my_switch(op, &my_al);
	} while (op);
	system("cls");
	printf("正在退出");
	printf("\033[32;5m...\033[0m\r\n");
	free(&my_al);

	return 0;
}

1.1 类型与结构体定义:

人的信息包括:姓名,性别,年龄,电话号码,住址。故需定义结构体以及顺序表记录联系人信息

typedef struct address_list {
	char name[NAME_MAX];//名字
	int age;//年龄
	char gender[GENDER_MAX];//性别
	char addr[ADDR_MAX];//地址
	char tele[TELE_MAX];//电话号码
}SL;
typedef struct sql {
	SL* date;//联系人信息
	int storage_max;//最大存储大小
	int storage_real;//实际存储大小
}AL;

1.2 菜单:

菜单能够实现和用户的交互。因此我们需要建立一个菜单,并且菜单应该包括通讯录该有的功能,以便于用户的操作

//主菜单
void menu() {
	printf("********** \033[32m通讯录\033[0m **********\n");
	printf("***** 1.增加联系人信息 *****\n");
	printf("***** 2.删除联系人信息 *****\n");
	printf("***** 3.修改联系人信息 *****\n");
	printf("***** 4.查找联系人信息 *****\n");
	printf("***** 5.显示所有联系人 *****\n");
	printf("***** 6.自动排序       *****\n");
	printf("***** 0.退出通讯录     *****\n\n");
	printf("\033[32;5m请选择:\033[0m");
}

运行结果:

1.3 初始化顺序表:

//初始化通讯录
void init_address(AL* ptr) {
	ptr->date = NULL;
	ptr->storage_max = ptr->storage_real = 0;
}

1.4 全局变量的定义:

为了方便后期的处理数组大小,所以我们可以利用宏来实现这个功能

#define NAME_MAX 100//联系人姓名最大长度
#define ADDR_MAX 100//联系人地址最大长度
#define GENDER_MAX 10//联系人性别最大长度
#define TELE_MAX 12//联系人电话号码最大长度

2.0 功能分化(拆分功能)

2.1 增加联系人:

这个我们只需要访问通讯录结构体的每个元素然后输入对应值就可以了

2.1.1 菜单:
void menu_add() {
	printf("\033[32m增加联系人模式:\033[0m\r\n");
	printf("\n");
	printf("****** 1.增加联系人信息(前增)******\n");
	printf("****** 2.增加联系人信息(后增)******\n");
	printf("****** 3.增加联系人信息(指定)******\n");
	printf("****** 0.返回上一步            ******\n\n");
	printf("\033[32;5m请选择:\033[0m");
}

运行: 

2.1.2 注意:

在增加前需判断前面申请的顺序表空间是否满足需求,及在不满足时如何处理

//扩容
void expansion(AL* ptr) {
	if (ptr->storage_max == ptr->storage_real) {
		int storage_new = ptr->storage_max == 0 ? sizeof(AL) : 2 * ptr->storage_max;
		SL* tmp = (SL*)realloc(ptr->date, storage_new);
		if (tmp == NULL) {
			perror("realloc fail!");
			exit(1);
		}
		ptr->date = tmp;
		ptr->storage_max = storage_new;

	}
}
2.1.3 功能实现:
//联系人信息的输入
void add_arbitrarily(AL* ptr, int position) {
	printf("请输入联系人姓名:\n");
	scanf("%s", ptr->date[position].name);
	printf("请输入联系人年龄:\n");
	scanf("%d", &(ptr->date[position].age));
	printf("请输入联系人性别:\n");
	scanf("%s", ptr->date[position].gender);
	printf("请输入联系人电话号码:\n");
	scanf("%s", ptr->date[position].tele);
	printf("请输入联系人地址:\n");
	scanf("%s", ptr->date[position].addr);
	system("cls");
	printf("\033[32m保存成功!\033[0m\r\n\n");
}
//增加通讯录信息(后增)
void add_back(AL* ptr) {
	add_arbitrarily(ptr, ptr->storage_real);
	ptr->storage_real += 1;
}
//前增
void add_front(AL* ptr) {
	ptr->storage_real += 1;
	for (int i = (ptr->storage_real) - 1; i > 0; i--) {
		ptr->date[i] = ptr->date[i - 1];
	}
	add_arbitrarily(ptr, 0);
}
//增加模式选择
void op_add(AL* my_al) {
A:
	menu_add();
	int op = -1;
	scanf("%d", &op);
	switch (op) {
	case 1:
		system("cls");
		add_front(my_al);
		break;
	case 2:
		system("cls");
		add_back(my_al);
		break;
	case 3:
		printf("请输入您希望存入的位置:\n");
		int position = -1;
		scanf("%d", &position);
		add_arbitrarily(my_al, position);
		break;
	case 0:
		system("cls");
		printf("\033[32m已返回上一步!\033[0m\r\n\n");
		break;
	default:
		system("cls");
		printf("\033[32;5m你的选择错误,请重新选择!\033[0m\r\n");
		goto A;
		break;
	}
}

运行:

 

2.2 删除对应的联系人:

删除联系人分两种方式:序号和姓名

//删除通讯录信息
void delete(AL* ptr) {
	if (ptr->storage_real == 0) {
		printf("\033[32m通讯录中还未存储联系人信息,请先增加联系人\033[0m\r\n\n");
		goto G;
	}
F:
	printf("\033[32m删除联系人信息:\033[0m\r\n");
	printf("\n");
	printf("*** 1.输入序号删除联系人 ***\n");
	printf("*** 2.输入姓名删除联系人 ***\n");
	printf("*** 0.返回上一步         ***\n\n");
	printf("\033[32;5m请选择:\033[0m");
	int op = -1;
	scanf("%d", &op);
	system("cls");
	switch (op) {
	case 1://序号
	C:
		printf("\033[32m输入序号删除联系人:(若想退出该模式,请输入0)\033[0m\r\n\n");
		printf("\033[32;5m请输入您希望删除的联系人序号:\033[0m\r\n\n");
		int num = -1;
		scanf("%d", &num);
		if (num > 0 && num <= ptr->storage_real)
		{
			ptr->storage_real -= 1;
			for (int i = num - 1; i < ptr->storage_real; i++) {
				ptr->date[i] = ptr->date[i + 1];
			}
			system("cls");
			printf("\033[32m保存成功!\033[0m\r\n\n");
		}
		else {
			system("cls");
			if (num == 0) {
				printf("\033[32m已退出删除联系人模式\033[0m\r\n\n");
				break;
			}
			printf("\033[32m通讯录中无该联系人!\033[0m\r\n\n");
			goto C;
		}
		break;
	case 2://姓名
	D:
		printf("\033[32m输入姓名删除联系人:\033[0m\r\n\n");
		printf("\033[32;5m请输入您希望删除的联系人姓名:\033[0m\r\n");
		char arr[NAME_MAX];
		scanf("%s", &arr);
		for (int i = 0; i < ptr->storage_real; i++) {
			if (strcmp(arr, ptr->date[i].name) == 0) {
				ptr->storage_real -= 1;
				for (int j = i; j < ptr->storage_real; j++) {
					ptr->date[i] = ptr->date[i + 1];
				}
				system("cls");
				printf("\033[32m保存成功!\033[0m\r\n\n");
				break;
			}
			else {
				if (i == ptr->storage_real - 1) {
					system("cls");
					printf("\033[32m通讯录中无该联系人!\033[0m\r\n");
					printf("\n");
					goto D;
				}
			}
		}
		break;
	case 0://退出
		printf("\033[32m已退出删除联系人模式\033[0m\r\n");
		break;
	default:
		printf("\033[32m你的选择错误,请重新选择!\033[0m\r\n");
		goto F;
		break;
	}
G:;
}

2.3 查找联系人:

分两思路:姓名,电话号码

//查找通讯录信息
void date_find(AL* ptr) {
	K:
	printf("\033[32m查找联系人信息\033[0m\r\n\n");
	printf("*** 1.输入姓名查找联系人信息 ***\n");
	printf("*** 2.输入电话号码查找联系人 ***\n");
	printf("*** 0.退出查找联系人模式 ***\n");
	int op = -1;
	scanf("%d", &op);
	system("cls");
	switch (op) {
	case 1://姓名
		printf("\033[32m输入姓名查找联系人信息\033[0m\r\n\n");
		printf("\033[32;5m请输入要查找联系人的姓名:\033[0m\r\n");
		char arr1[NAME_MAX];
		scanf("%s", &arr1);
		system("cls");
		for (int i = 0; i < ptr->storage_real; i++) {
			if (strcmp(arr1, ptr->date[i].name)==0) {
				print(ptr, i);
				break;
			}
			else {
				if (i == ptr->storage_real-1) {
					printf("\033[32m通讯录中无该联系人!\033[0m\r\n\n");
				}
			}
		}
		printf("\033[32m按'1'继续查找,按'0'退出查找\033[0m\r\n");
		int next1 = -1;
		scanf("%d", &next1);
		system("cls");
		if (next1 == 1) {
			goto K;
		}
		break;
	case 2://电话号码
		printf("\033[32m输入电话号码查找联系人信息\033[0m\r\n\n");
		printf("\033[32;5m请输入要查找联系人的电话号码:\033[0m\r\n");
		char arr2[TELE_MAX];
		scanf("%s", &arr2);
		system("cls");
		for (int i = 0; i < ptr->storage_real; i++) {
			if (strcmp(arr2, ptr->date[i].tele)==0) {
				print(ptr, i);
				break;
			}
			else {
				if (i == ptr->storage_real - 1) {
					printf("\033[32m通讯录中无该联系人!\033[0m\r\n\n");
				}
			}
		}
		printf("\033[32m按'1'继续查找,按'0'退出查找\033[0m\r\n");
		int next2 = -1;
		scanf("%d", &next2);
		system("cls");
		if (next2 == 1) {
			goto K;
		}
		break;
	case 0://退出
		printf("\033[32m成功退出!\033[0m\r\n\n");
		break;
	default:
		printf("\033[32m选择错误!\033[0m\r\n\n");
		goto K;
		break;
	}
}

2.4 排序此通讯录:

一般联系人排序都是通过姓名排序(字符串排序一般使用qsort

//自动排序
//按姓名排序
int my_sort_name(const void*p1,const void*p2) {
	return strcmp((char*)((SL*)p1)->name, (char*)((SL*)p2)->name);
}
void date_sort(AL* ptr) {
	qsort(ptr->date, ptr->storage_real, sizeof(SL), my_sort_name);
	printf("\033[32m已排序!\033[0m\r\n\n");
}

2.5 打印出通讯录每个人的信息:

通过顺序表按顺序打印联系人信息

//显示所有联系人
void my_print(AL* ptr) {
	for (int i = 0; i < ptr->storage_real; i++) {
		printf("%d.\n", (i + 1));
		printf("姓名:%s\n", ptr->date[i].name);
		printf("年龄:%d\n", ptr->date[i].age);
		printf("性别:%s\n", ptr->date[i].gender);
		printf("电话号码:%s\n", ptr->date[i].tele);
		printf("地址:%s\n", ptr->date[i].addr);
		printf("\n");
	}
}
//显示模式的进入及退出
void print_exit(AL* ptr) {
	printf("\033[32m显示模式:\033[0m\r\n");
	printf("\n");
	my_print(ptr);
	printf("\n");
	printf("按下'0'返回上一步!\n");
	int op = -1;
B:
	scanf("%d", &op);
	if (op != 0) {
		goto B;
	}
	system("cls");
	printf("\033[32m成功退出显示!\033[0m\r\n\n");
}

三. 最终代码结果

3.1 sql.c

#include"address_list.h"
//主菜单
void menu() {
	printf("********** \033[32m通讯录\033[0m **********\n");
	printf("***** 1.增加联系人信息 *****\n");
	printf("***** 2.删除联系人信息 *****\n");
	printf("***** 3.修改联系人信息 *****\n");
	printf("***** 4.查找联系人信息 *****\n");
	printf("***** 5.显示所有联系人 *****\n");
	printf("***** 6.自动排序       *****\n");
	printf("***** 0.退出通讯录     *****\n\n");
	printf("\033[32;5m请选择:\033[0m");
}
//(增加)菜单
void menu_add() {
	printf("\033[32m增加联系人模式:\033[0m\r\n");
	printf("\n");
	printf("****** 1.增加联系人信息(前增)******\n");
	printf("****** 2.增加联系人信息(后增)******\n");
	printf("****** 3.增加联系人信息(指定)******\n");
	printf("****** 0.返回上一步            ******\n\n");
	printf("\033[32;5m请选择:\033[0m");
}
//初始化通讯录
void init_address(AL* ptr) {
	ptr->date = NULL;
	ptr->storage_max = ptr->storage_real = 0;
}
//扩容
void expansion(AL* ptr) {
	if (ptr->storage_max == ptr->storage_real) {
		int storage_new = ptr->storage_max == 0 ? sizeof(AL) : 2 * ptr->storage_max;
		SL* tmp = (SL*)realloc(ptr->date, storage_new);
		if (tmp == NULL) {
			perror("realloc fail!");
			exit(1);
		}
		ptr->date = tmp;
		ptr->storage_max = storage_new;

	}
}
//联系人信息的输入
void add_arbitrarily(AL* ptr, int position) {
	printf("请输入联系人姓名:\n");
	scanf("%s", ptr->date[position].name);
	printf("请输入联系人年龄:\n");
	scanf("%d", &(ptr->date[position].age));
	printf("请输入联系人性别:\n");
	scanf("%s", ptr->date[position].gender);
	printf("请输入联系人电话号码:\n");
	scanf("%s", ptr->date[position].tele);
	printf("请输入联系人地址:\n");
	scanf("%s", ptr->date[position].addr);
	system("cls");
	printf("\033[32m保存成功!\033[0m\r\n\n");
}
//增加通讯录信息(后增)
void add_back(AL* ptr) {
	add_arbitrarily(ptr, ptr->storage_real);
	ptr->storage_real += 1;
}
//前增
void add_front(AL* ptr) {
	ptr->storage_real += 1;
	for (int i = (ptr->storage_real) - 1; i > 0; i--) {
		ptr->date[i] = ptr->date[i - 1];
	}
	add_arbitrarily(ptr, 0);
}
//删除通讯录信息
void delete(AL* ptr) {
	if (ptr->storage_real == 0) {
		printf("\033[32m通讯录中还未存储联系人信息,请先增加联系人\033[0m\r\n\n");
		goto G;
	}
F:
	printf("\033[32m删除联系人信息:\033[0m\r\n");
	printf("\n");
	printf("*** 1.输入序号删除联系人 ***\n");
	printf("*** 2.输入姓名删除联系人 ***\n");
	printf("*** 0.返回上一步         ***\n\n");
	printf("\033[32;5m请选择:\033[0m");
	int op = -1;
	scanf("%d", &op);
	system("cls");
	switch (op) {
	case 1://序号
	C:
		printf("\033[32m输入序号删除联系人:(若想退出该模式,请输入0)\033[0m\r\n\n");
		printf("\033[32;5m请输入您希望删除的联系人序号:\033[0m\r\n\n");
		int num = -1;
		scanf("%d", &num);
		if (num > 0 && num <= ptr->storage_real)
		{
			ptr->storage_real -= 1;
			for (int i = num - 1; i < ptr->storage_real; i++) {
				ptr->date[i] = ptr->date[i + 1];
			}
			system("cls");
			printf("\033[32m保存成功!\033[0m\r\n\n");
		}
		else {
			system("cls");
			if (num == 0) {
				printf("\033[32m已退出删除联系人模式\033[0m\r\n\n");
				break;
			}
			printf("\033[32m通讯录中无该联系人!\033[0m\r\n\n");
			goto C;
		}
		break;
	case 2://姓名
	D:
		printf("\033[32m输入姓名删除联系人:\033[0m\r\n\n");
		printf("\033[32;5m请输入您希望删除的联系人姓名:\033[0m\r\n");
		char arr[NAME_MAX];
		scanf("%s", &arr);
		for (int i = 0; i < ptr->storage_real; i++) {
			if (strcmp(arr, ptr->date[i].name) == 0) {
				ptr->storage_real -= 1;
				for (int j = i; j < ptr->storage_real; j++) {
					ptr->date[i] = ptr->date[i + 1];
				}
				system("cls");
				printf("\033[32m保存成功!\033[0m\r\n\n");
				break;
			}
			else {
				if (i == ptr->storage_real - 1) {
					system("cls");
					printf("\033[32m通讯录中无该联系人!\033[0m\r\n");
					printf("\n");
					goto D;
				}
			}
		}
		break;
	case 0://退出
		printf("\033[32m已退出删除联系人模式\033[0m\r\n");
		break;
	default:
		printf("\033[32m你的选择错误,请重新选择!\033[0m\r\n");
		goto F;
		break;
	}
G:;
}
//修改内容
void modify_main(AL* ptr, int position) {
I:
	//	printf("\033[32m修改联系人信息:\033[0m\r\n\n");
	printf("**** 1.修改联系人姓名 ****\n");
	printf("**** 2.修改联系人年龄 ****\n");
	printf("**** 3.修改联系人性别 ****\n");
	printf("**** 4.修改联系人电话号码 ****\n");
	printf("**** 5.修改联系人地址 ****\n");
	printf("**** 6.修改联系人所有信息 ****\n");
	printf("**** 0.返回主页面 ****\n\n");
	printf("\033[32;5m请选择:\033[0m");
	int op = -1;
	scanf("%d", &op);
	system("cls");
	switch (op) {
	case 1:
		printf("\033[32m修改联系人姓名:\033[0m\r\n\n");
		scanf("%s", ptr->date[position].name);
		break;
	case 2:
		printf("\033[32m修改联系人年龄:\033[0m\r\n\n");
		scanf("%d", &ptr->date[position].age);
		break;
	case 3:
		printf("\033[32m修改联系人性别:\033[0m\r\n\n");
		scanf("%s", ptr->date[position].gender);
		break;
	case 4:
		printf("\033[32m修改联系人电话号码:\033[0m\r\n\n");
		scanf("%s", ptr->date[position].tele);
		break;
	case 5:
		printf("\033[32m修改联系人地址:\033[0m\r\n\n");
		scanf("%s", ptr->date[position].addr);
		break;
	case 6:
		printf("\033[32m修改联系人所有信息:\033[0m\r\n\n");
		add_arbitrarily(ptr, position);
		break;
	case 0:
		printf("\033[32m已返回主页面!\033[0m\r\n\n");
		goto J;
	default:
		printf("\033[32m你的选择错误!\033[0m\r\n\n");
		goto I;
		break;
	}
	system("cls");
	printf("\033[32m保存成功!\033[0m\r\n\n");
J:;
}
//修改通讯录信息
void modify(AL* ptr) {
	system("cls");
	if (ptr->storage_real == 0) {
		printf("\033[32m通讯录中还未存储联系人信息,请先增加联系人\033[0m\r\n");
		printf("\n");
		goto F;
	}
H:
	printf("\033[32m修改联系人信息:\033[0m\r\n");
	printf("\n");
	printf("*** 1.输入序号修改联系人信息 ***\n");
	printf("*** 2.输入姓名修改联系人信息 ***\n");
	printf("*** 0.返回上一步 ***\n");
	printf("\033[32;5m请选择:\033[0m\r\n");
	int op = -1;
	scanf("%d", &op);
	system("cls");
	switch (op) {
	case 1://序号
		printf("\033[32m输入序号修改联系人信息:(若想退出该模式,请输入0)\033[0m\r\n");
		printf("\n");
		printf("\033[32;5m请输入您希望修改联系人的序号:\033[0m\r\n");
		int num = -1;
		scanf("%d", &num);
		system("cls");
		printf("\033[32m修改联系人信息:\033[0m\r\n\n");
		if (num > 0 && num <= ptr->storage_real) {
			modify_main(ptr, num - 1);
		}
		else {
			system("cls");
			if (num == 0) {
				printf("\033[32m已退出修改联系人信息模式\033[0m\r\n");
				break;
			}
			printf("\033[32m通讯录中无该联系人!\033[0m\r\n");
			printf("\n");
		}
		break;
	case 2://姓名
		printf("\033[32m输入姓名修改联系人信息:(若想退出该模式,请输入0)\033[0m\r\n");
		printf("\n");
		printf("\033[32;5m请输入您希望修改联系人的姓名:\033[0m\r\n");
		char arr[NAME_MAX];
		scanf("%s", &arr);
		system("cls");
		printf("\033[32m修改联系人信息:\033[0m\r\n\n");
		for (int i = 0; i < ptr->storage_real; i++) {
			if (strcmp(arr, ptr->date[i].name) == 0) {
				modify_main(ptr, i);
			}
			else {
				if (i == ptr->storage_real - 1) {
					printf("\033[32m通讯录中无该联系人!\033[0m\r\n\n");

				}
			}
		}
		break;
	case 0://退出
		printf("\033[32m已返回上一步!\033[0m\r\n\n");
		break;
	default:
		printf("\033[32m你的选择错误!\033[0m\r\n\n");
		goto H;
		break;
	}
F:
	;
}
void print(AL* ptr, int position) {
	printf("%d.\n", (position + 1));
	printf("姓名:%s\n", ptr->date[position].name);
	printf("年龄:%d\n", ptr->date[position].age);
	printf("性别:%s\n", ptr->date[position].gender);
	printf("电话号码:%s\n", ptr->date[position].tele);
	printf("地址:%s\n\n", ptr->date[position].addr);
}
//查找通讯录信息
void date_find(AL* ptr) {
	K:
	printf("\033[32m查找联系人信息\033[0m\r\n\n");
	printf("*** 1.输入姓名查找联系人信息 ***\n");
	printf("*** 2.输入电话号码查找联系人 ***\n");
	printf("*** 0.退出查找联系人模式 ***\n");
	int op = -1;
	scanf("%d", &op);
	system("cls");
	switch (op) {
	case 1://姓名
		printf("\033[32m输入姓名查找联系人信息\033[0m\r\n\n");
		printf("\033[32;5m请输入要查找联系人的姓名:\033[0m\r\n");
		char arr1[NAME_MAX];
		scanf("%s", &arr1);
		system("cls");
		for (int i = 0; i < ptr->storage_real; i++) {
			if (strcmp(arr1, ptr->date[i].name)==0) {
				print(ptr, i);
				break;
			}
			else {
				if (i == ptr->storage_real-1) {
					printf("\033[32m通讯录中无该联系人!\033[0m\r\n\n");
				}
			}
		}
		printf("\033[32m按'1'继续查找,按'0'退出查找\033[0m\r\n");
		int next1 = -1;
		scanf("%d", &next1);
		system("cls");
		if (next1 == 1) {
			goto K;
		}
		break;
	case 2://电话号码
		printf("\033[32m输入电话号码查找联系人信息\033[0m\r\n\n");
		printf("\033[32;5m请输入要查找联系人的电话号码:\033[0m\r\n");
		char arr2[TELE_MAX];
		scanf("%s", &arr2);
		system("cls");
		for (int i = 0; i < ptr->storage_real; i++) {
			if (strcmp(arr2, ptr->date[i].tele)==0) {
				print(ptr, i);
				break;
			}
			else {
				if (i == ptr->storage_real - 1) {
					printf("\033[32m通讯录中无该联系人!\033[0m\r\n\n");
				}
			}
		}
		printf("\033[32m按'1'继续查找,按'0'退出查找\033[0m\r\n");
		int next2 = -1;
		scanf("%d", &next2);
		system("cls");
		if (next2 == 1) {
			goto K;
		}
		break;
	case 0://退出
		printf("\033[32m成功退出!\033[0m\r\n\n");
		break;
	default:
		printf("\033[32m选择错误!\033[0m\r\n\n");
		goto K;
		break;
	}
}
//显示所有联系人
void my_print(AL* ptr) {
	for (int i = 0; i < ptr->storage_real; i++) {
		printf("%d.\n", (i + 1));
		printf("姓名:%s\n", ptr->date[i].name);
		printf("年龄:%d\n", ptr->date[i].age);
		printf("性别:%s\n", ptr->date[i].gender);
		printf("电话号码:%s\n", ptr->date[i].tele);
		printf("地址:%s\n", ptr->date[i].addr);
		printf("\n");
	}
}
//自动排序
//按姓名排序
int my_sort_name(const void*p1,const void*p2) {
	return strcmp((char*)((SL*)p1)->name, (char*)((SL*)p2)->name);
}
void date_sort(AL* ptr) {
	qsort(ptr->date, ptr->storage_real, sizeof(SL), my_sort_name);
	printf("\033[32m已排序!\033[0m\r\n\n");
}
//增加模式选择
void op_add(AL* my_al) {
A:
	menu_add();
	int op = -1;
	scanf("%d", &op);
	switch (op) {
	case 1:
		system("cls");
		add_front(my_al);
		break;
	case 2:
		system("cls");
		add_back(my_al);
		break;
	case 3:
		printf("请输入您希望存入的位置:\n");
		int position = -1;
		scanf("%d", &position);
		add_arbitrarily(my_al, position);
		break;
	case 0:
		system("cls");
		printf("\033[32m已返回上一步!\033[0m\r\n\n");
		break;
	default:
		system("cls");
		printf("\033[32;5m你的选择错误,请重新选择!\033[0m\r\n");
		goto A;
		break;
	}
}
//显示模式的进入及退出
void print_exit(AL* ptr) {
	printf("\033[32m显示模式:\033[0m\r\n");
	printf("\n");
	my_print(ptr);
	printf("\n");
	printf("按下'0'返回上一步!\n");
	int op = -1;
B:
	scanf("%d", &op);
	if (op != 0) {
		goto B;
	}
	system("cls");
	printf("\033[32m成功退出显示!\033[0m\r\n\n");
}
//菜单选择
void my_switch(int op, AL* my_al) {
	switch (op) {
	case 1:
		//增加联系人信息
		expansion(my_al);
		op_add(my_al);
		break;
	case 2:
		//删除联系人信息
		delete(my_al);
		break;
	case 3:
		//修改联系人信息
		modify(my_al);
		break;
	case 4:
		date_find(my_al);
		//查找联系人信息
		break;
	case 5:
		//显示所有联系人
		print_exit(my_al);
		break;
	case 6:
		date_sort(my_al);
		break;
	default:
		printf("\033[32m你的选择错误,请重新选择!\033[0m\r\n\n");
		break;
	}
}

3.2 address_list.c

#include"address_list.h"
int main() {
	SL my_sl;
	AL my_al;
	//初始化通讯录
	init_address(&my_al);
	//菜单
	int op = -1;
	do {
		menu();
		scanf("%d", &op);
		system("cls");
		my_switch(op, &my_al);
	} while (op);
	system("cls");
	printf("正在退出");
	printf("\033[32;5m...\033[0m\r\n");
	free(&my_al);

	return 0;
}

3.3 address_list.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define NAME_MAX 100
#define ADDR_MAX 100
#define GENDER_MAX 10
#define TELE_MAX 15
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void menu();//主菜单
void menu_add();//(增加)菜单
typedef struct address_list {
	char name[NAME_MAX];//名字
	int age;//年龄
	char gender[GENDER_MAX];//性别
	char addr[ADDR_MAX];//地址
	char tele[TELE_MAX];//电话号码
}SL;
typedef struct sql {
	SL* date;//联系人信息
	int storage_max;//最大存储大小
	int storage_real;//实际存储大小
}AL;
void op_add(AL* my_al);//增加模式选择
//菜单选择
void my_switch(int op, AL* my_al);
//初始化通讯录
void init_address(AL* ptr);
//判断及扩容
void expansion(AL* ptr);
//增加联系人信息
void add_back(AL* ptr);//前增
void add_front(AL* ptr);//后增
void add_arbitrarily(AL* ptr, int position);//任意位置增加
//显示所有联系人
void my_print(AL* ptr);
//显示模式的进入及退出
void print_exit(AL* ptr);
//删除联系人模式
void delete(AL* ptr);
//修改联系人信息
void modify(AL* ptr);
//联系人信息的输入
void add_arbitrarily(AL* ptr, int position);
//查找通讯录信息
void print(AL* ptr, int position);
void date_find(AL* ptr);
//按姓名排序
int my_sort_name(const void* p1, const void* p2);
//自动排序
void date_sort(AL* ptr);

相关推荐

  1. C语言——通讯录实现

    2024-03-21 00:02:04       29 阅读
  2. 简易通讯录管理系统:C语言实现及代码详解

    2024-03-21 00:02:04       35 阅读
  3. C语言——通讯录实现

    2024-03-21 00:02:04       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 00:02:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 00:02:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 00:02:04       82 阅读
  4. Python语言-面向对象

    2024-03-21 00:02:04       91 阅读

热门阅读

  1. Linux:线程池的创建和基本使用

    2024-03-21 00:02:04       32 阅读
  2. Hugging Face推出开源ChatGPT竞争对手:HuggingChat

    2024-03-21 00:02:04       39 阅读
  3. 蓝桥杯倒计时47天!DFS基础——图的遍历

    2024-03-21 00:02:04       42 阅读
  4. VBA将当前打开的表格生成PDF图片

    2024-03-21 00:02:04       43 阅读
  5. Vue的优点

    2024-03-21 00:02:04       39 阅读
  6. Vue中Diff算法一文详解

    2024-03-21 00:02:04       38 阅读