【C语言】通讯录

这篇具有很好参考价值的文章主要介绍了【C语言】通讯录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C语言】通讯录,【C语言】,c语言

目录

一、关于通讯录

二、代码逻辑

三、通讯录实现

1.菜单设计

2.逻辑主要功能设计

3.增加联系人功能实现

4.显示全部联系人信息 

 5.删除联系人

6.查找联系人

7.修改联系人信息

8.对联系人进行排序

 9.一键清空所有联系人

四、完整源码

test.c

contact.c

contact.h


一、关于通讯录

在通讯录中,我们一般保存联系人的信息,联系人的信息一般会有 姓名、年龄、性别、电话、地址等。在通讯录中,我们也会对一些信息进行增删改查。

二、代码逻辑

代码文件

test.c 用于测试代码

contact.h 用于存放头文件

contact.c 用于主要代码的功能实现

  1. 菜单设计
  2. 功能实现

三、通讯录实现

1.菜单设计

void menu() 
{
	printf("***********************************\n");
	printf("****** 1. add      2. del    ******\n");
	printf("****** 3. search   4. modify ******\n");
	printf("****** 5. show     6. sort   ******\n");
	printf("****** 7. clear    0. exit   ******\n");
	printf("***********************************\n");
}

2.逻辑主要功能设计

因为有了菜单可以进行功能选择

功能实现的前提是  先对通讯录 进行设计 并 初始化

采用结构体进行设计

typedef struct PeoInfo 
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

typedef struct Contact 
{
	PeoInfo data[MAX];//存放通讯录数据
	int sz;//记录通讯录存了多少个数据
}Contact;

通讯录初始化(使用memset 将通讯录数据置0)

//初始化通讯录
void InitContact(Contact *pc) 
{
	assert(pc);//断言一下,避免空指针
	//将通讯录数据置0
	memset(pc->data,0,sizeof(pc->data)); //这里使用的内存函数,也可以使用for循环进行
	pc->sz = 0;//将记录通讯录信息个数置0
}

采用do ...while 和 switch 进行设计

	do 
	{
		menu();
		printf("请输入你的选择:>");
		scanf("%d",&input);
		switch (input) 
		{
		case ADD:
			AddContact(&con);//增加联系人
			break;
		case DEL:
			DelContact(&con);//删除联系人
			break;
		case SEARCH:
			SearchContact(&con);//查找联系人
			break;
		case MODIFY:
			ModifyContact(&con);//修改联系人信息
			break;
		case SHOW:
			ShowContact(&con);//显示全部联系人
			break;
		case SORT:
			SortContact(&con);//对联系人进行排序
			break;
		case CLEAR:
			InitContact(&con);//清空通讯录
			break;
		case EXIT:
			printf("退出通讯录!\n");
			break;
		default:
			Sleep(300);
			system("cls");//清屏
			printf("输入错误,请重新输入!\n");
		}
	} while (input);

在这里我们发现switch 语句中 的case 选项中的常量表达式 是字母,这里主要是利用了枚举常量。

enum Option 
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT,
	CLEAR
};

EXIT表示0 ,ADD表示1 依次类推... 

这样在switch语句中就增加了代码的可读性和可调试性

3.增加联系人功能实现

//增加联系人
void AddContact(Contact* pc) 
{
	assert(pc);
	//首先应该判断通讯录是否已满
	if (pc->sz == MAX) 
	{
		printf("通讯录已满,无法添加!\n");
		return;
	}

	Sleep(300);
	system("cls");//清屏
	//增加的信息
	//名字 年龄 性别 电话 地址
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n","名字","年龄","性别","电话","地址");
	printf("----------------------------------------------------------------------------\n");


	//增加信息
	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");
	Sleep(1000);
	system("cls");//清屏
}

【C语言】通讯录,【C语言】,c语言

4.显示全部联系人信息 

上述是增加联系人的信息,既然增加联系人我们就来查看联系人信息

//显示全部联系人
void ShowContact( const Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空!\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
	printf("----------------------------------------------------------------------------\n");
	for (int i = 0; i < pc -> sz;i++)
	{
		printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}

}

【C语言】通讯录,【C语言】,c语言

 5.删除联系人

这里采用的思想是 数组后面的元素前移将前面的元素覆盖来达到删除该信息的目的

这里是删除指定联系人

//按名字查找
static int FindByName(Contact* pc,char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz;i++)
	{
		if (strcmp(pc->data[i].name,name) == 0) 
		{
			return i;
		}
	}
	return -1;
}

//删除联系人
void DelContact(Contact* pc) 
{
	assert(pc);
	if (pc->sz == 0) 
	{
		printf("通讯录为空,无法删除!\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	char name[NAME_MAX];
	printf("输入要删除的名字:");
	scanf("%s",&name);
	int ret = FindByName(pc,name);
	if (ret == -1)
	{
		printf("要删除的联系人不存在\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	int i = 0;
	//进行删除的操作
	for (i = ret; i < pc->sz - 1;i++) 
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功!\n");
	Sleep(1000);
	system("cls");//清屏
}

【C语言】通讯录,【C语言】,c语言

6.查找联系人

//查找联系人
void SearchContact(Contact* pc) 
{
	assert(pc);
	char name[NAME_MAX];
	Sleep(1000);
	system("cls");//清屏
	printf("请输入要查找人的名字:");
	scanf("%s",name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要查找的联系人不存在\n");
		//Sleep(1000);
		//system("cls");//清屏
		return;
	}
	Sleep(1000);
	system("cls");//清屏
	//显示出查找的联系人
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
	printf("----------------------------------------------------------------------------\n");
	printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-18s\n",
			pc->data[ret].name,
			pc->data[ret].age,
			pc->data[ret].sex,
			pc->data[ret].tele,
			pc->data[ret].addr);
	Sleep(3000);
}

【C语言】通讯录,【C语言】,c语言

【C语言】通讯录,【C语言】,c语言

7.修改联系人信息

enum option_menu 
{
	EXIT,
	NAME ,
	AGE,
	SEX,
	TELE,
	ADDR
};
//修改联系人信息
void ModifyContact(Contact* pc) 
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要修改联系人的名字:");
	scanf("%s",name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要修改的联系人不存在\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}

	//修改联系人
	printf("**********\n");
	printf("#1. 名字 *\n#2. 年龄 *\n#3. 性别 *\n#4. 电话 *\n#5. 地址 *\n#0. 返回 *\n");
	printf("**********\n");
	int input = 0;
	do
	{
		//option_menu();
		printf("请选择你要的信息:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case NAME:
			printf("请输入名字:\n");
			scanf("%s", pc->data[ret].name);
			break;
		case AGE:
			printf("请输入年龄:\n");
			scanf("%d", &(pc->data[ret].age));
			break;
		case SEX:
			printf("请输入性别:\n");
			scanf("%s", pc->data[ret].sex);
			break;
		case TELE:
			printf("请输入电话:\n");
			scanf("%s", pc->data[ret].tele);
			break;
		case ADDR:
			printf("请输入地址:\n");
			scanf("%s", pc->data[ret].addr);
			break;
		case EXIT:
			printf("返回主界面\n");
			return;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}

	} while (input);

}

【C语言】通讯录,【C语言】,c语言

【C语言】通讯录,【C语言】,c语言

8.对联系人进行排序

int cmp_name(const void* s1,const void* s2) 
{
	return strcmp(((Contact*)s1)->data->name, ((Contact*)s2)->data->name);
}
int cmp_age(const void* s1,const void* s2)
{
	return ((Contact*)s1)->data->age - ((Contact*)s2)->data->age;
}
//排序
void SortContact(Contact* pc) 
{
	assert(pc);
	if (pc->sz == 0) 
	{
		printf("通讯录为空,无法排序 !");
		return;
	}
	int input = 0;
	printf("***********\n");
	printf("# 1. 名字 *\n# 2. 年龄 *\n");
	printf("***********\n");
	printf("请选择排序的方法:");
	scanf("%d",&input);
	if (input == 1) 
	{
		//按名字进行排序
		qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_name);
		printf("----------------------------------------------------------------------------\n");
		printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
		printf("----------------------------------------------------------------------------\n");
		for (int i = 0; i < pc->sz; i++)
		{
			printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
				pc->data[i].name,
				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].tele,
				pc->data[i].addr);
		}
	}
	else if (input == 2) 
	{
		//按年龄进行排序
		qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_age);
		printf("----------------------------------------------------------------------------\n");
		printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
		printf("----------------------------------------------------------------------------\n");
		for (int i = 0; i < pc->sz; i++)
		{
			printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
				pc->data[i].name,
				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].tele,
				pc->data[i].addr);
		}
	}
}

先展示一下原来数据的信息

【C语言】通讯录,【C语言】,c语言

 排序1

【C语言】通讯录,【C语言】,c语言

排序2

【C语言】通讯录,【C语言】,c语言

 9.一键清空所有联系人

 这里是直接调用的初始化通讯录函数

//初始化通讯录
void InitContact(Contact *pc) 
{
	assert(pc);//断言一下,避免空指针
	//将通讯录数据置0
	memset(pc->data,0,sizeof(pc->data)); //这里使用的内存函数,也可以使用for循环进行
	pc->sz = 0;//将记录通讯录信息个数置0
}

【C语言】通讯录,【C语言】,c语言

四、完整源码

test.c

#define _CRT_SECURE_NO_WARNINGS 
//用于测试
#include "contact.h"
void menu() 
{
	printf("***********************************\n");
	printf("****** 1. add      2. del    ******\n");
	printf("****** 3. search   4. modify ******\n");
	printf("****** 5. show     6. sort   ******\n");
	printf("****** 7. clear    0. exit   ******\n");
	printf("***********************************\n");
}
enum Option 
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT,
	CLEAR
};
int main() 
{
	int input = 0;
	Contact con;//con 通讯录对象
	InitContact(&con);//初始化通讯录

	do 
	{
		menu();
		printf("请输入你的选择:>");
		scanf("%d",&input);
		switch (input) 
		{
		case ADD:
			AddContact(&con);//增加联系人
			break;
		case DEL:
			DelContact(&con);//删除联系人
			break;
		case SEARCH:
			SearchContact(&con);//查找联系人
			break;
		case MODIFY:
			ModifyContact(&con);//修改联系人信息
			break;
		case SHOW:
			ShowContact(&con);//显示全部联系人
			break;
		case SORT:
			SortContact(&con);//对联系人进行排序
			break;
		case CLEAR:
			InitContact(&con);//清空通讯录
			break;
		case EXIT:
			printf("退出通讯录!\n");
			break;
		default:
			Sleep(300);
			system("cls");//清屏
			printf("输入错误,请重新输入!\n");
		}
	} while (input);
	return 0;
}

contact.c

#define _CRT_SECURE_NO_WARNINGS 
#include "contact.h"

//用于实现函数

//初始化通讯录
void InitContact(Contact *pc) 
{
	assert(pc);//断言一下,避免空指针
	//将通讯录数据置0
	memset(pc->data,0,sizeof(pc->data)); //这里使用的内存函数,也可以使用for循环进行
	pc->sz = 0;//将记录通讯录信息个数置0
}

//增加联系人
void AddContact(Contact* pc) 
{
	assert(pc);
	//首先应该判断通讯录是否已满
	if (pc->sz == MAX) 
	{
		printf("通讯录已满,无法添加!\n");
		return;
	}

	Sleep(300);
	system("cls");//清屏
	//增加的信息
	//名字 年龄 性别 电话 地址
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n","名字","年龄","性别","电话","地址");
	printf("----------------------------------------------------------------------------\n");


	//增加信息
	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");
	Sleep(1000);
	system("cls");//清屏
}

//显示全部联系人
void ShowContact( const Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空!\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
	printf("----------------------------------------------------------------------------\n");
	for (int i = 0; i < pc -> sz;i++)
	{
		printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}

}
//按名字查找
static int FindByName(Contact* pc,char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz;i++)
	{
		if (strcmp(pc->data[i].name,name) == 0) 
		{
			return i;
		}
	}
	return -1;
}

//删除联系人
void DelContact(Contact* pc) 
{
	assert(pc);
	if (pc->sz == 0) 
	{
		printf("通讯录为空,无法删除!\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	char name[NAME_MAX];
	printf("输入要删除的名字:");
	scanf("%s",&name);
	int ret = FindByName(pc,name);
	if (ret == -1)
	{
		printf("要删除的联系人不存在\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	int i = 0;
	//进行删除的操作
	for (i = ret; i < pc->sz - 1;i++) 
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功!\n");
}

//查找联系人
void SearchContact(Contact* pc) 
{
	assert(pc);
	char name[NAME_MAX];
	Sleep(1000);
	system("cls");//清屏
	printf("请输入要查找人的名字:");
	scanf("%s",name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要查找的联系人不存在\n");
		//Sleep(1000);
		//system("cls");//清屏
		return;
	}
	Sleep(1000);
	system("cls");//清屏
	//显示出查找的联系人
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
	printf("----------------------------------------------------------------------------\n");
	printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-18s\n",
			pc->data[ret].name,
			pc->data[ret].age,
			pc->data[ret].sex,
			pc->data[ret].tele,
			pc->data[ret].addr);
	Sleep(3000);
}


enum option_menu 
{
	EXIT,
	NAME ,
	AGE,
	SEX,
	TELE,
	ADDR
};
//修改联系人信息
void ModifyContact(Contact* pc) 
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要修改联系人的名字:");
	scanf("%s",name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要修改的联系人不存在\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}

	//修改联系人
	printf("**********\n");
	printf("#1. 名字 *\n#2. 年龄 *\n#3. 性别 *\n#4. 电话 *\n#5. 地址 *\n#0. 返回 *\n");
	printf("**********\n");
	int input = 0;
	do
	{
		//option_menu();
		printf("请选择你要的信息:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case NAME:
			printf("请输入名字:\n");
			scanf("%s", pc->data[ret].name);
			break;
		case AGE:
			printf("请输入年龄:\n");
			scanf("%d", &(pc->data[ret].age));
			break;
		case SEX:
			printf("请输入性别:\n");
			scanf("%s", pc->data[ret].sex);
			break;
		case TELE:
			printf("请输入电话:\n");
			scanf("%s", pc->data[ret].tele);
			break;
		case ADDR:
			printf("请输入地址:\n");
			scanf("%s", pc->data[ret].addr);
			break;
		case EXIT:
			printf("返回主界面\n");
			return;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}

	} while (input);

}



int cmp_name(const void* s1,const void* s2) 
{
	return strcmp(((Contact*)s1)->data->name, ((Contact*)s2)->data->name);
}
int cmp_age(const void* s1,const void* s2)
{
	return ((Contact*)s1)->data->age - ((Contact*)s2)->data->age;
}
//排序
void SortContact(Contact* pc) 
{
	assert(pc);
	if (pc->sz == 0) 
	{
		printf("通讯录为空,无法排序 !");
		return;
	}
	int input = 0;
	printf("***********\n");
	printf("# 1. 名字 *\n# 2. 年龄 *\n");
	printf("***********\n");
	printf("请选择排序的方法:");
	scanf("%d",&input);
	if (input == 1) 
	{
		//按名字进行排序
		qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_name);
		printf("----------------------------------------------------------------------------\n");
		printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
		printf("----------------------------------------------------------------------------\n");
		for (int i = 0; i < pc->sz; i++)
		{
			printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
				pc->data[i].name,
				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].tele,
				pc->data[i].addr);
		}
	}
	else if (input == 2) 
	{
		//按年龄进行排序
		qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_age);
		printf("----------------------------------------------------------------------------\n");
		printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
		printf("----------------------------------------------------------------------------\n");
		for (int i = 0; i < pc->sz; i++)
		{
			printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
				pc->data[i].name,
				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].tele,
				pc->data[i].addr);
		}
	}
}

contact.h

#pragma once

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30

#define MAX 1000 //用于存放通信录信息的条数
//用于声明函数

typedef struct PeoInfo 
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

typedef struct Contact 
{
	PeoInfo data[MAX];//存放通讯录数据
	int sz;//记录通讯录存了多少个数据
}Contact;

//初始化通讯录
void InitContact(Contact * pc);

//增加联系人
void AddContact(Contact* pc);

//显示全部联系人
void ShowContact(Contact* pc);

//删除联系人
void DelContact(Contact* pc);

//查找联系人
void SearchContact(Contact* pc);

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

//排序
void SortContact(Contact* pc);

五、动态增容版本

因为上方的功能只能 对固定通讯录的人数进行增删改查,所以对上方代码进行增加使用了calloc、realloc等动态内存函数。来使通讯录的容量可以进行动态的变更

直接上源码文章来源地址https://www.toymoban.com/news/detail-720311.html

test.c

#define _CRT_SECURE_NO_WARNINGS 
//用于测试
#include "contact.h"
void menu() 
{
	printf("***********************************\n");
	printf("****** 1. add      2. del    ******\n");
	printf("****** 3. search   4. modify ******\n");
	printf("****** 5. show     6. sort   ******\n");
	printf("****** 7. clear    0. exit   ******\n");
	printf("***********************************\n");
}
enum Option 
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT,
	CLEAR
};
int main() 
{
	int input = 0;
	Contact con;//con 通讯录对象
	InitContact(&con);//初始化通讯录

	do 
	{
		menu();
		printf("请输入你的选择:>");
		scanf("%d",&input);
		switch (input) 
		{
		case ADD:
			AddContact(&con);//增加联系人
			break;
		case DEL:
			DelContact(&con);//删除联系人
			break;
		case SEARCH:
			SearchContact(&con);//查找联系人
			break;
		case MODIFY:
			ModifyContact(&con);//修改联系人信息
			break;
		case SHOW:
			ShowContact(&con);//显示全部联系人
			break;
		case SORT:
			SortContact(&con);//对联系人进行排序
			break;
		case CLEAR:
			InitContact(&con);//清空通讯录
			break;
		case EXIT:
			DestoryContact(&con);
			printf("退出通讯录!\n");
			break;
		default:
			Sleep(300);
			system("cls");//清屏
			printf("输入错误,请重新输入!\n");
		}
	} while (input);
	return 0;
}

contact.c

#define _CRT_SECURE_NO_WARNINGS 
#include "contact.h"

//用于实现函数

//初始化通讯录
//静态版本
//void InitContact(Contact *pc) 
//{
//	assert(pc);//断言一下,避免空指针
//	//将通讯录数据置0
//	memset(pc->data,0,sizeof(pc->data)); //这里使用的内存函数,也可以使用for循环进行
//	pc->sz = 0;//将记录通讯录信息个数置0
//}
void InitContact(Contact *pc) 
{
	assert(pc);//断言一下,避免空指针
	pc->sz = 0;
	pc->capacity = DEFAULT_SZ;
	pc->data = calloc(pc->capacity,sizeof(PeoInfo));
	if (pc->data == NULL) 
	{
		perror("InitContact->calloc");
		return;
	}
}

//增加联系人.静态版本
//void AddContact(Contact* pc) 
//{
//	assert(pc);
//	//首先应该判断通讯录是否已满
//	if (pc->sz == MAX) 
//	{
//		printf("通讯录已满,无法添加!\n");
//		return;
//	}
//
//	Sleep(300);
//	system("cls");//清屏
//	//增加的信息
//	//名字 年龄 性别 电话 地址
//	printf("----------------------------------------------------------------------------\n");
//	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n","名字","年龄","性别","电话","地址");
//	printf("----------------------------------------------------------------------------\n");
//
//
//	//增加信息
//	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");
//	Sleep(1000);
//	system("cls");//清屏
//}

void CheckCapacity(Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data,(pc->capacity+2)*sizeof(PeoInfo));
		if (ptr != NULL) 
		{
			pc->data = ptr;
			pc->capacity+= 2;
			printf("增容成功!");
		}
		else
		{
			perror("AddContact->realloc");
			return;
		}
	}
}
//动态版本
void AddContact(Contact* pc)
{
	assert(pc);
	//增加容量
	CheckCapacity(pc);

	Sleep(300);
	system("cls");//清屏
	//增加的信息
	//名字 年龄 性别 电话 地址
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
	printf("----------------------------------------------------------------------------\n");


	//增加信息
	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");
	Sleep(1000);
	system("cls");//清屏
}

//显示全部联系人
void ShowContact(  const Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空!\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
	printf("----------------------------------------------------------------------------\n");
	for (int i = 0; i < pc -> sz;i++)
	{
		printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}

}
//按名字查找
static int FindByName(Contact* pc,char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz;i++)
	{
		if (strcmp(pc->data[i].name,name) == 0) 
		{
			return i;
		}
	}
	return -1;
}

//删除联系人
void DelContact(Contact* pc) 
{
	assert(pc);
	if (pc->sz == 0) 
	{
		printf("通讯录为空,无法删除!\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	char name[NAME_MAX];
	printf("输入要删除的名字:");
	scanf("%s",&name);
	int ret = FindByName(pc,name);
	if (ret == -1)
	{
		printf("要删除的联系人不存在\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	int i = 0;
	//进行删除的操作
	for (i = ret; i < pc->sz - 1;i++) 
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功!\n");
}

//查找联系人
void SearchContact(Contact* pc) 
{
	assert(pc);
	char name[NAME_MAX];
	Sleep(1000);
	system("cls");//清屏
	printf("请输入要查找人的名字:");
	scanf("%s",name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要查找的联系人不存在\n");
		//Sleep(1000);
		//system("cls");//清屏
		return;
	}
	Sleep(1000);
	system("cls");//清屏
	//显示出查找的联系人
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
	printf("----------------------------------------------------------------------------\n");
	printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-18s\n",
			pc->data[ret].name,
			pc->data[ret].age,
			pc->data[ret].sex,
			pc->data[ret].tele,
			pc->data[ret].addr);
	Sleep(3000);
}


enum option_menu 
{
	EXIT,
	NAME ,
	AGE,
	SEX,
	TELE,
	ADDR
};
//修改联系人信息
void ModifyContact(Contact* pc) 
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要修改联系人的名字:");
	scanf("%s",name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要修改的联系人不存在\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}

	//修改联系人
	printf("**********\n");
	printf("#1. 名字 *\n#2. 年龄 *\n#3. 性别 *\n#4. 电话 *\n#5. 地址 *\n#0. 返回 *\n");
	printf("**********\n");
	int input = 0;
	do
	{
		//option_menu();
		printf("请选择你要的信息:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case NAME:
			printf("请输入名字:\n");
			scanf("%s", pc->data[ret].name);
			break;
		case AGE:
			printf("请输入年龄:\n");
			scanf("%d", &(pc->data[ret].age));
			break;
		case SEX:
			printf("请输入性别:\n");
			scanf("%s", pc->data[ret].sex);
			break;
		case TELE:
			printf("请输入电话:\n");
			scanf("%s", pc->data[ret].tele);
			break;
		case ADDR:
			printf("请输入地址:\n");
			scanf("%s", pc->data[ret].addr);
			break;
		case EXIT:
			printf("返回主界面\n");
			return;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}

	} while (input);

}



int cmp_name(const void* s1,const void* s2) 
{
	return strcmp(((Contact*)s1)->data->name, ((Contact*)s2)->data->name);
}
int cmp_age(const void* s1,const void* s2)
{
	return ((Contact*)s1)->data->age - ((Contact*)s2)->data->age;
}
//排序
void SortContact(Contact* pc) 
{
	assert(pc);
	if (pc->sz == 0) 
	{
		printf("通讯录为空,无法排序 !");
		return;
	}
	int input = 0;
	printf("***********\n");
	printf("# 1. 名字 *\n# 2. 年龄 *\n");
	printf("***********\n");
	printf("请选择排序的方法:");
	scanf("%d",&input);
	if (input == 1) 
	{
		//按名字进行排序
		qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_name);
		printf("----------------------------------------------------------------------------\n");
		printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
		printf("----------------------------------------------------------------------------\n");
		for (int i = 0; i < pc->sz; i++)
		{
			printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
				pc->data[i].name,
				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].tele,
				pc->data[i].addr);
		}
	}
	else if (input == 2) 
	{
		//按年龄进行排序
		qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_age);
		printf("----------------------------------------------------------------------------\n");
		printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
		printf("----------------------------------------------------------------------------\n");
		for (int i = 0; i < pc->sz; i++)
		{
			printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
				pc->data[i].name,
				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].tele,
				pc->data[i].addr);
		}
	}
}

void DestoryContact(Contact* pc) 
{
	free(pc->data);
	pc->data = NULL;
	pc->sz = 0;
	pc->capacity = 0;
}

contact.h 

#pragma once

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30

#define MAX 1000 //用于存放通信录信息的条数

#define DEFAULT_SZ 3//默认值
//用于声明函数

typedef struct PeoInfo 
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

//静态版本通讯录
//typedef struct Contact 
//{
//	PeoInfo data[MAX];//存放通讯录数据
//	int sz;//记录通讯录存了多少个数据
//}Contact;
//动态版本
typedef struct  Contact 
{
	PeoInfo* data;//存放数量
	int sz;//记录的当时通讯录中存放的人的信息个数
	int capacity;//记录的是通讯录的当前容量
}Contact;

//初始化通讯录
void InitContact(Contact * pc);

//增加联系人
void AddContact(Contact* pc);

//显示全部联系人
void ShowContact(const Contact* pc);

//删除联系人
void DelContact(Contact* pc);

//查找联系人
void SearchContact(Contact* pc);

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

//排序
void SortContact(Contact* pc);

//动态内存的释放
void DestoryContact(Contact* pc);

到了这里,关于【C语言】通讯录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言---认识动态内存管理并实现一个动态通讯录:静态通讯录别来沾边

    👧个人主页:@小沈熬夜秃头中୧⍤⃝❅ 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 📋专栏:C语言学习 🔑本章内容:动态内存管理 送给各位💌:当你的能力还驾驭不了你的目标时那你就应该沉下心来历练 记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~ 提示:以下是本篇

    2024年02月08日
    浏览(92)
  • 【c语言】通讯录(静态)

    小张刚学习完结构体,枚举,联合相关的知识,实践实践,写一个通讯录呗! 通讯录的功能 1.通讯录可存放100的信息 2.信息的内容姓名,性别,年龄,电话,地址 3.支持增加联系人 4.支持删除联系人 5.支持查找联系人 6.支持修改联系人 7.支持排序联系人 8.打印数据 文件类型

    2024年02月13日
    浏览(43)
  • 通讯录实现【C语言】

    目录 前言 一、整体逻辑分析 二、实现步骤 1、创建菜单和多次操作问题 2、创建通讯录 3、初始化通讯录 4、添加联系人 5、显示联系人 6、删除指定联系人 ​7、查找指定联系人 8、修改联系人信息 9、排序联系人信息 三、全部源码 我们上期已经详细的介绍了自定义类型,本

    2024年02月11日
    浏览(60)
  • 【C语言】实战项目——通讯录

    学会创建一个通讯录,对过往知识进行加深和巩固。 文章很长,要耐心学完哦!                ✨  猪巴戒 :个人主页✨                 所属专栏 :《C语言进阶》         🎈 跟着猪巴戒 ,一起学习C语言🎈 目录 引言 实战 建立文件 包含头文件 结构体的使用 

    2024年02月04日
    浏览(51)
  • 【C语言】通讯录(文件) -- 详解

    前面介绍了 【C语言】静态通讯录 -- 详解_炫酷的伊莉娜的博客-CSDN博客 和 【C语言】动态通讯录 -- 详解_炫酷的伊莉娜的博客-CSDN博客 。当通讯录运行起来时,可以对通讯录中的数据进行增加、删除或修改等。此时数据是存放在内存中,当程序退出时,通讯录中的数据自然就

    2024年02月12日
    浏览(41)
  • C语言进阶——静态通讯录

    作者: 敲代码の流川枫 博客主页:流川枫的博客 专栏:C语言从入门到进阶 语录: Stay hungry stay foolish 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击免费注册和我一起刷题吧 目录 1.contact.h——通讯录相关的声明 2.contact.c——通讯录相关的

    2024年02月16日
    浏览(46)
  • 动态通讯录实现(C语言)

    目录 前言: 一:单个节点的设计和主逻辑  结点设计 主逻辑 二:接口实现 (1)生成一个新的结点 (2)增加信息 (3)打印信息 (4)查找  (5)删除信息 (6)修改信息 (7)排序  插入排序 快速排序 (8)已有数据读取 (9)更新数据录入 三:全部代码 contact.h(声明) contact.c(接口) test.c(主逻辑) 本

    2024年02月05日
    浏览(58)
  • C语言--通讯录的实现

    人的信息:姓名+年龄+性别+住址+电话 通讯录中可以存放100个人的信息 增加联系人 删除指定联系人 查找指定联系人 修改指定联系人 显示所有联系人的信息 test.c----测试通讯录 contact.c----通讯录的实现 contact.h----函数的声明 代码如下(示例): 代码如下(示例):

    2024年02月15日
    浏览(48)
  • 通讯录(纯C语言实现)

    相信大家都有过通讯录,今天我来带大家实现以下最简单的通讯录,通过本篇文章,相信可以让大家对C语言有进一步的认识。 话不多说,我们先放函数的实现  是不是看到这里会感到很害怕??不用怕,跟着我的思路,你也可以实现它,我带着你一步一步实现每一个功能  

    2024年02月16日
    浏览(48)
  • 【C语言】动态通讯录 -- 详解

    前面详细介绍了静态版通讯录【C语言】静态通讯录 -- 详解_炫酷的伊莉娜的博客-CSDN博客,但是静态版通讯录的空间是无法被改变的,而且空间利用率也不高。为了解决静态通讯录这一缺点,这时就要有一个能够随着存入联系人数量的增加而增大空间的通讯录。接下来我们将

    2024年02月12日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包