2016-06-29 8 views
0

リストの要素をソートするコードが機能しない理由を理解できず、リストの最初の5要素をソートしてから停止します。私はそれが愚かな問題かもしれないことを知っているが、私はループを多くの時間をチェックし、リストの終わりの前に出口に達する理由を理解できない。C:リストソートコードが機能しない

typedef enum { NOTORD=0, TIME=1, POSITION=2 } ord_t; 


typedef struct elem { 
    double position; 
    double time; 
    flag_t flag; 
    struct elem * next; 
} elem_t; 

typedef struct { 
    elem_t * head; 
    int nelem; 
    ord_t ord; 
} lista_t; 


void set_ordinata_time (lista_t * l) 
{ 
if (l->ord!=TIME) { 
    elem_t * aux, *corr, *succ; 
    int scambio; 
    corr=l->head; 
    succ=l->head->next; 
    aux=malloc(sizeof(elem_t)); 
    scambio=1; 
    while(scambio==1) 
    { 
     corr=l->head; 
     succ=l->head->next; 
     scambio=0; 
     while(succ != NULL) 
     { 
      if (corr->time > succ->time) 
      { 
       aux=corr; 
       aux->next=succ->next; 
       corr=succ; 
       succ=aux; 
       corr->next=succ; 
       scambio=1; 
      } 
      corr=succ; succ=succ->next; 
     } 
    } 
    l->ord=TIME; 
} 

} 
+0

現在の形では、これは「なぜこのコードが動作しないのですか」という質問です。これは、offtopicとして閉じられるべきです。デバッガでコードを実行して、なぜ停止するのか確認しましたか? – fvu

答えて

0

corrl->headである、あなたがsuccl->headをリセットする必要がある場合は、スワップされています。そうでない場合は、次回のループで、ソートはl->headが最初のパスの後で終了するところから開始します。

また、あなたはリストの一部を失う(および漏れる)でしょう。

EDIT:それはcorrの前の要素に一般的に適用されるコメント

からのより多くの(それがスワップする際succにリセットする必要があります)

+0

申し訳ありませんが理解できません。 Corrは内側ループの先頭でl-> headであり、次にリストの次の要素に変化します。その後、毎回corr = l-> headをリセットします(scambio == 1 )ループ。私は何が欠けていますか? –

+0

私はあなたが言っていることを理解し、 "if(corr == l-> head)l-> head = succ;"内側のループの始めには何も変わりません。 –

+0

これ以上です - corrとsuccを交換すると、corrを指すのに使用された要素は、次にsuccに設定する必要があります。私はl-> headの場合を指摘しましたが、これは一般にcorrの前の要素に適用されます(スワップ時にsuccにリセットする必要があります) –

0

elem_tのインスタンスを割り当てる必要はありません。要素を入れ替えるとき、要素の1つがリストの最初の要素である場合、または要素が隣接要素である場合に問題があります。要素へのポインタへのポインタを使用すると、if文の数を減らすことができます。ポインタへのポインタは、ヘッドのアドレスまたはノードの次のポインタのアドレスとすることができる。

スワップを実装するには、まず2つのノード(ヘッドまたはノードの次のポインタ)にスワップし、次に2つのノードをスワップします。これは隣接ノード対隣接ノードの世話をするでしょう。

関連する問題