动态开辟内存版本的通讯录

这是一个使用C++编写的通讯录管理程序,具备添加、删除、查找、修改、显示、清空和按名字排序联系人信息的功能。程序通过结构体存储每个联系人的详细信息,并使用动态内存分配和链表操作来管理数据。用户友好的菜单界面提供交互式操作,支持通讯录容量的动态扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "ab.h"
//实现通讯录:通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
//1.添加联系人信息
//2.删除指定联系人信息
//3.查找指定联系人信息
//4.修改指定联系人信息
//5.显示所有联系人信息
//6.清空所有联系人
//7.以名字排序所有联系人
enum number
{
	EXIT,
	ADD,
	DEL,
	SEEK,
	MOD,
	SHOW,
	EMPTY,
	SORT
};
void mean()
{
	printf("*****************************************************************\n");
	printf("*********           1.add              2.del          ***********\n");
	printf("*********           3.seek             4.mod          ***********\n");
	printf("*********           5.show             6.empty        ***********\n");
	printf("*********           7.sort             0.exit         ***********\n");
	printf("*****************************************************************\n");
}
int main()
{
	int input = 0;
	content ab;										//定义通讯录变量ab
	Initcontact(&ab);								//初始化通讯录函数
	do
	{
		mean();
		printf("请选择->");
		scanf("%d",&input);
		switch (input)
		{
		case EXIT:
			printf("退出通讯录\n");
			break;
		case ADD:
			addcontact(&ab);						//增加联系人信息函数
			break;
		case DEL:
			delcontact(&ab);						//删除联系人信息函数
			break;
		case SEEK:
			seekcontact(&ab);						//寻找联系人信息函数
			break;
		case MOD:
			modcontact(&ab);						//修改联系人信息函数
			break;
		case SHOW:
			showcontact(&ab);						//展示联系人信息函数
			break;
		case EMPTY:
			emptycontact(&ab);						//清空联系人信息函数
		case SORT:
			sortcontact(&ab);						//排序联系人信息函数
			break;
		}
	} while (input);
	return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#define MIN_NAME 15								//设置姓名数组中字符的个数
#define MIN_SEX 5								//设置性别数组中字符的个数
#define MIN_NUMBER 20							//设置号码数组中字符的个数
#define MIN_ADDRESS 18							//设置地址数组中字符的个数
#define FRINUM 3								//设置通讯录默认起始数据
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

typedef struct message
{
	char name[MIN_NAME];
	char sex[MIN_SEX];
	int age;
	char number[MIN_NUMBER];
	char address[MIN_ADDRESS];
}message;
typedef struct data
{
	message* data;								//用来保存通讯录存放的数据
	int sz;										//用来记录通讯录中有效数据的个数
	int capcity;								//用来记录通讯录默认数据个数
}content;

void Initcontact(content* ab);					//初始化通讯录函数声明
void addcontact(content* ab);					//增加联系人信息函数声明
void delcontact(content* ab);					//删除联系人信息函数声明
void seekcontact(content* ab);					//寻找联系人信息函数声明
void modcontact(content* ab);					//修改联系人信息函数声明
void emptycontact(content* ab);					//清空联系人信息函数声明
void showcontact(content* ab);					//展示联系人信息函数声明
void sortcontact(content* ab);					//排序联系人信息函数声明

#include "ab.h"
int i = 0;																						//全局变量i
//排序里面的比较函数
int compare(const void* e1, const void* e2)
{
	return strcmp(((message*)e1)->name, ((message*)e2)->name);
}

//增加通讯录容量函数
void capcityadd(content* ab)
{
	if (ab->sz == ab->capcity)
	{
		message* tmp = (message*)realloc(ab->data, (ab->capcity + 2) * sizeof(message));			//注意这里的结构体,不要引错了					
		if (tmp != NULL)
		{
			ab->data = tmp;
			ab->capcity += 2;
			printf("增加容量成功\n");
		}
		else
		{
			printf("addcontact::%s\n", strerror(errno));
		}
	}
}

//查找姓名函数
int seekname(char* name, content* ab)
{
	for (i = 0; i < ab->sz; i++)
	{
		if ((strcmp(name, ab->data[i].name)) == 0)
			return i;
	}
	return -1;
}

//初始化通讯录函数
void Initcontact(content* ab)
{
	assert(ab);
	ab->sz = 0;
	ab->capcity = FRINUM;
	message* tmp = (message*)malloc(FRINUM*sizeof(message));
	//判断tmp是否为空指针
	if (tmp == NULL)
	{
		printf("Initcontact::%s\n",strerror(errno));
		return;
	}
	ab->data = tmp;																			//动态的为指针ab开辟内存
	return;
}

//增加联系人函数
void addcontact(content* ab)
{
	assert(ab);
	capcityadd(ab);																				//增加通讯录的容量
	printf("请输入联系人的姓名->");
	scanf("%s",ab->data[ab->sz].name);
	printf("请输入联系人的性别->");
	scanf("%s",ab->data[ab->sz].sex);
	printf("请输入联系人的年龄->");
	scanf("%d",&(ab->data[ab->sz].age));
	printf("请输入联系人的电话->");
	scanf("%s",ab->data[ab->sz].number);
	printf("请输入联系人的住址->");
	scanf("%s",ab->data[ab->sz].address);
	printf("增加联系人成功\n");
	ab->sz++;
}

//删除联系人函数
void delcontact(content* ab)
{
	assert(ab);
	char name[MIN_NAME] = {0};
	printf("请输入要删除联系人的姓名->");
	scanf("%s", name);
	int ret = seekname(name,ab);						//查找姓名函数
	if (ret == -1)
		printf("没有该联系人\n");
	else
	{
		for (i = ret; i < ab->sz; i++)
		{
			ab->data[i] = ab->data[i + 1];
		}
		printf("删除指定联系人成功\n");
		ab->sz--;										//注意这一一定要执行这一步,删除一个联系人以后通讯录中有效个数就应该减少1
	}
	return;
}

//寻找联系人函数
void seekcontact(content* ab)
{
	assert(ab);
	char name[MIN_NAME] = { 0 };
	printf("请输入要查找联系人的姓名->");
	scanf("%s", name);
	int ret = seekname(name, ab);						//查找姓名函数
	if (ret == -1)
	{
		printf("没有该联系人\n");
		return;
	}
	else
	{
		printf("%-7s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址");
		printf("%-7s\t%-5s\t%-5d\t%-15s\t%-20s\n",
			ab->data[ret].name, ab->data[ret].sex, ab->data[ret].age, ab->data[ret].number, ab->data[ret].address);
	}
	return;
}

//修改联系人信息函数
void modcontact(content* ab)
{
	assert(ab);
	char name[MIN_NAME] = { 0 };
	printf("请输入要查找联系人的姓名->");
	scanf("%s", name);
	int ret = seekname(name, ab);						//查找姓名函数	
	if (ret == -1)
	{
		printf("没有该联系人\n");
		return;
	}
	else
	{
		printf("%-7s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址");
		printf("%-7s\t%-5s\t%-5d\t%-15s\t%-20s\n",
			ab->data[ret].name, ab->data[ret].sex, ab->data[ret].age, ab->data[ret].number, ab->data[ret].address);
	}
	printf("请输入修改信息\n");
	printf("请输入联系人的姓名->");
	scanf("%s", ab->data[ret].name);
	printf("请输入联系人的性别->");
	scanf("%s", ab->data[ret].sex);
	printf("请输入联系人的年龄->");
	scanf("%d", &(ab->data[ret].age));
	printf("请输入联系人的电话->");
	scanf("%s", ab->data[ret].number);
	printf("请输入联系人的住址->");
	scanf("%s", ab->data[ret].address);
	printf("修改成功\n");
	return;
}

//清空联系人信息函数
void emptycontact(content* ab)
{
	assert(ab);
	printf("请确认是否要清空通讯录(Y/N):");
	char str = 0;
	while ((str = getchar()) != '\n')
	{
		;
	}
	scanf("%c", &str);
	if (str == 'Y')
	{
		ab->data = 0;
		ab->capcity = 0;
		ab->sz = 0;
		printf("全部清除成功\n");
	}
	return;
}

//展示联系人函数
void showcontact(content* ab)
{
	//姓名、性别、年龄、电话、住址
	assert(ab);
	printf("%-7s\t%-5s\t%-5s\t%-15s\t%-20s\n","姓名","性别", "年龄", "电话", "住址");
	for (i = 0; i < ab->sz; i++)
	{
		printf("%-7s\t%-5s\t%-5d\t%-15s\t%-20s\n",
			ab->data[i].name, ab->data[i].sex, ab->data[i].age, ab->data[i].number, ab->data[i].address);
	}
	return;
}

//排序联系人信息函数
void sortcontact(content* ab)
{
	assert(ab);
	qsort(ab->data,ab->sz,sizeof(ab->data[0]),compare);
	printf("%-7s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址");
	for (i = 0; i < ab->sz; i++)
	{
		printf("%-7s\t%-5s\t%-5d\t%-15s\t%-20s\n",
			ab->data[i].name, ab->data[i].sex, ab->data[i].age, ab->data[i].number, ab->data[i].address);
	}
	return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼吐泡泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值