模拟实现通讯录的功能(动态版本)

在前面的文章中,我已经介绍了通讯录的静态版本,今天,我将为大家带来通讯录的动态版本。



在这里,我只列出与静态版本不同的地方,通讯录依然包括contact.h和contact.c和test.c的三个文档。

初始化函数

void InitContact(struct con* pc)
{
	assert(pc != NULL);
	pc->data = (struct people*)malloc(sizeof(struct people) * DEFAULT_SZ);
	if(pc->data == NULL)
	{
		perror("InitContact()");
		return;
	}
	pc->sz = 0;
	pc->capacity = DEFAULT_SZ;
}


删除通讯录函数

void DestroyContact(struct con* pc)
{
    assert(pc != NULL);
	free(pc->data);
	pc->data = NULL;
	pc->sz = 0;
	pc->capacity = 0;
}


检查通讯录是否满的函数

static int check_capacity(struct con* pc)
{
    assert(pc != NULL);
	if(pc->sz == pc->capacity)
	{
		pc->data = (struct people*)realloc(pc->data,sizeof(struct people)*(pc->capacity + INC_SZ));
		if(pc->data == NULL)
		{
		    perror("check_capacity()");
			return 0;
		}
		pc->capacity += INC_SZ;
		printf("增容成功\n");
		return 1;
	}
	else
	{
	    return 1;
	}
}


添加联系人函数

void AddContact(struct con* pc)
{
    assert(pc != NULL);
	if(0 == check_capacity(pc))
	{
	    return;
	}
	printf("请输入联系人的姓名:>\n");
	scanf("%s",pc->data[pc->sz].name);
	printf("请输入联系人的电话:>\n");
	scanf("%s",pc->data[pc->sz].tele);
	printf("请输入联系人的地址:>\n");
	scanf("%s",pc->data[pc->sz].addr);
	printf("请输入联系人的性别:>\n");
	scanf("%s",pc->data[pc->sz].sex);
	printf("请输入联系人的年龄:>\n");
	scanf("%d",&(pc->data[pc->sz].age));

	pc->sz++;
	printf("成功添加新的联系人\n");
    
}


contact.h的文档代码

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>

#define Max 100
#define Max_name 20
#define Max_sex 5
#define Max_tele 12
#define Max_addr 30

#define DEFAULT_SZ 3
#define INC_SZ 2

struct people
{
    char name[Max_name];
	char tele[Max_tele];
	char sex[Max_sex];
	char addr[Max_addr];
	int age;
};

struct con
{
	struct people* data;
	int sz;
	int capacity;
};

//初始化通讯录
void InitContact(struct con* pc);

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

//删除通讯录的指定联系人
void DelContact(struct con* pc);

//显示通讯录
void ShowContact(struct con* pc);

//查找联系人
void SearchContact(struct con* pc);

//修改联系人信息
void ModifyContact(struct con* pc);

//排序联系人
void SortContact(struct con* pc);

//删除通讯录
void DestroyContact(struct con* pc);


contact.c文档代码

#include "contact.h"

void InitContact(struct con* pc)
{
	assert(pc != NULL);
	pc->data = (struct people*)malloc(sizeof(struct people) * DEFAULT_SZ);
	if(pc->data == NULL)
	{
		perror("InitContact()");
		return;
	}
	pc->sz = 0;
	pc->capacity = DEFAULT_SZ;
}

void DestroyContact(struct con* pc)
{
    assert(pc != NULL);
	free(pc->data);
	pc->data = NULL;
	pc->sz = 0;
	pc->capacity = 0;
}

static int check_capacity(struct con* pc)
{
    assert(pc != NULL);
	if(pc->sz == pc->capacity)
	{
		pc->data = (struct people*)realloc(pc->data,sizeof(struct people)*(pc->capacity + INC_SZ));
		if(pc->data == NULL)
		{
		    perror("check_capacity()");
			return 0;
		}
		pc->capacity += INC_SZ;
		printf("增容成功\n");
		return 1;
	}
	else
	{
	    return 1;
	}
}

void AddContact(struct con* pc)
{
    assert(pc != NULL);
	if(0 == check_capacity(pc))
	{
	    return;
	}
	printf("请输入联系人的姓名:>\n");
	scanf("%s",pc->data[pc->sz].name);
	printf("请输入联系人的电话:>\n");
	scanf("%s",pc->data[pc->sz].tele);
	printf("请输入联系人的地址:>\n");
	scanf("%s",pc->data[pc->sz].addr);
	printf("请输入联系人的性别:>\n");
	scanf("%s",pc->data[pc->sz].sex);
	printf("请输入联系人的年龄:>\n");
	scanf("%d",&(pc->data[pc->sz].age));

	pc->sz++;
	printf("成功添加新的联系人\n");
    
}

void ShowContact(struct con* pc)
{
    int i = 0;
	printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n","姓名","性别","年龄","号码","地址");
	for(i=0;i<pc->sz;i++)
	{
	    printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n",pc->data[i].name,
			pc->data[i].sex,
			pc->data[i].age,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

int Findpeople(struct con* pc,char name[])
{
    int i = 0;
	for(i=0;i<pc->sz;i++)
	{
	    if(0 == strcmp(pc->data[i].name,name))
		{
		    return i;
		}
	}
	return -1;
}
void DelContact(struct con* pc)
{
    char name[Max_name];
	int ret = 0;
	int i = 0;
	printf("请输入你要删除的联系人的名字\n");
	scanf("%s",name);
	//查找该联系人
	ret = Findpeople(pc,name);
	if(ret == -1)
	{
	    printf("找不到该联系人\n");
	}
	else
	{
	    //删除
		for(i = ret;i<pc->sz-1;i++)
		{
		    pc->data[i] = pc->data[i+1];
		}
		pc->sz--;
		printf("指定联系人已经删除\n");
	}
}

void SearchContact(struct con* pc)
{
	char name[Max_name];
	int ret = 0;
    printf("输入想要被查找的联系人\n");
	scanf("%s",&name);
	ret = Findpeople(pc,name);
	if(ret == -1)
	{
	    printf("找不到\n");
	}
	else
	{
		printf("%-20s\t%-5s\t%-5s\t%-12s\t%--30s\t\n","姓名","性别","年龄","电话","地址");
		printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\t\n",pc->data[ret].name,
			  pc->data[ret].sex,
			  pc->data[ret].age,
			  pc->data[ret].tele,
			  pc->data[ret].addr);
	}
}

void ModifyContact(struct con* pc)
{
    char name[Max_name];
	int ret = 0;
	printf("请输入要修改的联系人的名字\n");
	scanf("%s",&name);
	ret = Findpeople(pc,name);
	if(ret == -1)
	{
	    printf("不存在该联系人\n");
	}
	else
	{
	    printf("找到该联系人,请依次输入信息进行修改\n");

		printf("请输入该联系人的姓名:>\n");
		scanf("%s",pc->data[ret].name);
		printf("请输入该联系人的电话:>\n");
		scanf("%s",pc->data[ret].tele);
		printf("请输入该联系人的地址:>\n");
		scanf("%s",pc->data[ret].addr);
		printf("请输入该联系人的性别:>\n");
		scanf("%s",pc->data[ret].sex);
		printf("请输入该联系人的年龄:>\n");
		scanf("%d",&(pc->data[ret].age));

		printf("修改联系人成功\n");
	}
}

void menu()
{
    printf("*****************************************\n");
	printf("****** 1.name          2.sex       ******\n");
	printf("****** 3.age           4.addr      ******\n");
	printf("****** 5.tele          0.exit      ******\n");
	printf("*****************************************\n");
}

//以名字顺序排序
int com_by_name(const void* str1,const void* str2)
{
    return strcmp(((struct people*)str1)->name,((struct people*)str2)->name);
}

//以性别顺序排序
int com_by_sex(const void* str1,const void* str2)
{
    return strcmp(((struct people*)str1)->sex,((struct people*)str2)->sex);
}

//以电话顺序排序
int com_by_tele(const void* str1,const void* str2)
{
    return strcmp(((struct people*)str1)->tele,((struct people*)str2)->tele);
}

//以地址顺序排序
int com_by_addr(const void* str1,const void* str2)
{
    return strcmp(((struct people*)str1)->addr,((struct people*)str2)->addr);
}

//以年龄顺序排序
int com_by_age(const void* str1,const void* str2)
{
    return ((struct people*)str1)->age - ((struct people*)str2)->age;
}

void SortContact(struct con* pc)
{
    int input = 0;
again:
	menu();
	printf("请选择以什么方式排序\n");
	scanf("%d",&input);
	switch(input)
	{
	case 1:
		qsort(pc->data,pc->sz,sizeof(struct people),com_by_name);
		break;
	case 2:
		qsort(pc->data,pc->sz,sizeof(struct people),com_by_sex);
		break;
	case 3:
		qsort(pc->data,pc->sz,sizeof(struct people),com_by_age);
		break;
	case 4:
		qsort(pc->data,pc->sz,sizeof(struct people),com_by_addr);
		break;
	case 5:
		qsort(pc->data,pc->sz,sizeof(struct people),com_by_tele);
		break;
	case 0:
		break;
	default:
		printf("选择错误,请重新选择\n");
		goto again;
		break;
	}
	if(input != 0)
	{
		printf("排序成功\n");
	}
	else
	{
	    printf("退出排序成功\n");
	}
}



test.c的文档代码

#include "contact.h"

void Menu()
{
    printf("****************************************\n");
	printf("****** 1.add          2.del       ******\n");
	printf("****** 3.search       4.modify    ******\n");
	printf("****** 5.show         6.sort      ******\n");
	printf("****** 0.exit                     ******\n");
	printf("****************************************\n");
}
int main()
{
	int input = 0;
	struct con contact;
	InitContact(&contact);
	do
	{
		Menu();
	    printf("请选择:>");
		scanf("%d",&input);
		switch(input)
		{
		case 1:
			AddContact(&contact);
			break;
		case 2:
			DelContact(&contact);
			break;			
		case 3:
			SearchContact(&contact);
			break;
		case 4:
			ModifyContact(&contact);
			break;			
		case 5:
			ShowContact(&contact);
			break;
		case 6:
			SortContact(&contact);
			break;		
		case 0:
			DestroyContact(&contact);
			printf("退出通讯录\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	}while(input);
 
}

今天,通讯录的动态版本就分享到这里,关注点一点,下期更精彩。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值