#define _CRT_SECURE_NO_WARNINGS 1
#define MAX 1000
#include<stdio.h>
#include<string.h>

enum option//枚举类型菜单选择方便
{
exit,//0
add,//1
del,//2
search,
modify,
show,
sort,
};
struct Peoinfo
{
	char name[20];
	int age;
	char sex[5];
	char tele[12];
	char ader[30];
};
struct Contact
{
	struct Peoinfo data[MAX];//存放1000个结构体数据
	int size;//记录当前已有的元素个数
};

这是头文件·包含,设置两个结构体,第二个结构体嵌套第一个结构体,设置一个枚举常量,方便主函数调用

void menu()
{
	printf("****************************************************\n");
	printf("********  1.add             2.del            *********\n");
	printf("********  3.search          4.modify         *********\n");
	printf("********  5.show            6.sort           **********\n");
	printf("*********        7.exit                   *************\n");
	printf("****************************************************\n");
}
int main()
{
	int input;
	void Init_contact(struct Contact*ps);//声明函数
void Add_contact(struct Contact*ps);//声明函数
void Show_contact(const struct Contact*ps);//声明函数
void Del_contact(struct Contact*ps);//声明函数
void Search_contact(const struct Contact*ps);//声明函数
void Modify_contact(struct Contact*ps);//声明函数
void Sort_contact(struct Contact*ps);//声明函数
	//struct Peoinfo con[MAX];//存放1000个人的信息
	struct Contact con;//里面包含1000个元素的数data[1000]和当前已有的元素个数size
	Init_contact(&con);//初始化通讯录
	do
	{
		menu();
		printf("请选择:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case add:
			Add_contact(&con);
			break;
		case del:
			Del_contact(&con);
			break;
		case search:
			Search_contact(&con);
			break;
		case modify:
			Modify_contact(&con);
			break;
		case show:
			Show_contact(&con);
			break;
		case sort:
			Sort_contact(&con);
			break;
		case exit:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}

	} while (input);
	return 0;
}

这是主函数前面有个菜单,可以看出调用结构体用的都是传地址调用,好处就是方便,里面既有第一个结构体的数组,又有当前通讯录容量

void Init_contact(struct Contact* ps)//函数定义
{
	memset(ps->data, 0, sizeof(ps->data));//内存设置函数,把data空间都设置为0
	ps->size = 0;
}

void Add_contact(struct Contact* ps)
{
	if (ps->size == MAX)
	{
		printf("通讯录已经满了,无法增加\n");
	}
	else
	{
		printf("请输入名字\n");
		scanf("%s", ps->data[ps->size].name);//有了size个元素个数,下一个元素的下标是四则
		printf("请输入年龄\n");
		scanf("%d", &(ps->data[ps->size]).age);//这个用取地址是因为其他数组名也是地址
		printf("请输入性别\n");
		scanf("%s", ps->data[ps->size].sex);
		printf("请输入电话\n");
		scanf("%s", ps->data[ps->size].tele);
		printf("请输入地址\n");
		scanf("%s", ps->data[ps->size].ader);
		ps->size++;
		printf("添加成功\n");
	}
}
void Show_contact(const struct Contact* ps)
{
	if (ps->size == 0)
	{
		printf("通讯录为空\n");
	}
	else
	{
		int i;
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "住址");
		for (i = 0; i < ps->size; i++)
		{
			
			printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
				ps->data[i].name,
				ps->data[i].age,
				ps->data[i].sex,
				ps->data[i].tele,
				ps->data[i].ader);
		}
	}

}
int find_byname(const struct Contact* ps, char name[20])
{
	int i;
	for (i = 0; i < ps->size; i++)
	{
		if (strcmp(ps->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void Del_contact(struct Contact* ps)
{
	char name[20];
	printf("请输入你要删除人的名字\n");
	scanf("%s", &name);
	//查找这个要删除的人在什么位置
	/*int i;
	for (i = 0; i < ps->size; i++)
	{
		if (strcmp(ps->data[i].name, name) == 0)
		{
			break;
		}
	}
	if (i == ps->data)
	{
		printf("要删除的这个人不存在\n");
	}*/
	int ret = find_byname(ps,name);//找到了返回元素下标,找不到返回-1
	
	if(ret!=-1)
	{
		//删除这个数据
		int j = 0;
		for (j = ret; j < ps->size-1; j++)
		{
			ps->data[j] = ps->data[j + 1];
		}
		ps->size--;
		printf("删除成功\n");
	}
	else
	{
		printf("要删除的这个人不存在\n");
	}
}
void Search_contact(const struct Contact* ps)
{
	char name[20];
	printf("请输入你要查找人的名字\n");
	scanf("%s", &name);
	int ret=find_byname(ps, name);
	if (ret == -1)
	{
		printf("查无此人\n");
	}
	else
	{
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "住址");
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
				ps->data[ret].name,
				ps->data[ret].age,
				ps->data[ret].sex,
				ps->data[ret].tele,
				ps->data[ret].ader);
	}
}
void Modify_contact(struct Contact* ps)
{
	printf("请输入你要修改的名字\n");
	char name[20];
	scanf("%s", &name);
	int ret = find_byname(ps, name);
	if (ret == -1)
	{
		printf("你要修改的人不在通讯录\n");
	}
	else
	{
		printf("请输入名字\n");
		scanf("%s", ps->data[ret].name);
		printf("请输入年龄\n");
		scanf("%d", &(ps->data[ret]).age);
		printf("请输入性别\n");
		scanf("%s", ps->data[ret].sex);
		printf("请输入电话\n");
		scanf("%s", ps->data[ret].tele);
		printf("请输入地址\n");
		scanf("%s", ps->data[ret].ader);
		printf("添加成功\n");
	}
}
int cmp_contact_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Peoinfo*)e1)->name, ((struct Peoinfo*)e2)->name);
}
void Sort_contact(struct Contact* ps)
{
	qsort(ps->data, ps->size, sizeof(ps->data[0]), cmp_contact_by_name);
	printf("排序成功\n");
}

这是一系列函数实现,增删查找排序,显示,以前都有提过