目录

测试通讯录
函数的实现
函数的类型和声明
- #define MAX 100
- #define MAX_NAME 20
- #define MAX_SEX 5
- #define MAX_TELE 12
- #define MAX_ADDR 30
-
-
- //人的信息
- typedef struct PeoInfo
- {
-
- char name[MAX_NAME];
- int age;
- char sex[MAX_SEX];
- char tele[MAX_TELE];
- char addr[MAX_ADDR];
-
- }PeoInfo;
-
-
-
- //通讯录
- typedef struct Contact
- {
-
-
- PeoInfo date[MAX];
- int count;
-
-
- }Contact;
代码开头使用了#define来定义需要用到的值
这种方法只需修改一次值 不用在海量的代码中一次次修改
是非常不错的代码设计技巧
Contact的元素有 存放练习人信息的结构体数组date 以及 联系人数量count
Peoinfo的元素则为 联系人的姓名 年龄 性别 电话 住址
- //打印菜单
-
- void menu()
- {
- printf("********************************************************\n");
- printf("******** 1.增加联系人 2.删除联系人 ********\n");
- printf("******** 3.查找联系人 4.修改联系人 ********\n");
- printf("******** 5.显示联系人 6.排序联系人 ********\n");
- printf("******** 0.退出通讯录 ********\n");
- printf("********************************************************\n");
-
-
- }

设计分支选项 选择操作函数
- int main()
- {
-
- int input = 0;
- Contact con; //通讯录
- InitContact(&con); //初始化通讯录
-
- do
- {
- menu();
- printf("请选择:>");
- scanf("%d", &input);
- switch (input)
- {
- case ADD:
- AddContact(&con);
- break;
- case DEL:
- DelContact(&con);
- break;
- case SEARCH:
- SearchContact(&con);
- break;
- case MODIFY:
- ModifyContact(&con);
- break;
- case SHOW:
- ShowContact(&con);
- break;
- case SORT:
- //SortContact(&con);
- QsortContact(&con);
- break;
- case EXIT:
- printf("退出通讯录\n");
- break;
- default:
- printf("输入错误请重新输入!!!\n");
- break;
- }
- } while (input);
-
-
- return 0;
- }
我们可以看到 主函数运用了Switch分支语句对选项进行了分类 在这里运用了一个枚举的小技巧
将选择值赋予对应的选项 方便我们在代码调试快速找到对应的问题

- //初始化通讯录函数
- void InitContact(Contact* pc)
- {
- assert(pc);
- memset(pc->date,0,sizeof(pc->date));
- pc->count = 0;
-
- }
memset 三个参数分别为 初始化空间的地址 初始化内容 初始化空间的字节大小
- //添加联系人
- void AddContact(Contact* pc)
- {
- assert(pc);
-
- if (pc->count == MAX)
- {
- printf("通讯录已满无法添加\n");
- }
-
-
- printf("请输入需要添加人的信息\n");
-
- printf("请输入姓名:>");
- scanf("%s", pc->date[pc->count].name);
- printf("请输入年龄:>");
- scanf("%d", &(pc->date[pc->count].age));
- printf("请输入性别:>");
- scanf("%s", pc->date[pc->count].sex);
- printf("请输入电话:>");
- scanf("%s", pc->date[pc->count].tele);
- printf("请输入住址:>");
- scanf("%s", pc->date[pc->count].addr);
-
- pc->count++;
-
- }
- //删除指定联系人
- void DelContact(Contact* pc)
- {
-
- assert(pc);
-
- if (pc->count == 0)
- {
- printf("通讯录为空,无法删除\n");
- return;
- }
-
- assert(pc);
- char name[MAX_NAME] = { 0 };
- printf("请输入要删除人的名字:>");
- scanf("%s",name);
-
- 找到要删除的联系人
- //int i = 0;
- //int del = 0;
- //int flag = 0;
- //for ( i = 0; i < pc->count; i++)
- //{
- // if (strcmp(name,pc->date[i].name) == 0) //字符比较用strcmp
- // {
- // del = i;
- // flag = 1;
- // break;
- // }
-
- //}
- //if (flag == 0)
- //{
- // printf("要删除的人不存在\n");
- // return;
- //}
-
-
- int del = FindByName(pc,name);
- if (del == -1)
- {
- printf("要删除的人不存在\n");
- return;
- }
-
- //删除坐标为del的联系人
- int i = 0;
- for ( i = del; i < pc->count-1; i++)
- {
- pc->date[i] = pc->date[i + 1];
-
- }
- pc->count--;
-
- printf("成功删除联系人\n");
-
-
- }
- //查找联系人
- void SearchContact(const Contact* pc)
- {
- assert(pc);
-
- char name[MAX_NAME] = { 0 };
- printf("请输入要查找联系人的名字:>");
- scanf("%s", name);
- int find = FindByName(pc, name);
- if (find == -1)
- {
- printf("要查找的人不存在\n");
- }
- else
- {
-
- printf("%-10s %-10s %-10s %-20s %-20s\n", "姓名", "性别", "年龄", "电话", "地址");
- printf("%-10s %-10d %-10s %-20s %-20s\n",
- pc->date[find].name,
- pc->date[find].age,
- pc->date[find].sex,
- pc->date[find].tele,
- pc->date[find].addr);
-
- }
-
-
-
- }
- //修改指定联系人
- void ModifyContact(Contact* pc)
- {
-
- assert(pc);
-
- char name[MAX_NAME] = { 0 };
- printf("请输入要修改联系人的名字:>");
- scanf("%s", name);
- int mod = FindByName(pc, name);
- if (mod == -1)
- {
- printf("要修改的人不存在\n");
- }
- else
- {
-
- printf("请输入需要修改的信息\n");
-
- printf("请输入姓名:>");
- scanf("%s", pc->date[mod].name);
- printf("请输入年龄:>");
- scanf("%d", &(pc->date[mod].age));
- printf("请输入性别:>");
- scanf("%s", pc->date[mod].sex);
- printf("请输入电话:>");
- scanf("%s", pc->date[mod].tele);
- printf("请输入住址:>");
- scanf("%s", pc->date[mod].addr);
- printf("修改成功\n");
-
- }
-
-
-
- }
- //冒泡排序
- void SortContact(Contact* pc)
- {
-
- if (pc->count == 0)
- {
- printf("通讯录为空,无法排序!!!\n");
- return;
- }
- if(pc->count == 1)
- {
- printf("只有一位联系人,无需排序!!!\n");
- return;
- }
-
-
- int i = 0;
- int j = 0;
- PeoInfo temp = { 0 };
-
- for ( i = 0; i < pc->count-1; i++)
- {
- for (j = 0; j < pc->count-i-1; j++)
- {
- if (strcmp(pc->date[i].name, pc->date[i + 1].name) < 0)
- {
-
- PeoInfo temp = pc->date[i];
- pc->date[i] = pc->date[i + 1];
- pc->date[i + 1] = temp;
-
- }
- }
-
-
- }
- printf("排序成功\n");
-
- }
- //qsort调用
-
- int compar(const void* p1, const void* p2)
- {
-
- return strcmp(((PeoInfo*)p1)->name, ((PeoInfo*)p2)->name);
-
- }
-
-
-
- void QsortContact(Contact* pc)
- {
- // 首元素地址 元素个数 元素大小 比较函数
- qsort(pc->date, pc->count, sizeof(pc->date[0]), compar);
- printf("排序成功\n");
-
- }
qsort四个参数分别是 首元素地址 元素个数 元素大小 比较函数
通过比较名字长度 从而对整个结构体进行交换

