通讯录(动态版本)

这篇博客和上一篇博客都是实现通讯录,只不过这篇是用动态开辟的方法来实现的,它是预先开辟了一块空间,如果预先空间开辟的空不够存储成员,那么就动态的增长开辟。

头文件concate.h

<span style="font-size:18px;">#ifndef __CONCATE_H__
#define __CONCATE_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX_NAME 10
#define MAX_SEX  5
#define MAX_ADDR 20
#define MAX_TELE 12
#define DEFAULT  2         //初始通讯录大小
#define INC_COUNT 10       //每次增容大小

typedef struct PeoINFO
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}Peo;
typedef struct Con
{
	Peo *con;
	int count;
	int capacity;
}Con,*pCon;

void Initcon(pCon pcon);
void add(pCon pcon);
void show(pCon pcon);
void del(pCon pcon);
void search(pCon pcon); 
void mod(pCon pcon);
void sort(pCon pcon);
void Exit(pCon pcon);
void destory(pCon pcon);
#endif  //_CONCATE_H__</span>

源文件concate.c

<span style="font-size:18px;">#include "concate.h"
void Initcon(pCon pcon)      //初始化
{
	pcon->con =(Peo*)malloc(DEFAULT*sizeof(Peo));
	if(pcon->con ==NULL)
	{
		printf("out of memory\n");
		exit(EXIT_FAILURE);
	}
	memset(pcon->con,0,DEFAULT*sizeof(Peo));  //
	pcon->count =0;
	pcon->capacity =DEFAULT;
}
void check_capa(pCon pcon)    //检测
{
	Peo *ptr=NULL;
	if(pcon->count ==pcon->capacity )
	{
		 ptr=(Peo*)realloc(pcon->con ,(pcon->count +INC_COUNT)*sizeof(Peo));
		   if(ptr ==NULL)
	     {
		    printf("out of memory\n");
		    exit(EXIT_FAILURE);
	     }
	       else
	    {
		   pcon->con =ptr;
		   pcon->capacity =pcon->capacity  +INC_COUNT;
	    }
	}
	
}
void add(pCon pcon)        
{
	    check_capa(pcon);
		printf("name:");
		scanf("%s",pcon->con [pcon->count ].name);
		printf("age:");
        scanf("%d",&(pcon->con [pcon->count ].age));
		printf("sex:");
        scanf("%s",pcon->con [pcon->count ].sex);
		printf("tele:");
        scanf("%s",pcon->con [pcon->count ].tele);
		printf("addr:");
        scanf("%s",pcon->con [pcon->count ].addr );
		pcon->count++;
		
	
}
int find(pCon pcon)
{
    char name[10]={0};
	int i=0;
	printf("请输入姓名:>");
	scanf("%s",name);
	for(i=0;i<pcon->count ;i++)
	{
        if(strcmp(name,pcon->con [i].name)==0)
		{
			return i;
		}
	}
	return -1;
}
void del(pCon pcon)
{
	int i=0;
	int ret=0;
	if(pcon->count ==0)
	{
		printf("通讯录为空\n");
		return;
	}
	ret=find(pcon);
	if(ret==-1)
	{
		printf("没有找到\n");
	}
	else
	{
		for(i=ret;i<pcon->count-1;i++)
		{
			pcon->con [i]=pcon->con [i+1];
		}
        pcon->count --;
		printf("删除成功\n");
	}
	
}
void search(pCon pcon)
{
	int ret=0;
	if(pcon->count ==0)
	{
		printf("通讯录为空\n");
		return;
	}
	ret=find(pcon);
	if(ret==-1)
	{
		printf("没有找到\n");
	}
	else
	{
	
		printf("%5s\t%s\t%5s\t%5s\t%5s\n","name","age","sex","tele","addr");
		printf("%5s\t%d\t%5s\t%5s\t%5s\n",pcon->con [ret ].name,
			pcon->con [ret ].age,pcon->con [ret].sex,
			pcon->con [ret ].tele,pcon->con [ret ].addr);
	}
}
void mod(pCon pcon)
{
	int ret=0;
	if(pcon->count ==0)
	{
		printf("通讯录为空\n");
		return;
	}
    ret=find(pcon);
	if(ret==-1)
	{
		printf("没有找到\n");
	}
	else
	{
		printf("name:");
		scanf("%s",&(pcon->con [ret].name) );
		printf("age:");
        scanf("%d",&(pcon->con [ret ].age));
		printf("sex:");
        scanf("%s",&(pcon->con [ret].sex) );
		printf("tele:");
        scanf("%s",&(pcon->con [ret].tele) );
		printf("addr:");
        scanf("%s",&(pcon->con [ret].addr) );
	}
}
void sort(pCon pcon)     //从小到大
{
	int flag=0;
	int i=0;
	int j=0;
	for(i=0;i<pcon->count -1;i++)
	{
		flag=1;
		for(j=0;j<pcon->count -i-1;j++)
		{
			if(strcmp(pcon->con [j].name ,pcon->con [j+1].name )>0)
			{
				Peo tmp=pcon->con [j];
				pcon->con [j]=pcon->con [j+1];
				pcon->con [j+1]=tmp;
				flag=0;
			}

		}
		if(flag==1)
			break;
	}
 //show(pcon);
	printf("排序完成\n");
}
void Exit(pCon pcon)
{
	exit(0);
}


void show(pCon pcon)
{
	int i=0;
	printf("%5s\t%s\t%5s\t%5s\t%5s\n","name","age","sex","tele","addr");
	//printf("%d\n",pcon->count );
	for(i=0;i<pcon->count ;i++)
	{
		printf("%5s\t%d\t%5s\t%5s\t%5s\n",pcon->con [i ].name,
			pcon->con [i ].age,pcon->con [i ].sex,
			pcon->con [i ].tele,pcon->con [i].addr);
	}
}

void destory(pCon pcon)
{
	if(pcon->con !=NULL)
	{
		free(pcon->con );
		pcon->con =NULL;
	}
}
</span>
测试源文件test.c

<span style="font-size:18px;">#include "concate.h"
enum op
{
	EXIT,    //从0开始
	ADD,
	DEL,
	SEARCH,
	MOD,
	SHOW,
	SORT
};   //增加代码的可读性
void menu()
{
	printf("****1.add 2.del 3.search 4.mod 5.show 6.sort 0.exit****\n");
}
int main()
{
	Con my_con;
	int input=1;
	Initcon(&my_con);
	while(input)
	{
		menu();
		printf("请输入:>");
		scanf("%d",&input);
		switch(input)
		{
		case ADD:
			{
			    add(&my_con);
			    break;
			}
		case DEL:
			{
			    del(&my_con);
			    break;
			}
		case SEARCH:
			{
			    search(&my_con);
			    break;
			}
		case MOD:
			{
			    mod(&my_con);
			    break;
			}
		case SHOW:
			{
			    show(&my_con);
			    break;
			}
		case SORT:
			{
			    sort(&my_con);
			    break;
			}
		case EXIT:
			{
			    destory(&my_con);
			    Exit(&my_con);
			    break;
			}
		default:
			break;
		}
	}
	system("pause");
	return 0;

}</span>


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值