2012-04-26 11 views
2

通常のインデックス表記を使用するのではなく、ポインタ算術を使用して選択ソートを実行する際に問題があります。私がこれをしなければならない理由は、クラス割り当てのためです。全体のポイントは、 "cheater indexing"(pointer + i)なしでポインタ演算を使用することを学ぶことです。iはそのようなインデックスになります:array[i]配列要素を指す選択ソート

私のソート関数を呼び出す前に、1000個の構造体の配列を割り当てます。 typedefは次のようになります。

typedef struct 
{ 
    char* name; 
    char* art; 
    int rating; 
} ENTRY; 

私はASCIIアートを含むファイルを読んでいます。それぞれの芸術作品は、それぞれ独自の構造に投げ込まれます。テキストファイルの1つの「エントリ」は次のとおりです。

Jean Pajerek 
    |\_____/| 
    |[o] [o]| 
    | V | 
    |  | 
-ooo---ooo- 
# 4 

これはフクロウです!しかし、私がしなければならないことは、構造体の適切なフィールドに名前、芸術、格付けを格納することです。私の読み込み機能は完璧に機能します。私は1000の構造体の配列を割り当て、テキストファイルを読み込みます。それは18イメージのようにしか含まれていないので、そこに心配はありません。

ここで私の選択ソート機能について説明しましょう。インデックス表記を使用してintの配列の選択ソートアルゴリズムを調べることから始めました。次に、それを自分の要件に適合させようとしました。

void sort(ENTRY* aryptr, int* counter) 
{ 
    ENTRY* slow; 
    ENTRY* fast; 
    ENTRY* lastmin; 
    ENTRY min; 
    ENTRY temp; 
    int i; 
    int j; 

    printf("\n\n...SORTING\n\n\n"); 

    slow = aryptr; 

    for (i=0; i < *counter - 2; i++) 
    { 
     min = *slow;   

     fast = slow + 1; 
     for (j = i + 1; j < *counter-1; j++) 
     { 
      if (strcmp(fast->name, min.name) < 0) 
      { 
       min = *fast; 
       lastmin = fast; 
      } 
      fast++;   
     } 

     temp = *slow; 
     *slow = min; 
     *lastmin = temp; 

    slow++;  

    } 
} 

私はそのテストを感じたので、私はカウンタとしてijを使用しています:構造体の代わりに、int型だからここ

動き回る

  1. 利用ポインタ演算
  2. コードですwalker->name != NULLのようなものは安全ではありませんでした。 (とにかく私はNULLテストを使うべきですか?最後の要素の後に事実を保証することができれば、それはもっと論理的に満足しているようです。実際にはNULL ...)私が何を追跡するのにかかわらず遅くて速いポインタのための私の場所、私は並べ替えに問題があります。

    この問題は次のようなものです。このart.txtファイルには、さまざまな種類のアートがあります。同じ芸術家の作品もあります。

    VOLDEMORT 
    (art is hippogryph) 
    # 1 
    EDDARD STARK 
    (art is turtle) 
    # 4 
    EDDARD STARK 
    (art is owl) 
    # 3 
    TONY STARK 
    (art is blob) 
    #1 
    EDDARD STARK 
    (art is dragon) 
    #5 
    

    並べ替えが完了すると、同じ作者のアート作品が配列内で隣り合って表示されます。私は同じ人が芸術の秩序を気にしない。私のコードでそれをソートすると仮定します:私はこのようなものを取得します。

    EDDARD STARK 
    (art is turtle) 
    # 4 
    EDDARD STARK 
    (art is owl) 
    # 3  
    EDDARD STARK 
    (art is dragon) 
    #5 
    EDDARD STARK 
    (art is turtle) 
    # 4 
    TONY STARK 
    (art is blob) 
    #1 
    VOLDEMORT 
    (art is hippogryph) 
    # 1 
    

    EDDARD STARKによって芸術のソートされたブロックは、最後にそのブロック内ART OF FIRST PIECEのコピーを持っています。私は自分のロジックを見て、デバッグするためにさまざまなことを印刷しましたが、問題がどこにあるかまだ分かりません。あまりにも長い間自分の気になるコードを見たので、私はそれを見ることができないだろうと思う。何か案は?

+1

私はフクロウが好きです。 – st0le

答えて

1
void sort(ENTRY* aryptr, int* counter) 
{ 
    ENTRY* slow; 
    ENTRY* fast; 
    ENTRY* lastmin; 
    ENTRY min; 
    ENTRY temp; 
    int i; 
    int j; 

    printf("\n\n...SORTING\n\n\n"); 

    slow = aryptr; 

    for (i=0; i < *counter - 2; i++) 
    { 
     min = *slow;   

     fast = slow + 1; 
     for (j = i + 1; j < *counter-1; j++) 
     { 
      if (strcmp(fast->name, min.name) < 0)//comparison 
      { 
       min = *fast;//save data to min 
       lastmin = fast;//save position to last min 
      } 
      fast++;//increment index 
     } 

     //problematic, always swapping. need if statement. Lastmin 
     //May go unassigned, then "slow" will be duplicated to "lastmin" 
     temp = *slow; 
     *slow = min; 
     *lastmin = temp;//at first run through 

    slow++;  //increment index 

    } 
} 
+0

私は必要な状態を理解するのにしばらく時間がかかりましたが、今必要に応じて動作させるようにしました!私は盲目的に何かを見たことがないと信じられない。 ありがとう! – GrinReaper