这篇博客和上一篇博客都是实现通讯录,只不过这篇是用动态开辟的方法来实现的,它是预先开辟了一块空间,如果预先空间开辟的空间不够存储添加的成员,那么就动态的增长开辟。
头文件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>