项目中通信录要实现排序功能->通讯录相当于一个结构体对象->对一个结构体对象的内容进行排序
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h";
void menu()
{
printf("*****************************\n");
printf("****1.add 2.del 3.update*****\n");
printf("****4.find 5.show 6.qsort****\n");
printf("**********0.quit*************\n");
printf("请选择使用的功能>>>");
}
enum function {
QUIT,
ADD,
DEL,
UPDATE,
FIND,
SHOW,
SORT
};
void test()
{
int input=0;
int flag= 0;
Contact con;//通讯录
initContact(&con);
do
{
menu();
scanf("%d",&input);
switch(input)
{
case QUIT:
printf("程序退出成功");
break;
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case UPDATE:
UpdateContact(&con);
break;
case FIND:
FindContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case SORT:
printf("****1.sort_age 2.sort_name****\n");
printf("请选择使用的排序方式>>");
scanf("%d",&flag);
if (flag == 1)
{
Sort_age(&con);
}
else if(flag == 2)
{
Sort_name(&con);
}
else
{
printf("输入错误\n");
}
break;
default:
printf("输出错误请重新输入\n");
break;
}
}while(input);
}
int main()
{
test();
return 0;
}
---------------------------------------------------------------------------------------------------------------------
contact.h
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include<stdlib.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TEL 12
#define MAX_ADDR 30
typedef struct PeoInfo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tel[MAX_TEL];
char addr[MAX_ADDR];
} perInfo;
typedef struct Contact
{
perInfo data[MAX];
int sz;
} Contact;
void initContact(Contact* pc);
void AddContact(Contact* pc);
int FindByName(const Contact* pc,char name[]);
void ShowContact(const Contact* pc);
void DelContact(Contact* pc);
void UpdateContact(Contact* con);
void FindContact(const Contact* con);
void Sort_age( Contact* pc);
void Sort_name(Contact* pc);
--------------------------------------------------------------------------------------------------------------------
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void initContact(Contact* pc)
{
memset(pc->data, 0, sizeof(pc->data));
pc->sz = 0;
};
void AddContact(Contact * pc)
{
assert(pc);
if (100== pc->sz)
{
printf("通讯录已满, 无法添加\n");
}
printf("请入姓名>");
scanf("%s", pc->data[pc->sz].name);
printf("请入年龄>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请入性别>");
scanf("%s", pc->data[pc->sz].sex);
printf("请入电话号码>");
scanf("%s", pc->data[pc->sz].tel);
printf("请输入家庭住址>");
scanf("%s",pc->data[pc->sz].addr);
pc->sz++;
printf("个人信息添加成功\n");
};
int FindByName(const Contact* pc, char name[])
{
int i = 0;
for (i=0;i<pc->sz;i++)
{
if (strcmp(pc->data[i].name,name)== 0)
{
return i;
}
}
return -1;//找不到
}
void ShowContact(const Contact* pc)
{
int i = 0;
//打印列标题
printf("%-20s\t%-4s\t%5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
//打印数据
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-4d\t%5s\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tel,
pc->data[i].addr);
}
return;
}
void DelContact(Contact* pc)
{
if (pc->sz==0)
{
printf("通讯录为空,无法删除\n");
return;
}
assert(pc);
int i = 0;
int del = 0;
printf("请输入删除人的名字>");
char del_name[MAX_NAME] = {0};
scanf("%s", del_name);
del = FindByName(pc,del_name);
if (del==-1)
{
printf("要删除的人不存在\n");
return;
}
//删除个人信息
for (i = del; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("成功删除联系人\n");
}
void UpdateContact(Contact* pc)
{
int i = 0;
int upd = 0;
printf("请输入通讯录中联系人姓名>");
char upd_name[MAX_NAME] = { 0 };
scanf("%s", upd_name);
upd = FindByName(pc,upd_name);
if (upd == -1)
{
printf("未找到要修改的联系人信息\n");
return;
}
//修改个人信息
printf("请入要修改的姓名>");
scanf("%s", pc->data[upd].name);
printf("请入要修改的年龄>");
scanf("%d", &(pc->data[upd].age));
printf("请入要修改性别>");
scanf("%s", pc->data[upd].sex);
printf("请入要修改电话号码>");
scanf("%s", pc->data[upd].tel);
printf("请输入要修改家庭住址>");
scanf("%s", pc->data[upd].addr);
printf("个人信息修改成功\n");
}
void FindContact(const Contact* pc)
{
int i = 0;
printf("请输入要查找的联系人的姓名>");
char find_name[MAX_NAME] = { 0 };
scanf("%s", find_name);
i = FindByName(pc, find_name);
if ( i== -1)
{
printf("查找失败\n");
}
else
{
printf("查找成功\n");
printf("%-20s\t%-4s\t%5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
printf("%-20s\t%-4d\t%5s\t%-12s\t%-30s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tel,
pc->data[i].addr);
}
}
int compare_age(const void* p1, const void* p2)
{
return ((struct PeoInfo *)p1)->age - ((struct PeoInfo *)p2)->age;
}
int compare_name(const void* p1, const void* p2)
{
return strcmp(((struct PeoInfo*)p1)->name,((struct PeoInfo*)p2)->name);
}
void Sort_age(Contact* pc)
{
//排序,按照什么排序? 年龄
qsort(pc->data, pc->sz, sizeof(pc->data[0]), compare_age);
ShowContact(pc);
}
void Sort_name(Contact* pc)
{
//排序,按照什么排序? 名字
qsort(pc->data,pc->sz,sizeof(pc->data[0]),compare_name);
ShowContact(pc);
}
------------------------------------------------------------------
名字排序结果
——--————————————————————————————————————————
年龄排序结果