当前位置: 首页 > news >正文

结构体通讯录——C语言知识运用

C语言知识综合运用——通讯录

实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、年龄、电话、住址

提供方法:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人
  8. 通讯录整体导出文件
  9. 通讯录整体导入文件
    基本思路:利用结构体来存储
    要实现通讯录可以用来存储联系人的信息通讯录大小随联系人的数量增多空间而变大,每个人的信息又要包括: 姓名、性别、年龄、电话、住址 。所以自然而然就想到使用结构体,一个结构体是一个人的信息,那么要存储个人的信息,元素类型为结构体类型的数组来存储,为了方便,我们将这个数组再放进一个结构体中,这样程序可读性提高了,我们使用起来也方便。

头文件Contact.h

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>

typedef struct Contact// 联系人
{
	char _Name[24];
	char _Tel[16];
	char _Address[64];
	int age;
}Contact;

typedef struct ContactBook//通讯录
{
	Contact* _con_arrary;//联系人结构体指针
	size_t _size;//联系人个数
	size_t _capacity;//通讯录容量
}ContactBook;

void ContactBookAppend_1(ContactBook* pbook, Contact* pcon);//初始化添加联系人
void ContactBookInit(ContactBook* pbook); //初始化通讯录
void ContactBookDestory(ContactBook* pbook);//通讯录销毁
void ContactBookAppend_2(ContactBook* pbook);//添加联系人
void ContactBookDelete(ContactBook* pbook);//删除指定联系人
void ContactBookFind(ContactBook* pbook); //查找指定联系人
void ContactBookUpdate(ContactBook* pbook);//修改指定联系人
void ContactBookSave(ContactBook* pbook,const char* file);//文件读入
void ContactBookLoad(ContactBook* pbook,const char* file);//文件读出
void ContactPrint(ContactBook* pbook);//输出联系人
void ContactName_Sort(ContactBook* pbook);//按姓名排名
void ContactMenu();//通讯录菜单

函数实现Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"

//初始化通讯录
void ContactBookInit(ContactBook* pbook) 
{
	assert(pbook);

	pbook->_con_arrary = (Contact*)malloc(sizeof(Contact)* 8);//申请空间
	if (pbook->_con_arrary == NULL)//判断是否成功申请空间
	{
		printf("mallloc error!!!");
		exit(-1);
	}

	pbook->_size = 0;
	pbook->_capacity = 8;
}

//初始化添加联系人
void ContactBookAppend_1(ContactBook* pbook, Contact* pcon)
{
	assert(pbook && pcon);
	if (pbook->_size >= pbook->_capacity)
	{
		pbook->_capacity *= 2;
		Contact* newarray = realloc(pbook->_con_arrary, sizeof(Contact)*pbook->_capacity);
		if (newarray == NULL)
		{
			printf("realloc error\n");
			exit(-1);
		}

		pbook->_con_arrary = newarray;
	}

	Contact* array = pbook->_con_arrary;
	size_t i = pbook->_size;
	strcpy(array[i]._Name, pcon->_Name);
	strcpy(array[i]._Address, pcon->_Address);
	strcpy(array[i]._Tel, pcon->_Tel);
	array[i].age = pcon->age;

	pbook->_size++;
}

//添加联系人
void ContactBookAppend_2(ContactBook* pbook)
{
	assert(pbook);
	int ret = 1;
	do
	{
		if ((pbook->_size) > (pbook->_capacity))//判断空间是否够用
		{
			pbook->_capacity *= 2;
			Contact* _new_arrary = realloc(pbook->_con_arrary, sizeof(Contact)*pbook->_capacity);//利用realloc()申请地址
			if (_new_arrary == NULL)//判断空间是否申请成功
			{
				printf("realloc error!!!");
				exit(-1);
			}
			pbook->_con_arrary = _new_arrary;//重新接受新申请的空间
		}

		Contact* arrary = pbook->_con_arrary;
		size_t i = pbook->_size;

		//进行赋值
		printf("请输入名字:\n");
		scanf("%s", pbook->_con_arrary[i]._Name);
		printf("请输入年龄:\n");
		scanf("%d", &pbook->_con_arrary[i].age);
		printf("请输入电话:\n");
		scanf("%s", pbook->_con_arrary[i]._Tel);
		printf("请输入地址:\n");
		scanf("%s", pbook->_con_arrary[i]._Address);
		pbook->_size++;//人数增加一个
		printf("保存成功!!!\n");
		printf("是否继续,继续:1,退出:0:");
		scanf("%d", &ret);
		while (ret!=0&&ret!=1)
		{
			printf("输入错误,请从新输入:");
			scanf("%d", &ret);
		}
	} while (ret);
}

//输出联系人
void ContactPrint(ContactBook* pbook)
{
	assert(pbook);//判断输入的不为空
	if (pbook->_con_arrary != NULL)
	{
		for (size_t i = 0; i < pbook->_size; i++)//循环遍历
		{

			printf("============================================\n");
			printf("姓名:%s\n", pbook->_con_arrary[i]._Name);
			printf("年龄:%d\n", pbook->_con_arrary[i].age);
			printf("电话:%s\n", pbook->_con_arrary[i]._Tel);
			printf("地址:%s\n", pbook->_con_arrary[i]._Address);
			printf("============================================\n");
		}
	}
	else
	{
		printf("通讯录无联系人!!!\n");
	}
}

//销毁整个通讯录
void ContactBookDestory(ContactBook* pbook)
{
	assert(pbook);//判断输入的是否为空

	free(pbook->_con_arrary);
	pbook->_con_arrary = NULL;
	pbook->_capacity = 0;
	pbook->_size = 0;
	printf("清空完成!!!\n");
}

//位置查找函数
int Find(ContactBook* pbook, const char* name)
{
	assert(pbook && name);//判断输入的指针时候为空

	size_t i = 0;
	for (i; i < pbook->_size; i++)
	{
		if (0 == strcmp(pbook->_con_arrary[i]._Name, name))
		{
			return i;
		}
	}
	return -1;
}

//文件读入
void ContactBookSave(ContactBook* pbook, const char* file)
{
	assert(pbook&&file);//判断输入是否为空

	FILE* fout = fopen(file, "wb");//创建一个文件
	if (fout == NULL)
	{
		printf("打开文件失败\n");
	}

	Contact* array = pbook->_con_arrary;
	for (size_t i = 0; i < pbook->_size - 1; i++)
	{
		fwrite(&array[i], sizeof(Contact), 1, fout);
	}
	fclose(fout);
	printf("读入完成!!!\n");
}

//文件读出
void ContactBookLoad(ContactBook* pbook, const char* file)
{
	FILE* fin = fopen(file, "rb");
	if (fin == NULL)
	{
		printf("打开文件失败\n");
		exit(-1);
	}
	Contact con;
	while (fread(&con, sizeof(Contact), 1, fin) == 1);
	{
		ContactBookAppend_1(pbook, &con);
	}
	fclose(fin);
	printf("读出完成!!!\n");
}

//修改指定联系人
void ContactBookUpdate(ContactBook* pbook)
{
	assert(pbook);
	int find_name = 0;
	char name[20] = { 0 };
	int ret = 0;
	do
	{
		printf("请输入要修改的名字:\n");
		scanf("%s", name);
		find_name = Find(pbook, name);
		if (find_name != -1)
		{
			printf("请输入要修改的信息:\n");
			printf("年龄:\n");
			int new_age = 0;
			scanf("%d", &new_age);
			pbook->_con_arrary[find_name].age = new_age;

			printf("电话:\n");
			char new_tel[20] = { 0 };
			scanf("%s", new_tel);
			strcpy(pbook->_con_arrary[find_name]._Tel, new_tel);

			printf("地址:\n");
			char new_address[40] = { 0 };
			scanf("%s", new_address);
			strcpy(pbook->_con_arrary[find_name]._Address, new_address);

			printf("修改成功!!!\n");
		}
		else
		{
			printf("查无此人,修改失败!!!\n");
		}

		printf("是否继续修改,继续:1,结束:0\n");
		scanf("%d", &ret);
		while (ret != 0 && ret != 1)
		{
			printf("输入错误,重新选择:");
			scanf("%d", &ret);
		}

	} while (ret);

}

//删除指定联系人
void ContactBookDelete(ContactBook* pbook)
{
	assert(pbook);//检查输入是否为空
	int find_name = 0;
	char name[20] = { 0 };
	int ret = 0;
	int i = 0;
	do
	{
		printf("请输入要删除的名字:\n");
		scanf("%s", name);
		find_name = Find(pbook, name);
		if (find_name != -1)
		{
			for (size_t i = find_name; i < pbook->_size; i++)
			{
				pbook->_con_arrary[i] = pbook->_con_arrary[i + 1];//将该联系人后面的联系人往前一位,覆盖	
			}
			pbook->_size--;
		    printf("删除成功!!!\n");
		}
		if (find_name == -1)
		{
			printf("查无此人,删除失败!!!");
		}

		printf("是否继续查找,继续:1,结束:0\n");
		scanf("%d", &ret);
		while (ret != 0 && ret != 1)
		{
			printf("输入错误,重新选择:");
			scanf("%d", &ret);
		}

	} while (ret);
}

//查找指定联系人
void ContactBookFind(ContactBook* pbook)
{
	assert(pbook);
	int find_name = 0;
	char name[20] = { 0 };
	int ret = 0;
	do
	{
		printf("请输入要查找的名字:\n");
		scanf("%s", name);
		find_name = Find(pbook, name);
		if (find_name != -1)
		{
			printf("============================================\n");
			printf("姓名:%s\n", pbook->_con_arrary[find_name]._Name);
			printf("年龄:%d\n", pbook->_con_arrary[find_name].age);
			printf("电话:%s\n", pbook->_con_arrary[find_name]._Tel);
			printf("地址:%s\n", pbook->_con_arrary[find_name]._Address);
			printf("============================================\n");
			printf("查询成功!!!\n");
		}
		else
		{
			printf("查无此人,查询失败!!!\n");
		}

		printf("是否继续查找,继续:1,结束:0\n");
		scanf("%d", &ret);
		while (ret != 0 && ret != 1)
		{
			printf("输入错误,重新选择:");
			scanf("%d", &ret);
		}

	} while (ret);
}

//按姓名排名
void ContactName_Sort(ContactBook* pbook)//从A-Z排序
{
	assert(pbook);
	size_t i = 0;
	size_t j = 0;
    
	printf("按照姓名A-Z的顺序为:\n");
	for (i; i < pbook->_size; i++)
	{
		for (j; j < pbook->_size - i - 1; j++)
		{
			if (strcmp(pbook->_con_arrary[j]._Name, pbook->_con_arrary[j + 1]._Name)>0)//比较交换
			{
				Contact tmp;
				tmp = pbook->_con_arrary[j];
				pbook->_con_arrary[j] = pbook->_con_arrary[j + 1];
				pbook->_con_arrary[j + 1] = tmp;
			}
		}
	}
	ContactPrint(pbook);
}

//通讯录菜单
void ContactMenu()
{
	printf("***********************************************\n");
	printf("*******             通讯录              *******\n");
	printf("***********************************************\n");
	printf("*******1:添加联系人        2:查找联系人*******\n");
	printf("*******3:修改联系人        4:删除联系人*******\n");
	printf("*******5:排序联系人        6:导出通讯录*******\n");
	printf("*******7:导入通讯录        8:清空通讯录*******\n");
	printf("*******9:打印通讯录        0: 退出通讯录*******\n");
	printf("***********************************************\n");

}

测试文件test.h

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"

int main()
{
	int input = 0;
	ContactBook cb;
	Contact con1;
	ContactBookInit(&cb);//初始化通讯录
	strcpy(con1._Name, "宁采臣");
	strcpy(con1._Address, "郭北县");
	strcpy(con1._Tel, "12345678996");
	con1.age = 25;
	Contact con2;
	strcpy(con2._Name, "聂小倩");
	strcpy(con2._Address, "兰若寺");
	strcpy(con2._Tel, "88967458666");
	con2.age = 100;
	Contact con3;
	strcpy(con3._Name, "黑山老妖");
	strcpy(con3._Address, "兰若寺");
	strcpy(con3._Tel, "85967412333");
	con3.age = 1000;
	
	
	ContactBookAppend_1(&cb, &con1);//初始化添加联系人
	ContactBookAppend_1(&cb, &con2);
    ContactBookAppend_1(&cb, &con3);

	do
	{
        ContactMenu();
		printf("请选择功能:");
		scanf("%d", &input);
		switch (input)
		{
		case 1 :
			ContactBookAppend_2(&cb);//添加指定联系人		
			break;
		case 2:
			system("cls");
			ContactBookFind(&cb);//查询指定联系人
			break;
		case 3:
			system("cls");
			ContactBookUpdate(&cb);//修改指定联系人
			break;
		case 4:
			system("cls");
			ContactBookDelete(&cb);//删除指定联系人
			break;
		case 5:
			system("cls");
			ContactName_Sort(&cb);//从A-Z排序
			break;
		case 6:
			system("cls");
			ContactBookLoad(&cb, "Contact.txt");//文件写
			break;
		case 7:
			system("cls");
			ContactBookSave(&cb, "Contact.txt");//文件读入
			break;
		case 8:
			system("cls");
			ContactBookDestory(&cb);//删除通讯录
			break;
		case 9:
			system("cls");
			ContactPrint(&cb);//打印通讯录
			break;
		default:
			break;
		}
	} while (input);

	system("pause");
	return 0;
}

运行截图:
运行截图

相关文章:

  • 编译和宏的理解
  • 时间空间复杂度——详解
  • 【数据结构:队列】——队列的实现(C语言)
  • 【数据结构:栈】——栈的实现(C语言)
  • 【数据结构:链表】——无头单向非循环链表的实现(C语言)
  • 【数据结构:链表】——带头双向循环链表的实现(C语言)
  • 【数据结构:堆】——堆及堆的相关操作(C语言)
  • c++入门——基础知识点(1)
  • c/c++内存管理
  • 函数模板、类模板初识
  • 【Linux】进程地址空间了解
  • 【Linux】入门基础命令(1)
  • c++入门——基础知识点(2)
  • 【Linux】基础文件的I/O操作(1)
  • 【Linux】进程信号
  • 自己简单写的 事件订阅机制
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • CentOS从零开始部署Nodejs项目
  • django开发-定时任务的使用
  • docker-consul
  • eclipse的离线汉化
  • extract-text-webpack-plugin用法
  • Javascript编码规范
  • Joomla 2.x, 3.x useful code cheatsheet
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • LeetCode算法系列_0891_子序列宽度之和
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • Web标准制定过程
  • 二维平面内的碰撞检测【一】
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 聊聊directory traversal attack
  • 嵌入式文件系统
  • 强力优化Rancher k8s中国区的使用体验
  • 数据可视化之 Sankey 桑基图的实现
  • 小程序开发中的那些坑
  • 正则学习笔记
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • (AngularJS)Angular 控制器之间通信初探
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (MATLAB)第五章-矩阵运算
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (笔试题)合法字符串
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)Scala的“=”符号简介
  • . NET自动找可写目录
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .apk 成为历史!
  • .NET Core Web APi类库如何内嵌运行?