通讯录结构体
// 通讯录个人信息
typedef struct infor{
char name[256];
char num[256];
}infor;
// 通讯录信息
typedef struct {
// 通讯录人数
infor mem[50];
// 通讯录索引
int mem_index;
}member;
菜单
// 菜单
int Menu();
// 初始化通讯录
void Init(member* m);
// 添加联系人
void Insert(member* m);
// 删除联系人
void Delete(member* m);
// 显示联系人
void Display(member* m);
// 查找联系人
void Find(member* m);
// 修改联系人
void Modify(member* m);
// 清空联系人
void Clear(member* m);
// 给联系人按姓名排序
void Swap(infor* m1, infor* m2);
void Sort(member* m);
菜单
int Menu() {
int choice;
printf("1. 添加新的联系人\n");
printf("2. 删除指定联系人\n");
printf("3. 显示所有的联系人\n");
printf("4. 查找指定联系人\n");
printf("5. 修改联系人的信息\n");
printf("6. 清空联系人信息\n");
printf("7. 对联系人进行排序\n");
printf("0. 退出\n");
printf("\n请输入选项\n");
scanf("%d", &choice);
return choice;
}
初始化联系人
void Init(member* m) {
if (m == NULL) {
return;
}
m->mem_index = 0;
}
添加联系人
void Insert(member* m) {
if (m == NULL) {
return;
}
printf("请输入新的联系人的姓名:");
infor* p = &m->mem[m->mem_index];
scanf("%s", p->name);
printf("请输入新的联系人的电话:");
scanf("%s", p->num);
++m->mem_index;
printf("添加成功\n");
}
删除联系人
void Delete(member* m) {
int serial_number;
if (m == NULL) {
return;
}
printf("请输入你要删除的联系人的序号:");
scanf("%d", &serial_number);
if (serial_number < 0 || serial_number >= m->mem_index) {
printf("所输序号有误!\n");
return;
}
if (serial_number == m->mem_index - 1) {
--m->mem_index;
printf("删除联系人成功\n");
return;
}
// 将所删除的联系人编号与最后一个联系人编号交换
m->mem[serial_number] = m->mem[m->mem_index - 1];
--m->mem_index;
printf("删除联系人成功!\n");
}
显示联系人
void Display(member* m) {
int i;
if (m == NULL) {
return;
}
for (i = 0; i < m->mem_index; ++i) {
printf("%d.姓名: %s\t电话:%s\n", i, m->mem[i].name, m->mem[i].num);
}
}
查找联系人
void Find(member* m) {
int index;
if (m == NULL) {
return;
}
printf("请输入你要查找的联系人的序号:");
scanf("%d", &index);
if (index < 0 || index > m->mem_index - 1) {
printf("输入序号有误\n");
return;
}
printf("%d.姓名:%s\t电话:%s\n", index, m->mem[index].name, m->mem[index].num);
printf("查找成功!\n");
}
修改联系人
void Modify(member* m) {
int index;
int type;
if (m == NULL) {
return;
}
printf("请输入你要修改的联系人的序号:");
scanf("%d", &index);
if (index < 0 || index > m->mem_index - 1) {
printf("输入有误!\n");
return;
}
infor* p = &m->mem[index];
printf("1. 姓名\n");
printf("2. 电话\n");
printf("请输入你要修改的类型:");
scanf("%d", &type);
if (type < 1 || type > 2) {
printf("输入有误!\n");
return;
}
if (type == 1) {
char new_name[256] = {0};
printf("请输入联系人的姓名:");
scanf("%s", new_name);
strcpy(p->name, new_name);
} else {
char new_num[256] = {0};
printf("请输入联系人的电话:");
scanf("%s", new_num);
strcpy(p->num, new_num);
}
printf("修改成功\n");
}
清空联系人
void Clear(member* m) {
if (m == NULL) {
return;
}
m->mem_index = 0;
printf("通讯录已经清空!\n");
}
对联系人进行排序
void Swap(infor* m1, infor* m2) {
char name_tmp[256] = {0};
char num_tmp[256] = {0};
strcpy(name_tmp, m1->name);
strcpy(m1->name, m2->name);
strcpy(m2->name, name_tmp);
strcpy(num_tmp, m1->num);
strcpy(m1->num, m2->num);
strcpy(m2->num, num_tmp);
}
void Sort(member* m){{
int i;
int j;
if (m == NULL) {
return;
}
for (i = 0; i < m->mem_index - 1; ++i) {
for (j = 0; j < m->mem_index - 1 - i; ++j) {
if (strcmp(m->mem[j].name, m->mem[j + 1].name) > 0) {
Swap(&m->mem[j], &m->mem[j + 1]);
}
}
}
printf("排序成功\n");
}
测试(主函数)
int main() {
member m;
Init(&m);
// 通过表驱动的形式来减少代码的圈复杂度
typedef void (*T) (member* m);
T menu[] = {
Insert,
Delete,
Display,
Find,
Modify,
Clear,
Sort
};
int choice = Menu();
while (1) {
if (choice == 0) {
printf("Goodbye!\n");
break;
}
menu[choice - 1](&m);
printf("\n请输入接下来的操作选项\n");
scanf("%d", &choice);
}
return 0;
}
效果图
有文件版
https://blog.youkuaiyun.com/qq_42957923/article/details/88372551