qsort 三级排序问题
zoj 2727(水题)
这道题真的困扰我很长时间,算法确实很简单,就是代码格式上出错,自己的编译器都过了,OJ上很坑人啊,各种编译错误,后来各种网搜,查找,至今不知为何这样做,但是还是拿出来供大家参考
出错部分:
typedef struct Book
{
char name[100];
int y;
int p;
}book;
原来是这样写的:
struct book
{
char name[100];
int y;
int p;
};
还有一处是
在定义cmp函数时,是对结构体进行三级排序
int cmp(const void*a,const void* b)
{
..................//省略
return (book *)a->p-(book *)b->p;//不知为何不行,只能这样写:return (*(book *)a).p-((*book *)b).p;
}
附上AC 的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Book
{
char name[100];
int y;
int p;
}book;
book bk[101];
int cmp1(const void *a,const void *b)
{
if(strcmp((*(book *)a).name,(*(book *)b).name)!=0)
return strcmp((*(book *)a).name,(*(book *)b).name);
else
{
if((*(book *)a).y!=(*(book *)b).y)
return (*(book *)a).y-(*(book *)b).y;
else
return (*(book *)a).p-(*(book *)b).p;
}
}
int cmp2(const void *a,const void *b)
{
if((*(book *)a).y!=(*(book *)b).y)
return (*(book *)a).y-(*(book *)b).y;
else
{
if((*(book *)a).p!=(*(book *)b).p)
return (*(book *)a).p-(*(book *)b).p;
else
return strcmp((*(book *)a).name,(*(book *)b).name);
}
}
int cmp3(const void *a,const void *b)
{
if((*(book *)a).p!=(*(book *)b).p)
return (*(book *)a).p-(*(book *)b).p;
else
{
if(strcmp((*(book *)a).name,(*(book *)b).name)!=0)
return strcmp((*(book *)a).name,(*(book *)b).name)!=0;
else
return (*(book *)a).y-(*(book *)b).y;
}
}
int main()
{
int n,i,f=1;
char kind[10];
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(i=0;i<n;i++)
scanf("%s%d%d",bk[i].name,&bk[i].y,&bk[i].p);
scanf("%s",kind);
if(strcmp(kind,"Year")==0)
qsort(bk,n,sizeof(bk[0]),cmp2);
if(strcmp(kind,"Price")==0)
qsort(bk,n,sizeof(bk[0]),cmp3);
if(strcmp(kind,"Name")==0)
qsort(bk,n,sizeof(bk[0]),cmp1);
if(f!=1)printf("\n");
f++;
for(i=0;i<n;i++)
printf("%s %d %d\n",bk[i].name,bk[i].y,bk[i].p);
}
return 0;
}
另外注意看清楚题,zoj2727 的输出格式也是一个陷阱,控制输出空行也是一个技巧,类似问题下次千万千万不要犯了