对部门进行排序
2023-12-13 12:51:06
题目描述 :
给定一组部门信息存在departsMents , departsMents[i] 表示 cityName 部门所在城市,departName 部门名称, personNum部门人数
- 先从每个城市选取人数最多的5个部门作为分析对象,当人数相等时优先选取departName 字典序最小的; 不足5个按实际选;
- 然后对选取的结果,按照 cityName departName 逐行输出 首先按cityName 字典升序,同一个·城市,按departName字典升序输出;
解题思路:
定义结构体
部门结构体: 部门名字 部门人数
城市结构包含: 城市名字 部门结构体 部门数目;
step1: 创建临时结构体数组存放选出的城市和部门信息
step2: 对上面结构体 对部门信息按人数 部门名称排;
step3: 申请返回空间 放进去选好的输出形式数据;
step4: 对输出结果先排城市名 再排部门名
#define MAX_LEN 10
#define MAX_NUM 100
typedef struct {
char departName[MAX_LEN];
int personNum;
}DepartInfo;
typedef struct {
char cityName[MAX_LEN];
DepartInfo departInfo[MAX_NUM];
int departNum;
}CityInfo;
typedef struct {
char* departName;
char* cityName;
int personNum;
}DepartMnent;
typedef struct {
char* departName;
char* cityName;
}DepartOut;
// 对部门人数和部门名称排序
int cmp1(const void* a, const void* b)
{
DepartOut* pa = (DepartOut*)a;
DepartOut* pb = (DepartOut*)b;
if (strcmp(pa->cityName, pb->cityName) == 0) {
return strcmp(pa->departName, pb->departName);
}
return strcmp(pa->cityName, pb->cityName);
}
int cmp2(const void* a, const void* b)
{
DepartInfo* pa = (DepartInfo*)a;
DepartInfo* pb = (DepartInfo*)b;
if (pa->personNum == pb->personNum) {
return strcmp(pa->departName, pb->departName);
}
return pb->personNum - pa->personNum;
}
DepartOut* filter(DepartMnent* departsMents, size_t departsMentsSize, DepartOut* outPut)
{
CityInfo info2[MAX_NUM];
for (int i = 0; i < departsMentsSize; i++) {
info2[i].departNum = 0;
for (int j = 0; j < MAX_NUM; j++) {
info2[i].departInfo[j].personNum = 0;
}
}
int cityNum = 0;
int flag; // 城市标记
for (int i = 0; i < departsMentsSize; i++) {
flag = 0;
// 遍历城市
for (int j = 0; j < cityNum; j++) {
if (strcmp(departsMents[i].cityName, info2[j].cityName) == 0) {
// 1. 添加已经存在城市的部门信息
strcpy_s(info2[j].departInfo[info2[j].departNum].departName, MAX_LEN, departsMents[i].departName);
info2[j].departInfo[info2[j].departNum].personNum = departsMents[i].personNum;
info2[j].departNum += 1;
flag = 1;
break;
}
}
// 2. 添加新城市
if (flag == 0) {
strcpy_s(info2[cityNum].cityName, MAX_LEN, departsMents[i].cityName);
// 添加部门
strcpy_s(info2[cityNum].departInfo[info2[cityNum].departNum].departName, MAX_LEN, departsMents[i].departName);
// 部门人数++
info2[cityNum].departInfo[info2[cityNum].departNum].personNum += 1;
// 部门数++;
info2[cityNum].departNum += 1;
cityNum++;
}
}
// 对部门信息按人数排 部门名称排
for (int i = 0; i < cityNum; i++) {
qsort(info2[i].departInfo, info2[i].departNum, sizeof(DepartInfo), cmp1);
if (info2[i].departNum > 5) {
info2[i].departNum = 5;
}
}
// 将排好序的填进申请空间
// 返回的形式是城市 和 部门 外层申请大的 内层分别申请城市名字和 部门名字
DepartOut* departOut = (DepartOut*)malloc(sizeof(DepartOut) * cityNum);
for (int i = 0; i < cityNum; i++) {
// 每个城市对应几个部门 再申请部门的空间
for (int j = 0; j < info2[i].departNum; j++) {
departOut[i].cityName = (char*)malloc(sizeof(char) * MAX_LEN);
departOut[i].departName = (char*)malloc(sizeof(char) * MAX_LEN);
strcpy_s(departOut[i].cityName, MAX_LEN, info2[i].cityName);
strcpy_s(departOut[i].departName, MAX_LEN, info2[i].departInfo[j].departName);
}
}
// 第二个排序 先排城市名 再排部门
qsort(departOut, cityNum, sizeof(DepartOut), cmp2);
return departOut;
}
文章来源:https://blog.csdn.net/lsljiayou/article/details/134917969
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!