通讯录进阶——动态通讯录

上次的通讯录存储空间是固定的,如果朋友人少就会造成内存的浪费,使用动态版可以使内存浪费情况减轻,用多少就开辟多少,满了就重新开辟。

头文件

Contact.h
#define _CRT_SECURE_NO_WARNINGS
#ifndef __CONTACT_H__ 
#define __CONTACT_H__ 


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


#define MAX 3 //通讯录最大存储量
#define NAME_MAX 20//名字最大长度 
#define SEX_MAX 5 //性别...
#define ADDR_MAX 30 //地址...
#define TELE_MAX 12 //电话...
#define DEFAULT_SIZE 3//有效量
#define DEFAULT_CIN 2//增长


typedef struct PeoInfo 
{ 
	char name[NAME_MAX]; 
	int age; 
	char sex[SEX_MAX]; 
	char addr[ADDR_MAX]; 
	char tele[TELE_MAX]; 
}PeoInfo;//定义的新类型	




typedef struct Contact 
{ 
	PeoInfo *data; //存储位置
	int sz;//有效数据个数
	int capacity;//容量
}Contact, *pContact; 




void InitContact(pContact pcon); //初始化通讯录
void AddContact(pContact pcon); //添加
void ShowContact(const pContact pcon); //展示
void DelContact(pContact pcon); //删除
void SearchContact(pContact pcon); //查找
void ModifyContact(pContact pcon);//修改 
void SortContact(pContact pcon); //排序
void ClearContact(pContact pcon);//清空 
void CheckCapacity(pContact pcon);
void DestroyContact(pContact pcon);
#endif

测试程序

test.c
#define _CRT_SECURE_NO_WARNINGS
#include "Contact.h"
void menu()//菜单
{
	printf("*******************************************************\n");
	printf("*************      1.ADD         2.DEL   **************\n");
	printf("********           3.SEARCH      4..MODIFY     ********\n");
	printf("*************      5.SHOW        6.CLEAR   ************\n");
	printf("*************      7.SORT        0.EXIT  **************\n");
	printf("*******************************************************\n");

	
}
enum
{
	EXIT,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SHOW,//5
	CLEAR,//6
	SORT//7
 
};
void test()
{
	int input = 0;
	Contact my_con;
	InitContact(&my_con);//初始化通讯录
	
	do 
	{
		menu();//打印菜单
		printf("请选择:>");
		scanf("%d",&input);
		switch (input)
		{
		case ADD:
			AddContact(&my_con);
			break;
		case SHOW:
			ShowContact(&my_con);
			break;
		case DEL:
			DelContact(&my_con);
			break;
		case SEARCH:
			SearchContact(&my_con);
			break;
		case MODIFY:
			ModifyContact(&my_con);
			break;
		case CLEAR:
			ClearContact(&my_con);
			break;
		case SORT:
			SortContact(&my_con);
			break;
		case  EXIT:
			DestroyContact(&my_con);
			break;
		default:
		
			break;
			
		}
	} while (input);
}
int main()
{
	test();
	
	return 0;
}

功能实现程序:

Contact.c
#define _CRT_SECURE_NO_WARNINGS
#include "Contact.h"
void InitContact(pContact pcon)//初始化通讯录
{
	pcon->sz = 0;
	pcon->data = malloc(DEFAULT_SIZE*sizeof(PeoInfo));
	if (pcon->data == NULL)
	{
		perror("malloc:");
		exit(EXIT_FAILURE);
	}
	
	memset(pcon->data, 0, DEFAULT_SIZE*sizeof(PeoInfo));
	pcon->capacity = DEFAULT_SIZE;
}

void CheckCapacity(pContact pcon)
{
	PeoInfo *str = NULL;
	assert(pcon!=NULL);
	if (pcon->sz == pcon->capacity)
	{
		 
		str = realloc(pcon->data, (pcon->capacity+DEFAULT_CIN)*sizeof(PeoInfo));
		if (str == NULL)
		{
			perror("realloc:");
			exit(EXIT_FAILURE);
		}
		else
		{
			 pcon->data = str;
		}
		pcon->capacity += DEFAULT_CIN;
		printf("增容成功\n");
	}
	
}
void AddContact(pContact pcon)//添加联系人
{
	assert(pcon!=NULL);
	CheckCapacity(pcon);
	printf("请输入姓名:>\n");
	scanf("%s",pcon->data[pcon->sz].name);
	printf("请输入性别:>\n");
	scanf("%s",pcon->data[pcon->sz].sex);
	printf("请输入年龄:>\n");
	scanf("%d",&(pcon->data[pcon->sz].age));
	printf("请输入地址:>\n");
	scanf("%s",pcon->data[pcon->sz].addr);
	printf("请输入电话:>\n");
	scanf("%s",pcon->data[pcon->sz].tele);
	pcon->sz++;
	printf("录入成功!\n");

}
int find(pContact pcon,char name[])//通用的查找函数
{
	
	int i = 0;
   assert(pcon!=NULL);
	for (i=0; i<pcon->sz; i++)
	{
		if (strcmp(pcon->data[i].name ,name) == 0)
		{
			
			return i;
		}
		
		}
	return -1;
	
}
void DelContact(pContact pcon)//删除联系人
{
	int ret = 0;
	char name[NAME_MAX] = {0};
	assert(pcon!=NULL);
	printf("请输入要删除人的名字:>");
	scanf("%s",name);
	ret = find(pcon, name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	else
	{
		int i =0;
		for (i=ret; i<pcon->sz; i++)
		{
			pcon->data[i] = pcon->data[i+1];
		}
		pcon->sz--;
		printf("删除成功\n");
	}
	

}
void SearchContact(pContact pcon)//查找联系人
{
	int ret = 0;
   char name[NAME_MAX] = {0};
   assert(pcon!=NULL);
   printf("请输入要查找的名字:>");
   scanf("%s",name);
	ret = find(pcon,name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	else
	{
		printf("%10s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "性别", "年龄", "地址", "电话");
		
			printf("%10s\t%5s\t%5d\t%15s\t%15s\n", pcon->data[ret].name, 
				pcon->data[ret].sex,
				pcon->data[ret].age,
				pcon->data[ret].addr, 
				pcon->data[ret].tele);	
		

	}

}
void ModifyContact(pContact pcon)//修改联系人
{
	int ret = 0;
	char name[NAME_MAX] = {0};
	assert(pcon!=NULL);
	printf("请输入要修改人的名字:>");
	scanf("%s",name);
	ret = find(pcon,name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
	}
	else
	{
		printf("请输入姓名:>\n");
		scanf("%s",pcon->data[ret].name);
		printf("请输入性别:>\n");
		scanf("%s",pcon->data[ret].sex);
		printf("请输入年龄:>\n");
		scanf("%d",&(pcon->data[ret].age));
		printf("请输入地址:>\n");
		scanf("%s",pcon->data[ret].addr);
		printf("请输入电话:>\n");
		scanf("%s",pcon->data[ret].tele);

	}

}
void ShowContact(const pContact pcon)//展示联系人
{
	int i = 0;
	assert(pcon!=NULL);
	printf("%10s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "性别", "年龄", "地址", "电话");
	for (i=0; i<pcon->sz; i++)
	{
		printf("%10s\t%5s\t%5d\t%15s\t%15s\n", pcon->data[i].name, 
			pcon->data[i].sex,
			pcon->data[i].age,
			pcon->data[i].addr, 
			pcon->data[i].tele);	
	}

}
void ClearContact(pContact pcon)//清空联系人
{
	assert(pcon!=NULL);
	pcon->sz = 0;
}
void SortContact(pContact pcon)//按名字进行排序
{
	int i = 0;
	int j = 0;
	PeoInfo tmp;
	assert(pcon!=NULL);
	for (i=0; i<pcon->sz; i++)
	{
		for (j=0; j<pcon->sz-i-1; j++)
		{
			if (strcmp(pcon->data[j].name, pcon->data[j+1].name)>0)
			{
				tmp = pcon->data[j];
				pcon->data[j] = pcon->data[j+1];
				pcon->data[j+1] = tmp;
			}
		}
	}
	ShowContact(pcon);
}
void DestroyContact(pContact pcon)
{
	assert(pcon != NULL);
	free(pcon->data);
	pcon ->data= NULL;
	pcon ->sz =  0;
	pcon->capacity = 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值