栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

❤️C语言通讯录管理系统❤️ (升级版)动态开辟内存

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

❤️C语言通讯录管理系统❤️ (升级版)动态开辟内存

之前博主写过一个❤️简易版的通讯录管理系统❤️有需要的UU们可以看看哦~,本篇博客博主将为它升级,实现动态开辟内存的C语言通讯录管理系统(升级版)

Hi~ o( ̄▽ ̄)ブ这里是猪猪程序员
很高兴见到你O(∩_∩)O!现在正在发芽中…
欢迎关注点赞收藏⭐️留言
本文由猪猪原创,CSDN首发!首发时间:2021年10月3日
️ 博主水平有限,如果发现错误,一定要及时告知作者哦 o( ̄︶ ̄)o!感谢感谢!
博主的码云 gitee,平常博主写的程序代码都在里面。

❤️C语言通讯录管理系统(升级版)❤️
  • 一、通讯录
  • 二、菜单实现和用户交互
  • 三、主函数
    • ⭐️⭐️1.enum选项
    • ⭐️⭐️2.switch判断
  • 四、定义联系人和通讯录
    • ⭐️⭐️1.定义联系人结构体
    • ⭐️⭐️2.定义动态的通讯录结构体
    • ⭐️⭐️3.定义结构体变量
  • 五、通讯录初始化
  • 六、新增联系人
  • 七、查找联系人
  • 八、删除联系人
  • 九、修改联系人
  • 十、查看所有联系人
  • 十一、清空所有联系人
  • 十二、以名字排序所有联系人
  • 十三、完整代码
    • ⭐️⭐️contact.h
    • ⭐️⭐️test.c
    • ⭐️⭐️contact.c

一、通讯录

实现一个通讯录;

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址,
并且实现对内存的动态开辟。

提供方法:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人
二、菜单实现和用户交互
void menu()
{
		printf("=====================n");
		printf(" 1. 新增联系人n");
		printf(" 2. 删除联系人n");
		printf(" 3. 查找联系人n");
		printf(" 4. 修改联系人n");
		printf(" 5. 查看所有联系人n");
		printf(" 6. 清空所有联系人n");
		printf(" 7. 以名字排序所有联系人n");
		printf(" 0. 退出n");
		printf("=====================n");
}
三、主函数 ⭐️⭐️1.enum选项
enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	EMPTY,
	SORT,
};

enum枚举常量,里面默认对应的值是从0~7,刚好和菜单中的选项匹配起来了

⭐️⭐️2.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 EMPTY:
				DestroyContact(&con);
				break;
			case EXIT:
				printf("退出通讯录n");
				break;
			default:
				printf("选择错误n");
				break;
		}

	} while (input);
四、定义联系人和通讯录 ⭐️⭐️1.定义联系人结构体
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 20
#define ADDR_MAX 30

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

注意事项:

  1. 我使用了四个define定义的常量,这样要修改最大值的时候更方便
  2. 定义的struct结构体可以存放:姓名、性别、年龄、电话、住址
⭐️⭐️2.定义动态的通讯录结构体
#define MAX 1000
struct Contact
{
	struct PeoInfo* data;//设计data指针指向的内存初始放三个元素,不够就继续开辟内存
	int sz;//记录当前通讯录有效元素个数
	int capacity;//记录当前通讯录最大容量
};

注意事项:

  1. 设计data指针指向的内存初始放三个元素,不够就继续开辟内存
  2. sz记录当前通讯录有效元素个数
  3. capacity记录当前通讯录最大容量
⭐️⭐️3.定义结构体变量
struct PeoInfo con;
五、通讯录初始化
#include
#include"contact.h"
void InitContact(struct Contact* pc)
{
	pc->sz = 0;
	pc->data = (struct PeoInfo*)malloc(3 * sizeof(struct PeoInfo));
	pc->capacity=3;
}

注意事项:

  1. 用malloc开辟了一块动态内存空间,存放三个元素,每个元素的类型都是strcut PeoInfo
六、新增联系人
void AddContact(struct Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		//增加容量
		struct PeoInfo*ptr=(struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capacity += 2;
			printf("增容成功n");
		}
		else
		{
			return;
		}
	}
	//录入新增人的信息
	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);
	printf("添加成功!n");
}

注意事项:

使用realloc函数来增容。

七、查找联系人

注意事项:

  1. 我发现无论是删除联系人、修改联系人、查看所有联系人都需要一个查找所有联系人的动作,因此我们写出一个查找所有联系人的函数
int FindContactByName(struct Contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

注意事项:

  1. 用strcmp库函数来比较data数组中的名字与要查找的名字是否相同
  2. 相同则返回下标,不同则返回-1
void SearchContact(struct Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	int pos= FindContactByName(pc, name);
	if (-1 == pos)
	{
		printf("查无此人");
	}
	else
	{
		printf("%15st%5st%8st%15st%30snn", "姓名", "年龄", "性别", "电话", "地址");
		printf("%15st%5st%8st%15st%30sn",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}
八、删除联系人
void DelContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除n");
	}
	char name[NAME_MAX] = { 0 };
	printf("请输入要删除人的名字");
	scanf_s("%s", name);
	int pos=FindContactByName(pc,name);//按照名字去查找,找到了就返回下标,未找到就返回-1
	if (pos == -1)
	{
		printf("指定联系人不存在n");
	}
	else
	{
		int j = 0;
		for (j = pos; j < pc->sz-1; j++)
		{
			pc->data[j] = pc->data[j + 1];
		}
		pc->sz--;
		printf("删除成功!n");
	}

}
九、修改联系人
void ModifyContact(struct Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改人的名字:>");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (-1 == pos)
	{
		printf("要修改的人不存在n");
	}
	else
	{
		printf("请输入新的名字:>");
		scanf("%s", pc->data[pos].name);//选择放在下标为sz的data里面
		printf("请输入新的年龄:>");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入新的性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入新的电话:>");
		scanf("%s", pc->data[pos].tele);
		printf("请输入新的地址:>");
		scanf("%s", pc->data[pos].addr);
	}
}
十、查看所有联系人
void ShowContact(struct Contact* pc)
{
	int i = 0;
	printf("%15st%5st%8st%15st%30snn", "姓名", "年龄", "性别", "电话", "地址");//打印标题
	for (i = 0; i < pc->sz; i++)
	{
		printf("%15st%5st%8st%15st%30sn",
			pc->data[i].name, 
			pc->data[i].age, 
			pc->data[i].sex, 
			pc->data[i].tele, 
			pc->data[i].addr);
	}
}
十一、清空所有联系人
void DestroyContact(struct Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
}

注意事项:

使用free将所有动态内存释放,并且指针都变成空指针。

十二、以名字排序所有联系人
void SortContact(struct Contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByname);
}

注意事项:

有关qsort相关的知识,请参考此篇博客

十三、完整代码 ⭐️⭐️contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 20
#define ADDR_MAX 30
#define MAX 100
#include 
#include 
#include 

struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
};
struct Contact
{
	struct PeoInfo* data;//设计data指针指向的内存初始放三个元素,不够就继续开辟内存
	int sz;//记录当前通讯录有效元素个数
	int capacity;//记录当前通讯录最大容量
};
//初始化通讯录
void InitContact(struct Contact* pc);
//销毁通讯录
void DestroyContact(struct Contact* pc);

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

//显示所有的联系人
void ShowContact(struct Contact* pc);

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

//查找指定联系人
void SearchContact(const struct Contact* pc);

//修改指定联系人
void ModifyContact(struct Contact* pc);
⭐️⭐️test.c
#define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include "contact.h"
void menu()
{

	printf("=====================n");
	printf(" 1. 新增联系人n");
	printf(" 2. 删除联系人n");
	printf(" 3. 查找联系人n");
	printf(" 4. 修改联系人n");
	printf(" 5. 查看所有联系人n");
	printf(" 6. 清空所有联系人n");
	printf(" 7. 以名字排序所有联系人n");
	printf(" 0. 退出n");
	printf("=====================n");
	printf(" 请输入您的选择:");

}
enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	EMPTY,
	SORT,
};//枚举常量,里面对应的值是从0~6,刚好和菜单匹配起来了
int main()
{
	int input = 0;
	struct Contact con;
	InitContact(&con);
	//最多可以放3个人的信息
	//空间不够可以增容
	do
	{
		menu();
		printf("请选择:>");
		scanf_s("%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 EMPTY:
			//销毁通讯录
			DestroyContact(&con);
			break;
		case EXIT:
			printf("退出通讯录n");
			break;
		default:
			printf("选择错误n");
			break;
		}

	} while (input);
	
	return 0;
}
⭐️⭐️contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include "contact.h"
void InitContact(struct Contact* pc)
{
	pc->sz = 0;
	pc->data = (struct PeoInfo*)malloc(3 * sizeof(struct PeoInfo));
}
void AddContact(struct Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		//增加容量
		struct PeoInfo*ptr=(struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capacity += 2;
			printf("增容成功n");
		}
		else
		{
			return;
		}
	}
	//录入新增人的信息
	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);
	printf("添加成功!n");
}
void ShowContact(struct Contact* pc)
{
	int i = 0;
	printf("%15st%5st%8st%15st%30snn", "姓名", "年龄", "性别", "电话", "地址");//打印标题
	for (i = 0; i < pc->sz; i++)
	{
		printf("%15st%5dt%8st%15st%30sn",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}
int FindContactByName(struct Contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void DelContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除n");
		return;
	}
	char name[NAME_MAX] = { 0 };
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	//查找
	int pos = FindContactByName(pc, name);
	if (pos == -1)
	{
		printf("指定的联系人不存在n");
	}
	else
	{
		//删除
		int j = 0;
		for (j = pos; j < pc->sz - 1; j++)
		{
			pc->data[j] = pc->data[j + 1];
		}
		pc->sz--;
		//
		printf("删除成功n");
	}
}
void SearchContact(struct Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (-1 == pos)
	{
		printf("查无此人");
	}
	else
	{
		printf("%15st%5st%8st%15st%30snn", "姓名", "年龄", "性别", "电话", "地址");
		printf("%15st%5dt%8st%15st%30sn",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}
void ModifyContact(struct Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改人的名字:>");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (-1 == pos)
	{
		printf("要修改的人不存在n");
	}
	else
	{
		printf("请输入新的名字:>");
		scanf("%s", pc->data[pos].name);//选择放在下标为sz的data里面
		printf("请输入新的年龄:>");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入新的性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入新的电话:>");
		scanf("%s", pc->data[pos].tele);
		printf("请输入新的地址:>");
		scanf("%s", pc->data[pos].addr);
	}
}
void DestroyContact(struct Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/291566.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号