1. 大致思路
刚开始就申请一段结构体数组空间用于存放联系人信息,通过count来确定该空间的有效长度,一切操作都是基于count的变化来完成的;
2. 优缺点
2.1. 优点
效率较快,操作简单,代码量少
2.2. 缺点
刚开始申请了大量内存,数据太少会造成,数据过大时修改比较麻烦
3.代码:
addressBook.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Max 1000 //最大存储人数
enum OP{
EXIT,
ADD,
FIND,
SHOW,
MODIFY,
DELE,
EMPTY,
SORT,
SAVE
}; //使用枚举类型列举出操作,可看作是对0-8的简单化宏定义
typedef struct Stu{
char name[10];
char sex[3];
int age;
char phone[12];
char address[30];
}Stu;//个人信息
typedef struct AddressBook{
Stu stu[Max];
int count;
}AddressBook,* ptxl;//通讯录
void initiate(ptxl ptxl);//初始化通讯录
void add(ptxl ptxl);//添加一个信息
void find(ptxl ptxl);//查找一个信息
void show(ptxl ptxl);//显示所有信息
void modify(ptxl ptxl);//修改一个信息
void dele(ptxl ptxl);//删除一个信息
void empty(ptxl ptxl);//清空通讯录
void sort(ptxl ptxl);//按名字排序所有信息
void save(ptxl ptxl);//保存一个信息
void menu();//通讯录初始界面,打印一个菜单
static int check(ptxl ptxl,const char * name){
int i = 0;
for(;i < ptxl ->count;i++){
if(strcmp(name,ptxl->stu[i].name) == 0){
return i;
}
}
return -1;
} // 查询函数,查找是否有需要操作的人
void initiate(ptxl ptxl){
ptxl -> count = 0;
} //初始化函数
void add(ptxl ptxl){
if(ptxl ->count == Max){
printf("通讯录已满,请清除部分无用数据后重新尝试添加\n");
return ;
}
printf("姓名:");
scanf("%s",ptxl -> stu[ptxl -> count].name);
printf("性别:");
scanf("%s",ptxl -> stu[ptxl -> count].sex );
printf("年龄:");
scanf("%d",&ptxl -> stu[ptxl -> count].age);
printf("电话:");
scanf("%s",ptxl -> stu[ptxl -> count].phone);
printf("住址:");
scanf("%s",ptxl -> stu[ptxl -> count].address);
ptxl ->count ++;
printf("添加成功!\n");
}
void find(ptxl ptxl){
int ret = 0;
char name[10];
printf("请输入要查找人的姓名");
scanf("%s",name);
ret = check(ptxl,name);
if(ret == -1){
printf("通讯录中没有要查找的人\n");
return ;
}else{
printf("姓名\t性别\t年龄\t电话\t\t住址\n");
printf("%s\t%s\t%d\t%s\t%s\n",ptxl->stu[ret].name,ptxl->stu[ret].sex,ptxl->stu[ret].age,ptxl->stu[ret].phone,ptxl->stu[ret].address);
}
}
void show(ptxl ptxl){
int i = 0;
printf("姓名\t性别\t年龄\t电话\t\t住址\n");
for(;i < ptxl ->count;i++){
printf("%s\t%s\t%d\t%s\t%s\n",ptxl->stu[i].name,ptxl->stu[i].sex,ptxl->stu[i].age,ptxl->stu[i].phone,ptxl->stu[i].address);
}
}
void modify(ptxl ptxl){
int ret = 0;
char name[10];
printf("请输入要修改人的姓名");
scanf("%s",name);
ret = check(ptxl,name);
if(ret == -1){
printf("通讯录中没有此人,无法修改\n");
return ;
}else{
printf("姓名:");
scanf("%s",ptxl -> stu[ret].name);
printf("性别:");
scanf("%s",ptxl -> stu[ret].sex );
printf("年龄:");
scanf("%d",&ptxl -> stu[ret].age);
printf("电话:");
scanf("%s",ptxl -> stu[ret].phone);
printf("住址:");
scanf("%s",ptxl -> stu[ret].address);
}
}
void dele(ptxl ptxl){
int ret = 0;
char name[10];
int j = 0;
printf("请输入要修改人的姓名");
scanf("%s",name);
ret = check(ptxl,name);
if(ret == -1){
printf("通讯录中没有此人,无法删除\n");
return ;
}else{
for(j = ret;j < ptxl ->count -1;j++){
ptxl->stu[j] = ptxl->stu[j + 1];
}
}
ptxl -> count--;
printf("删除成功\n");
}
void empty(ptxl ptxl){
ptxl ->count = 0;
printf("通讯录已清空");
}
void sort(ptxl ptxl){
int i = 0;
int j = 0;
for(;i < ptxl->count;i++){
for(j = i + 1;i < ptxl->count;j++){
if(strcmp(ptxl ->stu[i].name,ptxl ->stu[j].name) > 0){
Stu temp = ptxl -> stu[i];
ptxl ->stu[i] = ptxl ->stu[j];
ptxl ->stu[j] = temp;
}
}
}
}
void save(ptxl ptxl){
FILE *fp;
int i = 0;
fp = fopen("list","w");
if(!fp){
perror("文件打开失败");
exit(1);
}
while(i < ptxl -> count){
fwrite(&ptxl->stu[i],sizeof(Stu),1,fp);
i++;
}
fclose(fp);
printf("联系人保存文件完毕\n");
return ;
}
void menu(){
printf("**************************\n");
printf("** 班级通讯录管理系统 **\n");
printf("**************************\n");
printf(" [1]添加联系人\n");
printf(" [2]查找联系人\n");
printf(" [3]显示联系人\n");
printf(" [4]修改联系人\n");
printf(" [5]删除联系人\n");
printf(" [6]清空联系人\n");
printf(" [7]排序联系人\n");
printf(" [8]保存联系人\n");
printf(" [0]退出通讯录\n");
printf("**************************\n");
}
int main(){
AddressBook txl;
int input = 1;
initiate(&txl);
while(input){
menu();
printf("请输入你要做的操作(0-8):");
scanf("%d",&input);
switch(input){
case ADD:
add(&txl);
break;
case FIND:
find(&txl);
break;
case SHOW:
show(&txl);
break;
case MODIFY:
modify(&txl);
break;
case DELE:
dele(&txl);
break;
case EMPTY:
empty(&txl);
break;
case SORT:
sort(&txl);
break;
case SAVE:
save(&txl);
break;
case EXIT:
exit(EXIT_SUCCESS);
break;
}
}
return 0;
}