c语言通讯录——动态内存版

本程程序实现了几个功能

1.增加成员  2.删除成员

3.修改         4.查找

5.排序        6.清空通讯录

程序如下所示

本程序分为三个文件

contact.h

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NAME_MAX 10
#define SEX_MAX 3
#define TELE_MAX 12
#define ADDR_MAX 20
#define INIT_GROSS 3
typedef struct PeoInf
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInf;
//静态版
//typedef struct Contact
//{
//	PeoInf data[1000];
//	int Sub;
//}Contact;
//动态版
typedef struct Contact
{
	PeoInf* data;
	int Sub;
	int gross;
}Contact;
enum menu
{
	Exit,
	Add,
	Dele,
	Reverse,
	Find,
	Sort,
	Dtl,
	Print
};
//初始化通讯录
void Initinal_Contact(Contact* p);
//通过名称查找成员
int FindName(Contact* p);
//通讯录添加成员
void Add_Contact(Contact* p);
//通讯录删除成员
void Dele_Contact(Contact* p);
//通讯录成员信息修改
void Reverse_Contact(Contact* p);
//通讯录成员查找
void Find_Contact(Contact* p);
//对于通讯录成员排序
void Sort_Contact(Contact* p);
//打印通讯录所有成员
void Print_Contact(Contact* p);

text.c

#include"contact.h"
void menu()
{
	printf("*******************************\n");
	printf("***  1.Add       2.Dele     ***\n");
	printf("***  3.Reverse   4.Find     ***\n");
	printf("***  5.Sort      6.Dtl      ***\n");
	printf("***  7.print     0.Exit     ***\n");
	printf("*******************************\n");
}
void text()
{
	int input = 0;
	Contact contact;
	Initinal_Contact(&contact);
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case Add:
			Add_Contact(&contact);
			break;
		case Dele:
			Dele_Contact(&contact);
			break;
		case Reverse:
			Reverse_Contact(&contact);
			break;
		case Find:
			Find_Contact(&contact);
			break;
		case Sort:
			Sort_Contact(&contact);
			break;
		case Dtl:
			Dtl_Contact(&contact);
			break;
		case Print:
			Print_Contact(&contact);
			break;
		case Exit:
			break;
		default:
			printf("输入错误,请重新输入\n");
		}
	} while (input);
	free(contact.data);
}
int main()
{
	text();
	return 0;
}

contact.c

#include"contact.h"

//初始化通讯录
void Initinal_Contact(Contact* p)
{
	//总量初始化
	p->gross = INIT_GROSS;
	//下标初始化
	p->Sub = 0;
	//申请一块空间并初始化
	p->data = (PeoInf*)malloc(p->gross * sizeof(PeoInf));
	if (p->data == NULL)
	{
		perror("Initial_Contact malloc");
		return;
	}
	memset(p->data, 0, sizeof(PeoInf)*p->gross);
}
//通过姓名查找成员
int FindName(Contact* p)
{
	char name[20];
	scanf("%s", name);
	int i = 0;
	for (i = 0; i < p->Sub; i++)
	{
		if (strcmp(p->data[i].name, name) == 0)
			return i;
	}
	return -1;
}
//增容
void CheckCapacity(Contact* p)
{
	if (p->Sub == p->gross)
	{
		PeoInf* tmp = (PeoInf*)realloc(p->data, sizeof(PeoInf) * (p->gross+2));
		if (tmp != NULL)
		{
			p->data = tmp;
			printf("存储空间已满,已增容\n");
			p->gross += 2;
		}
	}
}
//通讯录添加成员
void Add_Contact(Contact* p)
{
	//空间已满 增容
	CheckCapacity(p);
	//成员信息录入
	printf("请输入姓名:");
	scanf("%s",  p->data[p->Sub].name);
	printf("请输入性别:");
	scanf("%s", p->data[p->Sub].sex);
	printf("请输入年龄:");
	scanf("%d", &p->data[p->Sub].age);
	printf("请输入电话:");
	scanf("%s", p->data[p->Sub].tele);
	printf("请输入住址:");
	scanf("%s", p->data[p->Sub].addr);
	printf("成员信息录入成功\n");
	//成员数增加
	p->Sub++;
}
//通讯录删除成员
void Dele_Contact(Contact* p)
{
	//通讯录为空的情况
	if (p->Sub == 0)
		printf("通讯录为空,无法删除\n");
	//通讯录非空的情况
	else
	{
		printf("请输入要删除的成员姓名\n");
		int ret = FindName(p);
		if (ret == -1)
			printf("查无此人\n");
		else
		{
			int i = 0;
			for (i = ret; i < p->Sub-1; i++)
				p->data[i] = p->data[i + 1];
			p->Sub--;
			printf("删除成功\n");
		}
	}
}
//通讯录成员信息修改
void Reverse_Contact(Contact* p)
{
	printf("请输入要修改的成员的姓名\n");
	int ret = FindName(p);
	if (ret == -1)
		printf("查无此人\n");
	else
	{
		printf("请重新输入信息\n");
		printf("请输入姓名:");
		scanf("%s", p->data[ret].name);
		printf("请输入性别:");
		scanf("%s", p->data[ret].sex);
		printf("请输入年龄:");
		scanf("%d", &p->data[ret].age);
		printf("请输入电话:");
		scanf("%s", p->data[ret].tele);
		printf("请输入住址:");
		scanf("%s", p->data[ret].addr);
		printf("成员信息录入成功\n");
	}
}
//通信录成员查找
void Find_Contact(Contact* p)
{
	printf("请输入要查找的成员的姓名\n");
	int ret = FindName(p);
	if (ret == -1)
		printf("查无此人\n");
	else
	{
		printf("该成员的信息为\n");
		//上标识
		printf("%-20s %-20s %-20s %-20s %-30s\n", "姓名", "性别", "年龄", "电话", "住址");
		printf("%-20s %-20s %-20d %-20s %-20s\n", p->data[ret].name, p->data[ret].sex, p->data[ret].age, p->data[ret].tele, p->data[ret].addr);
	}
}
//data的排序方法
int* PeoInf_Cmp(const void* e1, const void* e2)
{
	return strcmp((PeoInf*)e1, (PeoInf*)e2);
}
//对于通讯录成员排序
void Sort_Contact(Contact* p)
{
	qsort(p->data, p->Sub, sizeof(PeoInf), PeoInf_Cmp);
	printf("已排序\n");
}
//删库
void Dtl_Contact(Contact* p)
{
	memset(p->data, 0, sizeof(p->data));
	p->Sub = 0;
	p->gross = INIT_GROSS;
	realloc(p->data, sizeof(PeoInf) * p->gross);
	printf("已删库\n");
}
//打印通讯录所有成员
void Print_Contact(Contact* p)
{
	if (p->Sub == 0)
		printf("无联系人\n");
	else
	{
		//上标识
		printf("%-20s %-20s %-20s %-20s %-30s\n", "姓名", "性别", "年龄", "电话", "住址");
		//成员打印
		int i = 0;
		for (i = 0; i < p->Sub; i++)
			printf("%-20s %-20s %-20d %-20s %-20s\n", p->data[i].name, p->data[i].sex, p->data[i].age, p->data[i].tele, p->data[i].addr);
	}
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值