通讯录多版本代码归纳

目录

  • 前言
  • 思路分析
  • 静态版本
  • 动态版本
  • 可保存到文件版本
  • 未完待续...

前言

本文介绍手机通讯录,实现对联系人的增删查改等操作,应用了比较简单的数据结构知识。


思路分析

采用多个文件的方式进行代码的管理,

测试文件text.c用于存放程序主体,是具体操作的部分,也是main()函数所在之处,需要包含Contact.h
函数定义文件Contact.c,用于存放所有需要的函数的定义,需要包含Contact.h
头文件Contact.h用于存放所有头文件、函数声明、#define定义的符号等。

通讯录实现的是对联系人的增删查改、排序等一系列的操作。

  1. 对象是联系人,所以首先在Contact.h中构建联系人结构体类型struct PeoInfo包括了一个联系人的基本信息。
  2. 构建通讯录结构体类型struct Contact通讯录中包含了多个联系人、联系人数量等
  3. test.c文件main()函数内创建通讯录变量
  4. 对通讯录变量初始化。
  5. 通过用户输入实现对通讯录的增删查改、排序、退出等操作。

静态版本

通讯录中联系人的容量一开始就是确定的,不能增加也不能减少。联系人过少,容量浪费;联系人过多,不够储存。
Contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
//函数声明
#include 
#include 
#include 


#define MAX_PEO 1000
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_TELE 15
#define MAX_ADDRESS 30

//联系人类型
typedef struct PeoInfo {
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char address[MAX_ADDRESS];
}PeoInfo;

//通讯录类型
typedef struct Contact {
	PeoInfo peo[MAX_PEO];
	//联系人数量
	int count;
}Contact;

//初始化
void Init(Contact* Peo);

//菜单
void menu();

//增
void AddContact(Contact* Peo);

//打印单个联系人的信息
void print_Peo(Contact* Peo, int i);

//打印联系人
void DisplayContact(const Contact* Peo);

//名字查找
int CheckContact_by_name(Contact* Peo, char* pname);

//电话查找
int CheckContact_by_tele(Contact* Peo);

//查
void CheckContact(Contact* Peo);

//删
void DelContact(Contact* Peo);

//修改联系人信息
void ModifyContact(Contact* Peo);

//排序
void sort(Contact* Peo);

test.c

//测试部分
//静态通讯录
#include "contact.h"

enum option {
	EXIT,
	ADD,
	DELETE,
	CHECK,
	MODIFY,
	DISPLAY,
	SORT,
};
int main() {
	Contact Peo = { 0 };
	int input = 0;

	Init(&Peo);

	do {
		menu();
		printf("请输入你的选择>");
		scanf("%d", &input);
		switch (input) {
		case ADD:
			//add
			AddContact(&Peo);
			break;
		case DELETE:
			//删
			DelContact(&Peo);
			break;
		case CHECK:
			//查
			CheckContact(&Peo);
			break;
		case MODIFY:
			//改
			ModifyContact(&Peo);
			break;
		case DISPLAY:
			//打印
			DisplayContact(&Peo);
			break;
		case SORT:
			//排序
			sort(&Peo);
			break;
		case EXIT:
			//退出
			printf("程序退出!\n");
			break;
		default:
			//其他
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}

** Contact.c**

#include "contact.h"
//函数定义

//初始化结构体
void Init(Contact* Peo) {
	assert(Peo != NULL);
	memset(Peo, 0, sizeof(Contact));
}
//菜单
void menu() {
	printf("******************************\n");
	printf("****   1. 增      2. 删   ****\n");
	printf("****   3. 查      4. 改   ****\n");
	printf("****  5.打印      6.排序  ****\n");
	printf("****        0.exit        ****\n");
	printf("******************************\n");
}

//增
void AddContact(Contact* Peo) {
	assert(Peo != NULL);
	if (Peo->count == MAX_PEO) {
		printf("联系人列表已满,添加失败!\n");
		return;
	}
	printf("请输入联系人姓名>");
	scanf("%s", Peo->peo[Peo->count].name);
	printf("请输入联系人年龄>");
	scanf("%d", &(Peo->peo[Peo->count].age));
	printf("请输入联系人性别>");
	scanf("%s", Peo->peo[Peo->count].sex);
	printf("请输入联系人电话>");
	scanf("%s", Peo->peo[Peo->count].tele);
	printf("请输入联系人地址>");
	scanf("%s", Peo->peo[Peo->count].address);
	Peo->count++;
	printf("增加联系人成功!\n");
}

//打印单个联系人的信息
void printf_Peo(const Contact* Peo, int i) {
	assert(Peo != NULL);
	printf("%-20s %-4d %-6s %-15s %-30s\n",
		Peo->peo[i].name,
		Peo->peo[i].age,
		Peo->peo[i].sex,
		Peo->peo[i].tele,
		Peo->peo[i].address);
}
//打印联系人
void DisplayContact(const Contact* Peo) {
	assert(Peo != NULL);
	int i = 0;
	printf("%-20s %-4s %-6s %-15s %-30s\n", "姓名", "年龄", "性别","电话", "地址");
	for (i = 0; i < Peo->count; i++) {
		printf_Peo(Peo, i);
	}
}

//名字查找
int CheckContact_by_name(Contact* Peo) {
	assert(Peo != NULL);
	char tmp[MAX_NAME] = { 0 };
	scanf("%s", tmp);
	int i = 0;
	for (i = 0; i < Peo->count; i++) {
		if (strcmp(Peo->peo[i].name, tmp) == 0) {
			return i;
		}
	}
	return -1;
}

//电话查找
int CheckContact_by_tele(Contact* Peo) {
	assert(Peo != NULL);
	char tmp[MAX_NAME] = { 0 };
	scanf("%s", tmp);
	int i = 0;
	for (i = 0; i < Peo->count; i++) {
		if (strcmp(Peo->peo[i].tele, tmp) == 0) {
			return i;
		}
	}
	return -1;
}

//查
void CheckContact(Contact* Peo) {
	assert(Peo != NULL);
	int index = 0;
	printf("请选择查找的方式(1/2)\n"
		"1. by_name\n"
		"2. by_tele\n");
	scanf("%d", &index);
	int sub = 0;
	switch (index) {
	case 1:
		printf("请输入联系人姓名>");
			sub = CheckContact_by_name(Peo);//subscript下标
			if (sub >= 0) {
				printf("找到了!\n");
				printf_Peo(Peo, sub);
			}
			else {
				printf("没找到!\n");
			}
		break;
	case 2:
		printf("请输入联系人电话>");
		sub = CheckContact_by_tele(Peo);
		if (sub >= 0) {
			printf("找到了!\n");
			printf_Peo(Peo, sub);
		}
		else {
			printf("没找到!\n");
		}
		break;
	default :
		printf("输入错误!");
		break;
	}

}
//删
void DelContact(Contact* Peo) {
	assert(Peo != NULL);
	printf("请输入要删除的联系人姓名>");
	//名字查找一个联系人
	int index = CheckContact_by_name(Peo);
	if (index >= 0) {
		int i = 0;
		for (i = index; i < Peo->count - 1; i++) {
			Peo->peo[i] = Peo->peo[i + 1];
		}
		Peo->count--;
		printf("删除联系人成功!\n");
	}
	else {
		printf("删除失败,联系人不存在!\n");
	}
}

//修改联系人信息
void ModifyContact(Contact* Peo) {
	assert(Peo != NULL);
	//查
	printf("请输入要修改的联系人姓名>");
	int index = CheckContact_by_name(Peo);
	if (index >= 0) {
		printf("请输入联系人姓名>");
		scanf("%s", Peo->peo[index].name);
		printf("请输入联系人年龄>");
		scanf("%d", &(Peo->peo[index].age));
		printf("请输入联系人性别>");
		scanf("%s", Peo->peo[index].sex);
		printf("请输入联系人电话>");
		scanf("%s", Peo->peo[index].tele);
		printf("请输入联系人地址>");
		scanf("%s", Peo->peo[index].address);
		printf("修改联系人成功!\n");
	}
	else {
		printf("联系人不存在,修改失败\n");
	}
}

int cmp_name_up(const void* e1, const void* e2) {
	assert(e1 != NULL && e2 != NULL);
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
int cmp_name_down(const void* e1, const void* e2) {
	assert(e1 != NULL && e2 != NULL);
	return strcmp(((PeoInfo*)e2)->name, ((PeoInfo*)e1)->name);
}
int cmp_age_up(const void* e1, const void* e2) {
	assert(e1 != NULL && e2 != NULL);
	return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}
int cmp_age_down(const void* e1, const void* e2) {
	assert(e1 != NULL && e2 != NULL);
	return ((PeoInfo*)e2)->age - ((PeoInfo*)e1)->age;
}
//排序
void sort(Contact* Peo) {
	assert(Peo != NULL);
	printf("请输入选择排序的选择:\n"
		"1.按姓名升序排列\n"
		"2.按姓名降序排列\n"
		"3.按年龄升序排列\n"
		"4.按年龄降序排列\n");
	int input = 0;
	scanf("%d", &input);
	int (*cmp[4])(const void* e1, const void* e2) = {
		cmp_name_up,
		cmp_name_down,
		cmp_age_up,
		cmp_age_down };
	qsort(Peo, Peo->count, sizeof(Peo->peo[0]), cmp[input-1]);
	printf("排序成功!\n");
}

动态版本

采用动态内存管理的思路,使用malloc、calloc、realloc,当通讯录容量不够时对通讯录进行扩容操作。
Contact.h

#pragma once
//函数声明
#include 
#include 
#include 
#include 
#include 

#define INIT_SZ 3
#define CAPACITY_ADD 2
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_TELE 15
#define MAX_ADDRESS 30


//联系人类型
typedef struct PeoInfo {
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char address[MAX_ADDRESS];
}PeoInfo;

//通讯录类型
typedef struct Contact {
	PeoInfo* peo;
	//联系人数量
	int count;
	//联系人容量
	int capacity;
}Contact;

//初始化
int InitContact(Contact* Peo);
//菜单
void menu();

//增
void AddContact(Contact* Peo);

//打印单个联系人的信息
void print_Peo(Contact* Peo, int i);

//打印联系人
void DisplayContact(const Contact* Peo);

//名字查找
int CheckContact_by_name(Contact* Peo);

//电话查找
int CheckContact_by_tele(Contact* Peo);

//查
void CheckContact(Contact* Peo);

//删
void DelContact(Contact* Peo);

//修改联系人信息
void ModifyContact(Contact* Peo);

//排序
void sort(Contact* Peo);

//销毁通讯录
void DestroyContact(Contact* Peo);

test.c

//测试部分
#include "contact.h"

enum option {
	EXIT,
	ADD,
	DELETE,
	CHECK,
	MODIFY,
	DISPLAY,
	SORT,
};
int main() {
	Contact Peo;
	int input = 0;

	InitContact(&Peo);

	do {
		menu();
		printf("请输入你的选择>");
		scanf("%d", &input);
		switch (input) {
		case ADD:
			//add
			AddContact(&Peo);
			break;
		case DELETE:
			//删
			DelContact(&Peo);
			break;
		case CHECK:
			//查
			CheckContact(&Peo);
			break;
		case MODIFY:
			//改
			ModifyContact(&Peo);
			break;
		case DISPLAY:
			//打印
			DisplayContact(&Peo);
			break;
		case SORT:
			//排序
			sort(&Peo);
			break;
		case EXIT:
			//销毁通讯录并退出
            DestroyContact(&Peo);
			printf("程序退出!\n");
			break;
		default:
			//其他
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}

Contact.c

#include "contact.h"
//函数定义

//扩容
void CheckCapacityContact(Contact* Peo) {
	assert(Peo != NULL);
	if (Peo->count == Peo->capacity) {
		//扩容时是  以前的容量  加上  新增的容量
		PeoInfo* p = (PeoInfo*)realloc(Peo->peo, sizeof(PeoInfo) * (Peo->capacity + CAPACITY_ADD));
		if (p == NULL) {
			//扩容失败
			printf("CheckCapacityContact%s", strerror(errno));
		}
		//成功
		Peo->peo = p;
		Peo->capacity += CAPACITY_ADD;
		printf("扩容成功\n");
	}
}

//初始化结构体
int InitContact(Contact* Peo) {
	assert(Peo != NULL);
	//初始化
	PeoInfo* p = (PeoInfo*)calloc(INIT_SZ, sizeof(PeoInfo));
	//初始化分配内存空间失败,返回1
	if (p == NULL) {
		printf("InitContact::%s", strerror(errno));
		return 1;
	}
	//成功
	Peo->peo = p;
	Peo->count = 0;
	Peo->capacity = INIT_SZ;

	return 0;
}
//菜单
void menu() {
	printf("******************************\n");
	printf("****   1. 增      2. 删   ****\n");
	printf("****   3. 查      4. 改   ****\n");
	printf("****  5.打印      6.排序  ****\n");
	printf("****        0.exit        ****\n");
	printf("******************************\n");
}

//增
void AddContact(Contact* Peo) {
	assert(Peo != NULL);
	//扩充容量
	CheckCapacityContact(Peo);

	printf("请输入联系人姓名>");
	scanf("%s", Peo->peo[Peo->count].name);
	printf("请输入联系人年龄>");
	scanf("%d", &(Peo->peo[Peo->count].age));
	printf("请输入联系人性别>");
	scanf("%s", Peo->peo[Peo->count].sex);
	printf("请输入联系人电话>");
	scanf("%s", Peo->peo[Peo->count].tele);
	printf("请输入联系人地址>");
	scanf("%s", Peo->peo[Peo->count].address);
	Peo->count++;
	printf("增加联系人成功!\n");
}

//打印单个联系人的信息
void printf_Peo(const Contact* Peo, int i) {
	assert(Peo != NULL);
	printf("%-20s %-4d %-6s %-15s %-30s\n",
		Peo->peo[i].name,
		Peo->peo[i].age,
		Peo->peo[i].sex,
		Peo->peo[i].tele,
		Peo->peo[i].address);
}
//打印联系人
void DisplayContact(const Contact* Peo) {
	assert(Peo != NULL);
	int i = 0;
	printf("%-20s %-4s %-6s %-15s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < Peo->count; i++) {
		printf_Peo(Peo, i);
	}
}

//名字查找
int CheckContact_by_name(Contact* Peo) {
	assert(Peo != NULL);
	char tmp[MAX_NAME] = { 0 };
	scanf("%s", tmp);
	int i = 0;
	for (i = 0; i < Peo->count; i++) {
		if (strcmp(Peo->peo[i].name, tmp) == 0) {
			return i;
		}
	}
	return -1;
}

//电话查找
int CheckContact_by_tele(Contact* Peo) {
	assert(Peo != NULL);
	char tmp[MAX_NAME] = { 0 };
	scanf("%s", tmp);
	int i = 0;
	for (i = 0; i < Peo->count; i++) {
		if (strcmp(Peo->peo[i].tele, tmp) == 0) {
			return i;
		}
	}
	return -1;
}

//查
void CheckContact(Contact* Peo) {
	assert(Peo != NULL);
	int index = 0;
	printf("请选择查找的方式(1/2)\n"
		"1. by_name\n"
		"2. by_tele\n");
	scanf("%d", &index);
	int sub = 0;
	switch (index) {
	case 1:
		printf("请输入联系人姓名>");
		sub = CheckContact_by_name(Peo);//subscript下标
		if (sub >= 0) {
			printf("找到了!\n");
			printf_Peo(Peo, sub);
		}
		else {
			printf("没找到!\n");
		}
		break;
	case 2:
		printf("请输入联系人电话>");
		sub = CheckContact_by_tele(Peo);
		if (sub >= 0) {
			printf("找到了!\n");
			printf_Peo(Peo, sub);
		}
		else {
			printf("没找到!\n");
		}
		break;
	default:
		printf("输入错误!\n");
		break;
	}

}
//删
void DelContact(Contact* Peo) {
	assert(Peo != NULL);
	printf("请输入要删除的联系人姓名>");
	//名字查找一个联系人
	int index = CheckContact_by_name(Peo);
	if (index >= 0) {
		int i = 0;
		for (i = index; i < Peo->count - 1; i++) {
			Peo->peo[i] = Peo->peo[i + 1];
		}
		Peo->count--;
		printf("删除联系人成功!\n");
	}
	else {
		printf("删除失败,联系人不存在!\n");
	}
}

//修改联系人信息
void ModifyContact(Contact* Peo) {
	assert(Peo != NULL);
	//查
	printf("请输入要修改的联系人姓名>");
	int index = CheckContact_by_name(Peo);
	if (index >= 0) {
		printf("请输入联系人姓名>");
		scanf("%s", Peo->peo[index].name);
		printf("请输入联系人年龄>");
		scanf("%d", &(Peo->peo[index].age));
		printf("请输入联系人性别>");
		scanf("%s", Peo->peo[index].sex);
		printf("请输入联系人电话>");
		scanf("%s", Peo->peo[index].tele);
		printf("请输入联系人地址>");
		scanf("%s", Peo->peo[index].address);
		printf("修改联系人成功!\n");
	}
	else {
		printf("联系人不存在,修改失败\n");
	}
}

int cmp_name_up(const void* e1, const void* e2) {
	assert(e1 != NULL && e2 != NULL);
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
int cmp_name_down(const void* e1, const void* e2) {
	assert(e1 != NULL && e2 != NULL);
	return strcmp(((PeoInfo*)e2)->name, ((PeoInfo*)e1)->name);
}
int cmp_age_up(const void* e1, const void* e2) {
	assert(e1 != NULL && e2 != NULL);
	return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}
int cmp_age_down(const void* e1, const void* e2) {
	assert(e1 != NULL && e2 != NULL);
	return ((PeoInfo*)e2)->age - ((PeoInfo*)e1)->age;
}
//排序
void sort(Contact* Peo) {
	assert(Peo != NULL);
	printf("请输入选择排序的选择:\n"
		"1.按姓名升序排列\n"
		"2.按姓名降序排列\n"
		"3.按年龄升序排列\n"
		"4.按年龄降序排列\n");
	int input = 0;
	scanf("%d", &input);
	int (*cmp[4])(const void* e1, const void* e2) = {
		cmp_name_up,
		cmp_name_down,
		cmp_age_up,
		cmp_age_down };
	qsort(Peo->peo, Peo->count, sizeof(Peo->peo[0]), cmp[input - 1]);
	printf("排序成功!\n");
}

//销毁通讯录
void DestroyContact(Contact* Peo) {
	assert(Peo != NULL);
	free(Peo->peo);
	Peo->peo = NULL;
}

可保存到文件版本

通讯录中的联系人信息不仅仅能在内存中存在,也可以保存在文件中,这样程序结束时通讯录中联系人信息不会丢失,当下次程序再次运行时再从文件加载联系人信息到程序(内存)中。
Contact.h

#pragma once
//函数声明
#include 
#include 
#include 
#include 
#include 

#define INIT_SZ 3
#define CAPACITY_ADD 2
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_TELE 15
#define MAX_ADDRESS 30


//联系人类型
typedef struct PeoInfo {
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char address[MAX_ADDRESS];
}PeoInfo;

//通讯录类型
typedef struct Contact {
	PeoInfo* peo;
	//联系人数量
	int count;
	//联系人容量
	int capacity;
}Contact;

//初始化
int InitContact(Contact* Peo);

//加载联系人信息
void LoadContact(Contact* Peo);
//菜单
void menu();

//增
void AddContact(Contact* Peo);

//打印单个联系人的信息
void print_Peo(Contact* Peo, int i);

//打印联系人
void DisplayContact(const Contact* Peo);

//名字查找
int CheckContact_by_name(Contact* Peo);

//电话查找
int CheckContact_by_tele(Contact* Peo);

//查
void CheckContact(Contact* Peo);

//删
void DelContact(Contact* Peo);

//修改联系人信息
void ModifyContact(Contact* Peo);

//排序
void sort(Contact* Peo);

//保存通讯录信息
void SaveContact(Contact* Peo);

//销毁通讯录
void DestroyContact(Contact* Peo);

test.c

//测试部分
#include "contact.h"

enum option {
	EXIT,
	ADD,
	DELETE,
	CHECK,
	MODIFY,
	DISPLAY,
	SORT,
};
int main() {
	Contact Peo;
	int input = 0;

	InitContact(&Peo);

	do {
		menu();
		printf("请输入你的选择>");
		scanf("%d", &input);
		switch (input) {
		case ADD:
			//add
			AddContact(&Peo);
			break;
		case DELETE:
			//删
			DelContact(&Peo);
			break;
		case CHECK:
			//查
			CheckContact(&Peo);
			break;
		case MODIFY:
			//改
			ModifyContact(&Peo);
			break;
		case DISPLAY:
			//打印
			DisplayContact(&Peo);
			break;
		case SORT:
			//排序
			sort(&Peo);
			break;
		case EXIT:
			//销毁通讯录并退出
			SaveContact(&Peo);
			DestroyContact(&Peo);
			printf("程序退出!\n");
			break;
		default:
			//其他
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}

Contact.c

#include "contact.h"
//函数定义

//扩容
void CheckCapacityContact(Contact* Peo) {
	assert(Peo != NULL);
	if (Peo->count == Peo->capacity) {
		//扩容时是  以前的容量  加上  新增的容量
		PeoInfo* p = (PeoInfo*)realloc(Peo->peo, sizeof(PeoInfo) * (Peo->capacity + CAPACITY_ADD));
		if (p == NULL) {
			//扩容失败
			printf("CheckCapacityContact%s", strerror(errno));
		}
		//成功
		Peo->peo = p;
		Peo->capacity += CAPACITY_ADD;
		printf("扩容成功\n");
	}
}

//加载联系人信息
void LoadContact(Contact* Peo) {
	assert(Peo != NULL);
	//打开文件
	FILE* pf = fopen("Contact.txt", "rb");
	//判断文件是否打开成功
	if (pf == NULL) {
		perror("LoadContact");
		return;
	}
	//二进制形式读取文件信息
	PeoInfo tmp = { 0 };
	while (fread(&tmp, sizeof(PeoInfo), 1, pf) == 1) {
		//判断是否增容
		CheckCapacityContact(Peo);
		Peo->peo[Peo->count] = tmp;
		Peo->count++;
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
}
//初始化结构体
int InitContact(Contact* Peo) {
	assert(Peo != NULL);
	//初始化
	PeoInfo* p = (PeoInfo*)calloc(INIT_SZ, sizeof(PeoInfo));
	//初始化分配内存空间失败,返回1
	if (p == NULL) {
		printf("InitContact::%s", strerror(errno));
		return 1;
	}
	//成功
	Peo->peo = p;
	Peo->count = 0;
	Peo->capacity = INIT_SZ;
	//加载文件信息到通讯录
	LoadContact(Peo);

	return 0;
}
//菜单
void menu() {
	printf("******************************\n");
	printf("****   1. 增      2. 删   ****\n");
	printf("****   3. 查      4. 改   ****\n");
	printf("****  5.打印      6.排序  ****\n");
	printf("****        0.exit        ****\n");
	printf("******************************\n");
}

//增
void AddContact(Contact* Peo) {
	assert(Peo != NULL);
	//扩充容量
	CheckCapacityContact(Peo);

	printf("请输入联系人姓名>");
	scanf("%s", Peo->peo[Peo->count].name);
	printf("请输入联系人年龄>");
	scanf("%d", &(Peo->peo[Peo->count].age));
	printf("请输入联系人性别>");
	scanf("%s", Peo->peo[Peo->count].sex);
	printf("请输入联系人电话>");
	scanf("%s", Peo->peo[Peo->count].tele);
	printf("请输入联系人地址>");
	scanf("%s", Peo->peo[Peo->count].address);
	Peo->count++;
	printf("增加联系人成功!\n");
}

//打印单个联系人的信息
void printf_Peo(const Contact* Peo, int i) {
	assert(Peo != NULL);
	printf("%-20s %-4d %-6s %-15s %-30s\n",
		Peo->peo[i].name,
		Peo->peo[i].age,
		Peo->peo[i].sex,
		Peo->peo[i].tele,
		Peo->peo[i].address);
}
//打印联系人
void DisplayContact(const Contact* Peo) {
	assert(Peo != NULL);
	int i = 0;
	printf("%-20s %-4s %-6s %-15s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < Peo->count; i++) {
		printf_Peo(Peo, i);
	}
}

//名字查找
int CheckContact_by_name(Contact* Peo) {
	assert(Peo != NULL);
	char tmp[MAX_NAME] = { 0 };
	scanf("%s", tmp);
	int i = 0;
	for (i = 0; i < Peo->count; i++) {
		if (strcmp(Peo->peo[i].name, tmp) == 0) {
			return i;
		}
	}
	return -1;
}

//电话查找
int CheckContact_by_tele(Contact* Peo) {
	assert(Peo != NULL);
	char tmp[MAX_NAME] = { 0 };
	scanf("%s", tmp);
	int i = 0;
	for (i = 0; i < Peo->count; i++) {
		if (strcmp(Peo->peo[i].tele, tmp) == 0) {
			return i;
		}
	}
	return -1;
}

//查
void CheckContact(Contact* Peo) {
	assert(Peo != NULL);
	int index = 0;
	printf("请选择查找的方式(1/2)\n"
		"1. by_name\n"
		"2. by_tele\n");
	scanf("%d", &index);
	int sub = 0;
	switch (index) {
	case 1:
		printf("请输入联系人姓名>");
		sub = CheckContact_by_name(Peo);//subscript下标
		if (sub >= 0) {
			printf("找到了!\n");
			printf_Peo(Peo, sub);
		}
		else {
			printf("没找到!\n");
		}
		break;
	case 2:
		printf("请输入联系人电话>");
		sub = CheckContact_by_tele(Peo);
		if (sub >= 0) {
			printf("找到了!\n");
			printf_Peo(Peo, sub);
		}
		else {
			printf("没找到!\n");
		}
		break;
	default:
		printf("输入错误!\n");
		break;
	}

}
//删
void DelContact(Contact* Peo) {
	assert(Peo != NULL);
	printf("请输入要删除的联系人姓名>");
	//名字查找一个联系人
	int index = CheckContact_by_name(Peo);
	if (index >= 0) {
		int i = 0;
		for (i = index; i < Peo->count - 1; i++) {
			Peo->peo[i] = Peo->peo[i + 1];
		}
		Peo->count--;
		printf("删除联系人成功!\n");
	}
	else {
		printf("删除失败,联系人不存在!\n");
	}
}

//修改联系人信息
void ModifyContact(Contact* Peo) {
	assert(Peo != NULL);
	//查
	printf("请输入要修改的联系人姓名>");
	int index = CheckContact_by_name(Peo);
	if (index >= 0) {
		printf("请输入联系人姓名>");
		scanf("%s", Peo->peo[index].name);
		printf("请输入联系人年龄>");
		scanf("%d", &(Peo->peo[index].age));
		printf("请输入联系人性别>");
		scanf("%s", Peo->peo[index].sex);
		printf("请输入联系人电话>");
		scanf("%s", Peo->peo[index].tele);
		printf("请输入联系人地址>");
		scanf("%s", Peo->peo[index].address);
		printf("修改联系人成功!\n");
	}
	else {
		printf("联系人不存在,修改失败\n");
	}
}

int cmp_name_up(const void* e1, const void* e2) {
	assert(e1 != NULL && e2 != NULL);
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
int cmp_name_down(const void* e1, const void* e2) {
	assert(e1 != NULL && e2 != NULL);
	return strcmp(((PeoInfo*)e2)->name, ((PeoInfo*)e1)->name);
}
int cmp_age_up(const void* e1, const void* e2) {
	assert(e1 != NULL && e2 != NULL);
	return ((PeoInfo*)e1)->age - ((PeoInfo*)e2)->age;
}
int cmp_age_down(const void* e1, const void* e2) {
	assert(e1 != NULL && e2 != NULL);
	return ((PeoInfo*)e2)->age - ((PeoInfo*)e1)->age;
}
//排序
void sort(Contact* Peo) {
	assert(Peo != NULL);
	printf("请输入选择排序的选择:\n"
		"1.按姓名升序排列\n"
		"2.按姓名降序排列\n"
		"3.按年龄升序排列\n"
		"4.按年龄降序排列\n");
	int input = 0;
	scanf("%d", &input);
	int (*cmp[4])(const void* e1, const void* e2) = {
		cmp_name_up,
		cmp_name_down,
		cmp_age_up,
		cmp_age_down };
	qsort(Peo, Peo->count, sizeof(Peo->peo[0]), cmp[input - 1]);
	printf("排序成功!\n");
}
//保存通讯录信息
void SaveContact(const Contact* Peo) {
	assert(Peo != NULL);
	//以只写的模式打开文件
	FILE* pf = fopen("Contact.txt", "wb");
	//判断文件是否打开成功
	if (pf == NULL) {
		perror("SaveContact");
		return;
	}
	//二进制形式保存信息,写入到文件
	int i = 0;
	for (i = 0; i < Peo->count; i++) {
		fwrite(Peo->peo + i, sizeof(PeoInfo), 1, pf);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
}

//销毁通讯录
void DestroyContact(Contact* Peo) {
	assert(Peo != NULL);
	free(Peo->peo);
	Peo->peo = NULL;
}

未完待续…


END

你可能感兴趣的:(C语言学习之路,数据结构,c语言)