-1
排序结构的阵列我有在c'结构学生的阵列。冗余在由特定字段
struct student
{
int id;
char *name;
int age;
}
int n = 100; //number of students
struct student s[n] = ...
我有sortByField函数(冒泡排序)到阵列中特定字段的顺序进行排序。
void sortByField(struct student *s, int n, int fieldIndex)
{
int i, j;
for(i=n-1; i>0; i--)
{
for(j=0; j<i; j++)
{
switch (fieldIndex)
{
case 1 : if(s[j].id>s[j+1].id) swapData(&s[i], &s[j+1]); break;
case 2 : if(strcmp(s[j].name, s[j+1].name)>0) swapData(&s[i], &s[j+1]); break;
case 3 : if(s[j].age>s[j+1].age) swapData(&s[i], &s[j+1]); break;
}
}
}
}
例如,如果我通过1到参数字段索引
sortByField(s, n, 1);
它将由ID的数组进行排序。或者,如果我通过2,它将按名称排序。等等。
就像你看到的一样。我在气泡排序循环中使用了switch-case来确定哪个字段是要比较或排序的。 但我不喜欢这个,我认为在循环中一次又一次检查fieldIndex的情况是多余的。
我一直在试图将开关盒从循环中移出,以便仅检查一次,但我在智慧的结尾。
我明白你指出,但分配告诉我使用冒泡排序,因为它是一个基本的C编程课程。 – asinkxcoswt 2012-03-21 02:40:52
谢谢!我忽略了这种方法,因为乍看起来它需要更多的功能,但正如你所指出的那样,这是一种好方法。不过,我只是好奇,是否有办法将它放在一个函数中,例如,使开关产生一些变量来引用结构的每个字段。再次感谢。 – asinkxcoswt 2012-03-21 02:55:15
对不起,但分解是在这个特殊情况下唯一的途径。你可以创建比较函数,比如'int cmpByField(struct student * a,struct student * b,int fieldIndex)'。但是无论如何,你需要**切换**或**如果**。你不能有条件地引用C中的结构域,也不能用分隔的方式。 – 2012-03-21 12:28:30