2012-03-20 6 views
-1

私は 'struct student'の配列を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; 
      } 
     } 
    } 
} 

、Iは、パラメータFieldIndexに

sortByField(s, n, 1); 

に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

+0

そしてありがとう!一見したところ、より多くの機能が必要だったので、私はこの方法を見落としましたが、あなたが指摘したように、それは良い方法です。しかし、私は単なる関数に入れる方法があるかどうか不思議です。たとえば、スイッチに構造体の各フィールドを参照する変数を生成させるなどです。再度、感謝します。 – asinkxcoswt

+0

申し訳ありませんが、この特定のケースでは分解は唯一の方法です。 'int cmpByField(struct student * a、struct student * b、int fieldIndex)'のような比較関数を作成することができます。しかし、** switch **または** if **が必要です。条件付きでCの構造体のフィールドを参照することはできません。 –

関連する問題