通讯录动态版(动态内存开辟)

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

提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人

7. 以名字排序所有联系人

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#define M 2//初始通讯录大小
#define N 5//每次增容的大小
//姓名、性别、年龄、电话、住址
typedef struct people
{
	char name[20];
	char sex[10];
	int age;
	int tel;
	char addr[50];
}Peo;

typedef struct Ppeople
{
	Peo *peo;
	int count;//当前实际所存联系人数量
	int num;//通讯录总的容量
}Con,*pCon;
void print(pCon p, int k)//打印信息函数
{
		printf("姓名:%s\t",p->peo[k].name);
		printf("性别:%s\t",p->peo[k].sex);
		printf("年龄:%d\t",p->peo[k].age);
		printf("电话:%d\t",p->peo[k].tel);
		printf("住址:%s\n",p->peo[k].addr);
}
void Scanf(pCon p, int k)//输入信息函数
{
	printf("请输入姓名:");
	scanf("%s",p->peo[k].name);
	printf("请输入性别:");
	scanf("%s",p->peo[k].sex);
	printf("请输入年龄:");
	scanf("%d",&p->peo[k].age);
	printf("请输入电话:");
	scanf("%d",&p->peo[k].tel);
	printf("请输入住址:");
	scanf("%s",p->peo[k].addr);
}
void cheak_cap(pCon p)//检查当前通讯录的大小
{
	if(p->count == p->num)
	{
		Peo *ptr = (Peo*)realloc(p->peo,(p->count+N)*sizeof(Peo));
		if(ptr==NULL)
		{
			printf("out of memory\n");
			exit(EXIT_FAILURE);
		}
		else
		{
			p->peo = ptr;
			p->num += N;
		}
	}
}
void Add(pCon p)//添加联系人
{
	int i = 0;
	cheak_cap(p);
	Scanf(p,p->count);
	p->count++;
	printf("添加联系人成功!\n");
}

void Delete(pCon p)//删除联系人
{
	int k = 0;
	char arr[20] = {0};
	int i = 0;
	int find(pCon p, char* arr);
	if(p->count == 0)
	{
		printf("通讯录为空!\n");
	}
	else
	{
		printf("请输入所要删除的联系人姓名:");
		scanf("%s",arr);
		k = find(p,arr);
		if(k == -1)
			printf("无此联系人!");
		else if(k>=0)
		{
			for(i=k; i<p->count-1; i++)
			{
				p->peo[i]=p->peo[i+1];
			}
			p->count--;
			Sleep(1000);
			printf("删除成功!\n");
		}
	}
}

int find(pCon p, char* arr)//查找联系人是否存在
{
	int i = 0;
	for(i=0; i < p->count; i++)
	{
		if(strcmp(arr,p->peo[i].name)==0)
			return i;
	}
	return -1;
}
void Find(pCon p)//查找联系人
{
	int k = 0;
	char arr[20] = {0};
	int i = 0;
	int find(pCon p, char* arr);
	if(p->count == 0)
	{
		printf("通讯录为空!\n");
	}
	else
	{
		printf("请输入所要查找的联系人姓名:");
		scanf("%s",arr);
		k = find(p,arr);
		if(k == -1)
			printf("无此联系人!");
		else if(k>=0)
		{
			print(p, k);

		}
	}
}
void revise(pCon p)//修改联系人
{
	int k = 0;
	char arr[20] = {0};
	int i = 0;
	int find(pCon p, char* arr);
	if(p->count == 0)
	{
		printf("通讯录为空!\n");
	}
	else
	{
		printf("请输入所要修改的联系人姓名:");
		scanf("%s",arr);
		k = find(p,arr);
		if(k == -1)
			printf("无此联系人!");
		else if(k>=0)
		{
			printf("请输入要修改的信息:\n");
			Scanf(p,k);
			print(p,k);
			printf("修改完成!\n");
		}
	}
}

void show(pCon p)//显示所有联系人
{
	int j = 0;
	if(p->count==0)
	{
		printf("通讯录为空!\n");
	}
	else
	{
		while(j<p->count)
		{
			print(p, j);
			j++;
		}
	}
}
void delete_all(pCon p)//删除所有联系人
{
	if(p->count==0)
	{
		printf("通讯录为空!\n");
	}
	else
	{
		p->count=0;
		printf("已清空!");
	}
}
void sort(pCon p)//按名字排序所有联系人
{
	int i = 0;
	int j = 0;
	int n=0;
	if(p->count==0)
	{
		printf("通讯录为空!\n");
	}
	else
	{
		for(i=0; i<p->count-1; i++)
		{
			n=i;
			for(j=i+1;j<p->count; j++)
			{
				if(strcmp(p->peo[n].name,p->peo[j].name)>0)
					n=j;
			}
			if(n!=i)
			{
				Peo tmp;
				tmp = p->peo[n];
				p->peo[n] = p->peo[i];
				p->peo[i] = tmp;
			}
		}
		printf("排序完成!\n");
	}
}
void menu()//菜单
{
	printf("\n");
	printf("\t\t\t***************************通讯录*************************\n");
	printf("\n");
	printf("\t\t\t************** 1.	添加联系人信息      **************\n");
	printf("\t\t\t************** 2.	删除指定联系人信息  **************\n");
	printf("\t\t\t************** 3.	查找指定联系人信息  **************\n");
	printf("\t\t\t************** 4.	修改指定联系人信息  **************\n");
	printf("\t\t\t************** 5.	显示所有联系人信息  **************\n");
	printf("\t\t\t************** 6.	清空所有联系人      **************\n");
	printf("\t\t\t************** 7.	以名字排序所有联系人**************\n");
	printf("\t\t\t************** 0.	退出                **************\n");
}
void init(pCon p)//开辟内存以及初始化
{
	p->peo = (Peo*)malloc(M*sizeof(Peo));
	if(p->peo==NULL)
	{
		printf("out of memory!\n");
		exit(EXIT_FAILURE);
	}
	else
	{
		memset(p->peo,0,M*sizeof(Peo));
		p->count = 0;
		p->num = M;
	}
}
int main()
{

	int input = 1;
	Con con;
	init(&con);
	while(input)
	{
		menu();
		printf("请选择您所要进行的操作:");
		scanf("%d",&input);
		switch(input)
		{
			case 1:Add(&con);
				break;
			case 2:Delete(&con);
				break;
			case 3:Find(&con);
				break;
			case 4:revise(&con);
				break;
			case 5:show(&con);
				break;
			case 6:delete_all(&con);
				break;
			case 7:sort(&con);
				break;
			case 0:
				input = 0;
				break;
			default:
				printf("输入有误,请重新输入!");
				break;
		}
	}
	free(con.peo);
	system("pause");
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值