typedef struct peoInfo //重定义
{
char name[20]; //姓名
int age ; //年龄
char sex[10]; //性别
char tele[12]; //手机号
char addr[30]; //地址
}peoInfo;
1.2通讯录名单
typedef struct Contact
{
peoInfo data[100]; //人员名单 结构体数组
int count; //人员数量
}Contact;
1.3人员初始化
void InitContact(Contact* con)
{
assert(con);
con->count=0; //初始人数为0
memset(con->data,0,sizeof(con->data)); //这是一个c语言的库函数把数组里面的数全部初始化为0
}
1.4菜单
void menu(void)
{
printf("===============================\n");
printf("====1.add 2. del 3.serch=====\n");
printf("=====4.modify 5.show======\n");
printf("=====6.sort 0.exit======\n");
printf("===============================\n");
printf("===============================\n");
}
1.5主函数
enum a
{
ext, //这里用了简单的枚举的方法 枚举的初始值为0
add,
del,
serch,
modify,
show,
sort
};
int main()
{
int choice;
Contact con; //通讯录
do
{
menu();
printf("请选择功能\n");
scanf("%d",&choice);
switch(choice)
{
case add:
AddContact(&con); //实现增加功能的函数
break ;
case del:
DelContanct(&con); //实现删除功能的函数
break ;
case serch:
SerContact(&con); //实现查找功能的函数
break ;
case modify:
ModContact(& con); //实现修改功能的函数
break ;
case show:
ShowContact(&con); //实现展示功能的函数
break ;
case sort:
SorContact(&con); //实现排序功能的函数
break ;
case ext :
printf("程序结束\n");
break;
default :
printf("输入有误请重新输入\n");
}
}while(choice);
return 0;
}
2. 功能实现
2.1增加人数
void AddContact(Contact* con)
{
assert(con); //指针不能为空
if(con->count==Max)
{
printf("存放已满\n");
return ;
}
printf("请输入名字");
scanf("%s",con->data[con->count].name);
printf("请输入年龄");
scanf("%d",&(con->data[con->count].age));
printf("请输入性别");
scanf("%s",con->data[con->count].sex);
printf("请输入电话");
scanf("%s",con->data[con->count].tele);
printf("请输入地址");
scanf("%s",con->data[con->count].addr);
con->count++;
printf("增加成功\n");
}
2.2删除人数
static int xiaomafind(Contact* con,char name[])
{
assert(con);
int i=0;
for(i=0;i<con->count;i++)
{
if(0==strcmp(con->data[i].name,name)) //通过名字来查找看是否存在 ,如果有返回下标。
{
return i;
}
else
{
return -1;
}
}
void DelContanct(Contact* con)
{
char name[20]={0};
printf("请输入你想删除的名字\n");
assert(con);
int i;
scanf("%s",name);
int pos=xiaomafind(con,name);
if(pos==-1)
{
printf("没有你要删除的人\n");
}
else
{
for(i=pos;i<con->count;i++)
{
con->data[i]=con->data[i+1]; //通过数组后一个覆盖前一个来完成删除功能
}
con->count--; //删除完成后人员减一
printf("删除成功\n");
}
}
2.3查找
static int xiaomafind(Contact* con,char name[])
{
assert(con);
int i=0;
for(i=0;i<con->count;i++)
{
if(0==strcmp(con->data[i].name,name))
{
return i;
}
}
return -1;
}
void SerContact(Contact *con)
{
char name[20]={0};
printf("请输入你想查找的名字\n");
assert(con);
scanf("%s",name);
int find =xiaomafind(con,name);
if(find==-1)
{
printf("没有你要查找的用户\n");
}
else{
printf("查找成功\n");
}
}
2.4展示
void ShowContact( const Contact* con)
{
assert(con);
int i;
for(i=0;i<con->count;i++)
{
printf("%2s\t%3d\t%5s\t%12s\t%30s\n",con->data[i].name,con->data[i].age,con->data[i].sex,con->data[i].tele,con->data[i].addr);
}
}
2.5排序(按姓名首字母排序)
int cmp_stu_by_name(const void*e1,const void*e2)
{
return strcmp(((peoInfo*)e1)->name,((peoInfo*)e2)->name);
}
void SorContact(Contact* con)
{
assert(con);
qsort(con->data, con->count, sizeof(peoInfo), cmp_stu_by_name);
}