我们创建三个区域
介绍一下qsort函数:
contact.h
#pragma once //类型的声明 //人的信息 #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX 100 #define MAX_NAME 10 #define MAX_SEX 10 #define MAX_ADDR 20 typedef struct PeoInfo { char name[MAX_NAME]; int age; char sex[MAX_SEX]; char addr[MAX_ADDR]; }PeoInfo; //分装一个通讯录 typedef struct Contact { PeoInfo data[MAX];//存放人的信息 int count ;//count记录当前通讯录中人的个数 }Contact; void InitContact(Contact* pc);//初始化通讯录,参数就是结构体指针 void AddContact(Contact* pc); void ShowContact(const Contact* pc); void DelContact(Contact* pc);//删除指定联系人 void SearchContact(Contact* pc);//查找指定联系人 void ModifyContact(Contact* pc); void SortContact(Contact* pc);//排序通讯录中的内容
test.c
# define _CRT_SECURE_NO_WARNINGS #include"contact.h" #include<stdio.h> #include "contact.h" void menu() { printf("***********************************\n"); printf("****1.add 2.delete ************\n"); printf("****3.search 4.modify **********\n"); printf("****5show 6.sort ************\n"); printf("********0.exit ************\n"); } int main() { int input = 0; Contact con;//通讯录 InitContact(&con);//结构体传参,尽量传地址,这样效率更高,如果还要改变con,一定要把地址传入才可以 //尽量分 装函数,分模块来完成,并且有的时候用大括号初始化不方便 do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: AddContact(&con);//增加联系人的信息也要修改通讯录的内容 break; case 2: DelContact(&con); break; case 3: SearchContact(&con); break; case 4: ModifyContact(&con); break; case 5: ShowContact(&con); break; case 6: SortContact(&con); break; case 0: printf("退出通讯录\n"); break; default: printf("选择错误\n"); break; } } while (1); return 0; }
contact.c
# define _CRT_SECURE_NO_WARNINGS #include"contact.h" #include<assert.h> void InitContact(Contact* pc) { assert(pc); pc->count = 0;//通讯录创建好一个信息都不能有 memset(pc->data, 0, sizeof(pc->data));//如果不用memset,还得用循环 } void AddContact(Contact* pc) { assert(pc); if (pc->count == MAX) { printf("通讯录已经满了,不能增加\n"); } printf("请输入名字"); scanf("%s", pc->data[pc->count].name);//name是个数组,不用取地址 printf("请输入年龄\n"); scanf("%s",&( pc->data[pc->count].age));//age是个整型变量,需要进行取地址 printf("请输入性别\n"); scanf("%s", pc->data[pc->count].sex); printf("请输入地址\n"); scanf("%s", pc->data[pc->count].addr); pc->count++; printf("增加成功\n"); } void ShowContact(Contact* pc) { assert(pc); int i = 0; printf("%20s\t%3d\t%12s\t%30s\n","名字","年龄","性别","地址"); for (i = 0; i < pc->count; i++) { printf("%20s\t%3d\t%12s\t%30s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr); } } static int FindByName(Contact* pc, char name)//加上static只能在.c文件内部看到 { assert(pc); int i = 0; for (i = 0; i < pc->count; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } return -1; } void DelContact(Contact* pc) { char name[MAX_NAME] = { 0 }; assert(pc); if (pc->count == 0) { printf("通讯录为空,没有元素可以删除\n"); } printf("请输入要删除人的名字\n"); scanf("%s", name); //先查找,后删除,所以我们分装一个查找函数 int pos = FindByName(pc, name);//在pc指向的通讯录里寻找name if (pos == -1)//删除只需要将后面的元素往前覆盖 { printf("要删除的联系人不存在\n"); return; } for (int i = pos; i < pc->count-1; i++)//如果是count,会越界 { pc->data[i] = pc->data[i + 1]; } pc->count--;//count变成99,最后一个元素也访问不到 printf("删除成功\n"); } void SearchContact(Contact* pc) { char name[MAX_NAME] = { 0 }; printf("请输入要查找人的名字\n"); scanf("%s", name); int pos = FindByName(pc, name);//在pc指向的通讯录里寻找name if (pos == -1)//删除只需要将后面的元素往前覆盖 { printf("要删除的联系人不存在\n"); return; } else printf("%20s\t%3d\t%12s\t%30s\n", "名字", "年龄", "性别", "地址"); for (int i = 0; i < pc->count; i++) { printf("%20s\t%3d\t%12s\t%30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].addr); } } void ModifyContact(Contact* pc) { char name[MAX_NAME] = { 0 }; printf("请输入要修改人的名字\n"); scanf("%s", name); int pos = FindByName(pc, name);//在pc指向的通讯录里寻找name if (pos == -1) { printf("要修改的联系人不存在\n"); return; } //重新录入一遍 printf("要修改的人的信息已经查找到,现在开始修改\n"); printf("请输入名字"); scanf("%s", pc->data[pos].name);//name是个数组,不用取地址 printf("请输入年龄\n"); scanf("%s", &(pc->data[pos].age));//age是个整型变量,需要进行取地址 printf("请输入性别\n"); scanf("%s", pc->data[pos].sex); printf("请输入地址\n"); scanf("%s", pc->data[pos].addr); printf("修改成功\n"); } int cmp_peo_by_name(const void* e1, const void* e2)//e1和e2就是要比较的两个元素 { return (((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name); } void SortContact(Contact* pc)//按照名字来排序 { assert(pc); qsort(pc->data, pc->count, sizeof(PeoInfo), cmp_peo_by_name); printf("排序成功\n"); }
运行一下,看看是否能够正常运行: