用静态开辟的方法是一次性就把内存开辟好。
头文件concate.h
#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 MAX_CON 1000
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[MAX_CON];
int count;
}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);
#endif //_CONCATE_H__
源文件concate.c
#include "concate.h"
void Initcon(pCon pcon) //初始化
{
memset(pcon->con,0,MAX_CON*sizeof(Peo)); //
pcon->count =0;
}
void add(pCon pcon) //添加信息
{
if(pcon->count>=MAX_CON)
{
printf("电话本已满");
}
else
{
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);
}
}
测试源文件test.c
#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:
{
Exit(&my_con);
break;
}
default:
break;
}
}
system("pause");
return 0;
}