2017-05-13 11 views
1

私はプロジェクトをしようとしています...プロジェクトは連絡先を持つCSVファイルから読み込む必要があります。 連絡先には、連絡先タイプの構造体の配列に読み込むいくつかのフィールドがあります。 例:異なるメンバーによる構造ソート

void string_InsertionSort(contact *array, int size, char *sortField){ 
    waitForKey(); 
    int i,j; 
    contact key; 
    if (strcmp(sortField, "First name") == 0){ 

     for (i = 1; i < size; i++){ 
      key=array[i]; 
      j = i-1;     
      while ((j >= 0) && strcmp(array[j].contactFirstName, array[j].contactFirstName) > 0){ 

        array[j + 1] = array[j]; 
        j--;  
       } 
       array[j + 1] = key; 
      } 

    }else if (strcmp(sortField, "Last name") == 0){ 

     for (i = 1; i < size; i++){ 
      key=array[i]; 
      j= i-1; 
      while ((j >= 0) && strcmp(array[j].contactLastName, array[j].contactLastName) > 0){ 
       array[j + 1] = array[j]; 
       j--; 
      } 
      array[j + 1] = key; 
     } 

    }else{ 

     printf(" debuggggg"); 
    } 
} 

私はいくつかのdiferent機能で連絡先を並べ替えるために、いくつかの並べ替えalgoritmsを実装しています:array.contactFirstName、配列contactLastNameなど ここでは、コードの一部です。

問題は、string_InsertionSort関数で、配列の配列、配列のサイズ、および並べ替えるフィールドを渡すことです。関数の中で、ソートフィールドを私が持っているフィールドと比較し、正しい場合はソートを行います。

問題は15個のフィールドがあるため、すべてのコードを別のフィールドに繰り返す必要があることです。別の方法がありますか?もしそうなら、誰でも、私に例を挙げてもらえますか? (外部から構造体メンバにアクセスする種類)

+1

aswerはおそらく:関数のポインタを使って、compare関数を引数として汎用ソート関数に渡します。 – wildplasser

答えて

0

これは、通常、qsortのように、比較を行うために関数ポインタを渡すことによって解決されます。

void 
qsort(void *base, size_t nel, size_t width, 
    int (*compar)(const void *, const void *)); 

int (*compar)(const void *, const void *)手段は、二つの空隙のポインタを受け取り、整数を返す関数ポインタを渡します。これにより、好きなようにソートできる汎用ソート関数が可能になりますが、比較を書く必要があります。あなたのコードで

、名前でソートする機能は次のようになります:qsort関数に渡さその後

int cmp_contact_names(const void *_a, const void *_b) { 
    // Copy the void pointers to their correct types. 
    // Easier to work with than casting multiple times. 
    const contact *a = _a; 
    const contact *b = _b; 

    // Sort by last name, then by first name. 
    return strcmp(a->contactLastName, b->contactLastName) || 
      strcmp(a->contactFirstName, b->contactFirstName); 
} 

を。ソートするリスト、リスト内の要素の数、各要素のサイズ、ソートに使用する比較関数

qsort(contacts, num_contacts, sizeof(contact*), cmp_contact_names); 

あなたの挿入の仕方をこの後にソートするか、より良い方法はqsort_rの後です。

これが練習でない限り、独自の挿入ソートを作成する際には、ライブラリから既存の挿入ソートを使用する必要はありません。または、より良い並べ替えを使用して、insertion sortは非常に効率的ではありません。いずれにせよ、手書きの書類は、おそらく良い図書館のものを打つことはないでしょう。

関連する問題