2012-03-20 44 views
-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的情况是多余的。

我一直在试图将开关盒从循环中移出,以便仅检查一次,但我在智慧的结尾。

回答

0
void sortById(struct student *s, int n) 
{ 
    int i, j; 
    for(i=n-1; i>0; i--) 
     for(j=0; j<i; j++) 
      if(s[j].id>s[j+1].id) 
       swapData(&s[i], &s[j+1]); 

} 
void sortByName(struct student *s, int n) 
{ 
    int i, j; 
    for(i=n-1; i>0; i--) 
     for(j=0; j<i; j++) 
      if(strcmp(s[j].name, s[j+1].name)>0) 
       swapData(&s[i], &s[j+1]); 

} 
void sortByAge(struct student *s, int n) 
{ 
    int i, j; 
    for(i=n-1; i>0; i--) 
     for(j=0; j<i; j++) 
      if(s[j].age>s[j+1].age) 
       swapData(&s[i], &s[j+1]); 

} 
void sortByField(struct student *s, int n, int fieldIndex) 
{ 
    switch (fieldIndex) 
    { 
     case 1 : sortById(s, n); break; 
     case 2 : sortByName(s, n); break; 
     case 3 : SortByAge(s, n); break; 
    } 
} 

但是这个开关并不是什么大不了的事。如果是你应该考虑更有效的排序算法第一...

+0

我明白你指出,但分配告诉我使用冒泡排序,因为它是一个基本的C编程课程。 – asinkxcoswt 2012-03-21 02:40:52

+0

谢谢!我忽略了这种方法,因为乍看起来它需要更多的功能,但正如你所指出的那样,这是一种好方法。不过,我只是好奇,是否有办法将它放在一个函数中,例如,使开关产生一些变量来引用结构的每个字段。再次感谢。 – asinkxcoswt 2012-03-21 02:55:15

+0

对不起,但分解是在这个特殊情况下唯一的途径。你可以创建比较函数,比如'int cmpByField(struct student * a,struct student * b,int fieldIndex)'。但是无论如何,你需要**切换**或**如果**。你不能有条件地引用C中的结构域,也不能用分隔的方式。 – 2012-03-21 12:28:30