排序通讯录
排序我也按照通讯录中联系人的名字来排序,这就用到了之前的函数,qsort。
contacts.c
int estimate(const void* p1, const void* p2) { return strcmp(((person*)p1)->name, ((person*)p2)->name);//比较的是联系人中姓名的大小 } void sortcontact(contacts* pc) { assert(pc != NULL); qsort(pc->data, pc->count, sizeof(person), estimate);//利用接收estimate函数的返回值然后排序data数组里面的元素 printf("排序成功\n"); }
看看是否有问题:
没问题。
完整的代码
contacts.h
#include <stdio.h> #include <string.h> #include <assert.h> #include <stdlib.h> #define MAX 100//通讯录最大人数 //定义的结构体 typedef struct person { char name[20];//名字 int age;//年龄 char sex[20];//性别 char phone[20];//电话 char location[20];//住址 }person; typedef struct contacts { person data[100];//存放人信息的位置 int count;//记录通讯录的人数 }contacts; //函数声明区 void initialize(contacts* pc);//初始化通讯录 void addcontact(contacts* pc);//输入联系人信息 void showcontact(const contacts* pc);//打印通讯录 int delcontact(contacts* pc);//删除联系人 int modifycontact(contacts* pc);//修改联系人信息 int findcontact(contacts* pc);//查找联系人 void sortcontact(contacts* pc);//排序通讯录
contacts.c
#include "contacts.h" int find_out(char* p1, contacts* p2) { assert(p1 != NULL); assert(p2 != NULL); int i = 0; for (i = 0; i < p2->count; i++) { if (!strcmp(p1, p2->data[i].name))//如果相等就返回0,前面加了!操作符,所以非零条件不成立 return i; } return -1; } void initialize(contacts* pc) { assert(pc != NULL); pc->count = 0;//将计数的变量初始化为0 memset(pc->data, 0, sizeof(pc->data));//将数组里面的内容都初始化为0 } void addcontact(contacts* pc) { assert(pc != NULL);//断言pc指向的位置不是空指针 if (pc->count == MAX) { printf("通讯录已满\n"); return 0; } printf("姓名:"); scanf("%s", pc->data[pc->count].name); printf("年龄:"); scanf("%d", &(pc->data[pc->count].age)); printf("性别:"); scanf("%s", pc->data[pc->count].sex); printf("电话号:"); scanf("%s", pc->data[pc->count].phone); printf("家庭住址:"); scanf("%s", pc->data[pc->count].location); pc->count++; printf("增加成功\n"); } void showcontact(const contacts* pc) { assert(pc != NULL); int i = 0; printf("%-20s\t%-20s\t%-20s\t%-20s\t%-20\t\n", "姓名", "年龄", "性别", "电话号", "家庭住址"); for (i = 0; i < pc->count; i++) { printf("%-20s\t%-20d\t%-20s\t%-20s\t%-20\t\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].phone, pc->data[i].location); } } int delcontact(contacts* pc) { assert(pc != NULL); char name[20] = { 0 }; printf("输入此人姓名\n"); scanf("%s", name); int i = find_out(name, pc); if (i == -1) { printf("无此人信息\n"); return 1; } pc->count = pc->count - 1; while (i < pc->count) { pc->data[i] = pc->data[i + 1]; i++; } printf("删除成功\n"); } int modifycontact(contacts* pc) { assert(pc != NULL); printf("输入此人姓名\n"); char name[20] = { 0 }; scanf("%s", name); int i = find_out(name, pc); if (i == -1) { printf("无此人信息\n"); return 1; } printf("请输入要修改的信息\n"); printf("姓名:"); scanf("%s", pc->data[i].name); printf("年龄:"); scanf("%d", &(pc->data[i].age)); printf("性别:"); scanf("%s", pc->data[i].sex); printf("电话号:"); scanf("%s", pc->data[i].phone); printf("家庭住址:"); scanf("%s", pc->data[i].location); printf("修改成功\n"); } int findcontact(contacts* pc) { assert(pc != NULL); printf("输入此人姓名\n"); char name[20] = { 0 }; scanf("%s", name); int i = find_out(name, pc); if (i == -1) { printf("无此人信息\n"); return 1; } printf("%-20s\t%-20s\t%-20s\t%-20s\t%-20\t\n", "姓名", "年龄", "性别", "电话号", "家庭住址"); printf("%-20s\t%-20d\t%-20s\t%-20s\t%-20\t\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].phone, pc->data[i].location); } int estimate(const void* p1, const void* p2) { return strcmp(((person*)p1)->name, ((person*)p2)->name); } void sortcontact(contacts* pc) { assert(pc != NULL); qsort(pc->data, pc->count, sizeof(person), estimate); printf("排序成功\n"); }
test.c
#include "contacts.h" enum list { EXIT, ADD, DEL, MODIFY, FIND, SHOW, SORT }; void catalogue() { printf("*********************************\n"); printf("*** 1.add 2.del ***\n"); printf("*** 3.modify 4.find ***\n"); printf("*** 5.show 6.sort ***\n"); printf("*** 0.exit ***\n"); printf("*********************************\n"); } int main() { int n = 0; contacts con;//通讯录 initialize(&con);//初始换通讯录 do { catalogue();//通讯录菜单 printf("请选择>"); scanf("%d", &n);//选择要做什么 switch (n) { case EXIT://退出程序 printf("退出通讯录\n"); break; case ADD://添加联系人 addcontact(&con); break; case DEL://删除联系人 delcontact(&con); break; case FIND://查找联系人 findcontact(&con); break; case MODIFY://修改联系人信息 modifycontact(&con); break; case SHOW://展示联系人 showcontact(&con); break; case SORT://排序通讯录 sortcontact(&con); break; default: printf("输入错误请重新输入\n"); } } while (n); return 0; }