动态通讯录的实现

大家在编写动态通讯录之前,我希望大家能够了解malloc和realloc的用法:https://blog.csdn.net/cdatreides/article/details/80522095

希望大家能够通过我的这篇博客了解malloc和realloc

头文件:

#ifndef __CONTACT_H__  //防止头文件的重复引用
#define __CONTACT_H__
#endif



#define  NAME_NUM  20
#define  SEX_NUM   5
#define  TELE_NUM  20
#define  ADDR_NUM  30




#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#pragma warning(disable:4996)


typedef struct Peo//定义个人信息
{
	char name[NAME_NUM];
	int age;
	char sex[SEX_NUM];
	char tele[TELE_NUM];
	char addr[ADDR_NUM];
}Peo;
typedef struct Concact
{
	Peo *data;//指向动态开辟的空间
	int sz;//人数
	int v;//容量
}Contact, *pContact;

enum ss
{
	Exit,
	Add,
	Del,
	Search,
	Change,
	Show,
	Sort,
	Clear,
};



void InitContact(pContact pcon);
void AddContact(pContact pcon);
void DelContact(pContact pcon);
void SearchContact(pContact pcon);
void ChangeContact(pContact pcon);
void ShowContact(pContact pcon);
void SortContact(pContact pcon);
void ClearContact(pContact pcon);
void DestroyContact(pContact pcon);

contact.c:

#include"contact.h"

void InitContact(pContact pcon)//初始化
{
	pcon->sz = 0;
	pcon->data = malloc(2*sizeof(Peo));//data是malloc动态开辟的内存
	if (pcon->data == NULL)//判断是否开辟成功
	{
		perror("use malloc");
		exit(EXIT_FAILURE);//若开辟失败,立即退出
	}
	memset(pcon->data, 0,2*sizeof(Peo));
	pcon->v = 2;//目前的容量即为设置好的,为以后的增容做准备
}
void Checkcontact(pContact pcon)//检查容量
{
	if (pcon->sz == pcon->v)
	{
		Peo *ps = realloc(pcon->data, (pcon->v + 2)*sizeof(Peo));
		if (ps == NULL)//判断是否为空
		{
			perror("use malloc");
			exit(EXIT_FAILURE);//开辟失败,立即退出
		}
		else
		{
			pcon->data = ps;
		}
		pcon->v += 2;
		printf("增容成功\n");
	}
}
void AddContact(pContact pcon)
{
	assert(pcon->data);
	Checkcontact(pcon);//检查容量
	printf("输入姓名:");
	scanf("%s", pcon->data[pcon->sz].name);
	printf("输入年龄:");
	scanf("%d", &pcon->data[pcon->sz].age);
	printf("输入性别:");
	scanf("%s", pcon->data[pcon->sz].sex);
	printf("输入电话:");
	scanf("%s", pcon->data[pcon->sz].tele);
	printf("输入地址:");
	scanf("%s", pcon->data[pcon->sz].addr);
	pcon->sz++;
	printf("添加成功\n");
}
int FindContact(pContact pcon, char name[])//发现
{
	int i;
	for (i = 0; i < pcon->data; i++)
	{
		if (strcmp(pcon->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void DelContact(pContact pcon)//删除
{
	char name[NAME_NUM];
	printf("输入你要del的名字:");
	scanf("%s", name);
	int ret=FindContact(pcon, name);
	if (ret == -1)
	{
		printf("你删的不在\n");
		return;
	}
	else
	{
		int i;
		for (i = ret; i < pcon->sz; i++)
		{
			pcon->data[i] = pcon->data[i + 1];
		}
		pcon->sz--;
		printf("删除成功\n");
	}
}
void SearchContact(pContact pcon)//寻找
{
	char name[NAME_NUM];
	printf("请输入要查询的姓名: ");
	scanf("%s", name);
	int ret = 0;
	ret = FindContact(pcon, name);
	if (ret == -1)
	{
		printf("你要查询的人不存在\n");
		return;
	}
	else
	{
		printf("姓名:%10s\t性别:%5s\t年龄:%5d\t电话:%10s\t住址:%15s\n", pcon->data[ret].name,
			pcon->data[ret].sex,
			pcon->data[ret].age,
			pcon->data[ret].tele,
			pcon->data[ret].addr);
	}
}
void ChangeContact(pContact pcon)//修改信息
{
	char name[NAME_NUM];
	printf("请输入要修改的除联系人\n");
	scanf("%s", name);
	int ret = 0;
	ret = FindContact(pcon, name);
	if (ret != -1)
	{
		printf("请输入修改后的姓名: ");
		scanf("%s", pcon->data[ret].name);
		printf("请输入修改后的性别: ");
		scanf("%s", pcon->data[ret].sex);
		printf("请输入修改后的年龄: ");
		scanf("%d", &pcon->data[ret].age);
		printf("请输入修改后的电话: ");
		scanf("%s", pcon->data[ret].tele);
		printf("请输入修改后的地址: ");
		scanf("%s", pcon->data[ret].addr);
		printf("修改完毕\n");
	}
	else
	{
		printf("要修改的联系人不存在!\n");
	}
}
void ShowContact(pContact pcon)
{
	printf("联系人信息:\n");
	int i = 0;
	printf("%10s\t%5s\t%5s\t%10s\t%15s\n", "姓名", "性别", "年龄", "电话", "地址");
	for (i = 0; i < pcon->sz; i++)
	{
		printf("%10s\t%5s\t%5d\t%10s\t%15s\n", pcon->data[i].name,
			pcon->data[i].sex,
			pcon->data[i].age,
			pcon->data[i].tele,
			pcon->data[i].addr);
	}
}
void SortContact(pContact pcon)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < pcon->sz - 1; i++)//冒泡排序
	{
		for (j = 1; j < pcon->sz - i - 1; j++)
		{
			if (strcmp(pcon->data[i].name, pcon->data[i + 1].name)<0)
			{
				char  tem[NAME_NUM];
				strcpy(tem, pcon->data[i].name);
				strcpy(pcon->data[i].name, pcon->data[i + 1].name);
				strcpy(pcon->data[i].name,tem);
				
			}
		}
	}
	printf("%10s\t%5s\t%5s\t%10s\t%15s\n", "姓名", "性别", "年龄", "电话", "地址");
	for (i = 0; i < pcon->sz; i++)
	{
		printf("%10s\t%5s\t%5d\t%10s\t%15s\n", pcon->data[i].name,
			pcon->data[i].sex,
			pcon->data[i].age,
			pcon->data[i].tele,
			pcon->data[i].addr);
	}

	printf("排序完成\n");
}
void ClearContact(pContact pcon)//清除
{
	pcon->sz = 0;
}
void DestroyContact(pContact pcon)//销毁
{
	free(pcon->data);
	pcon->data = NULL;
	pcon->sz = 0;
	pcon->v = 0;
}

main.c:

#include"contact.h"
void menu()
{
	printf("*********************************\n");
	printf("***  1. Add           2. Del  ***\n");
	printf("***  3.Search         4.Change***\n");
	printf("***  5. Show          6.Sort  ***\n");
	printf("***  7.Clear          0.Exit  ***\n");
	printf("*********************************\n");
	printf("                                 \n");
}

int main()
{
	Contact my_ps;
	InitContact(&my_ps);//初始化
	int i;
	do{
		menu();
		printf("请选择>;");
		scanf("%d", &i);
		switch(i)
		{
		case 1:AddContact(&my_ps);
			break;
		case 2:DelContact(&my_ps);
			break;
		case 3:SearchContact(&my_ps);
			break;
		case 4:ChangeContact(&my_ps);
			break;
		case 5:ShowContact(&my_ps);
			break;
		case 6:SortContact(&my_ps);
			break;
		case 7:ClearContact(&my_ps);
			break;
		case 0:DestroyContact(&my_ps);
			exit(0);
			break;
		default:printf("输入错误,重新选择\n");
			break;
		}
	} while (1);
}

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值