2017-04-01 9 views
0

これはうまくいくようですが、特定の状況でアルゴリズムがクラッシュすることがあるかどうかを知りたいと思います。隠された特定のケース、私のプログラムはカバーしないでしょうか? リストをソートするのは適切な方法ではないことは分かっていますが、これは私がしなければならないことです。あなたはサイクルに再び入力する必要があるかどうかをチェックするために(再び)dinNouを使用私はCでリストのバブルソートを行いました。私は特定の間違いをしたかどうかを知りたいです

struct Student { 
    float medie; 
    char nrMatricol[10]; 
    char *nume; 
    char facltate[6]; 


}; 
struct Nod{ 
    Student stud; 
    Nod* next; 
}; 
Nod* inserareNodEnd(Nod *l,Student st) 
{ 
    Nod *nou = (Nod*)malloc(sizeof(Nod)); 
    nou->next = NULL;//NOU->NEXT=0 
    nou->stud = st; 
    if (!l) { 
     //lista este goala 
     return nou; 
    } 
    else 
    { 
    //lista contine un nod 
     Nod *t = l; 
     while (t->next) { 
      t = t->next; 
     } 
     t->next = nou; 
     return l; 
    } 

} 

Nod * interschimbare(Nod *l, Nod *pred) { 
    Nod *aux=l; 
    //Nod *auxPred = pred; 
    //Nod *auxPredNext =pred->next; 
    if (pred) { 
     //caz general 
     Nod *p, *q, *r; 
     pred = pred->next; 
     q = p->next; 
     r = q->next; 
     pred->next = q; 
     p->next = r; 
     q->next = p; 
    } 
    else { 
     //interschimb noduri 1 cu 2 
     Nod *p, *q; 
     p = l->next; 
     q = p->next; 
     l->next = q; 
     l = p; 


    } 
    return l; 
} 
Nod* sortareBubble(Nod* l) { 
char dinNou; // flag interschimb noduri 

if (!l && !l->next) 
    return l; //lista trebuie sa contina cel putin 2 noduri 

do { 
    dinNou = 0; // 0 -> ipoteza fara interschimb 
    Nod *tmp = l, *pred = 0; 
    while (tmp->next) { 
     if (tmp->stud.medie > tmp->next->stud.medie) { 
      l = interschimb(l, pred); 
      dinNou = 1; 
      if (pred) { 
       pred = pred->next; 
      } 
      else { 
       pred = l; 
      } 
     } 
     else { 
      pred = tmp; 
      tmp = tmp->next; 
     } 
    } 

} while (dinNou == 1); 

return l; 

}

+0

コードをテストしましたか?マーク平均でソートしているようです。それは動作しますか? –

+0

それは私の価値観のために働いていましたが、発見されなかった事例があるかどうかを知りたいのです –

+0

代わりに[コードレビュー](http://codereview.stackexchange.com)に投稿することを検討してください。 – pmg

答えて

1

。サイクルはdo - whileであり、dinNouは0で初期化され、変更が発生した場合は1に変更されます。変更がない限り、変更は基本的に行います。あなたは(lに初期化された)tmpは何next要素を持たないために発生した場合、これはfalseになります

while (tmp->next); 

でinifiteループにつながるミスを持っています。それ以外の場合は、next要素があるかどうかを繰り返し尋ねられ、変更がないため、常に真となり、無限ループにつながります。あなたが望んでいたのは、whileの操作を実行するように設定したブロックを使用することです。whiletmpnextです。それを達成するために、単純にセミコロンを削除します。

while (tmp->next) 

あなたがいることを実行した後、ループ内で現在の学生の平均点は、次のよりも大きいかどうかを確認してください。その場合は、interschimbare(スワップ)に電話し、dinNouを1に設定します。これは間違っているようです。隣接する2つの値をスワップする必要がある場合は、interschimbaretmpおよびtmp->nextと呼びます。結果として、pred変数は実際には必要なく、スワップが行われたかどうかにかかわらず、tmpからtmp->nextに設定する必要があります。または、スワップが発生した場合はループを解除できます。

+0

私のコードを編集しました。今はどうですか? –

+0

@ CovrigGeorge-Manuelそれははるかに優れていますが、それでも正しいとは思われません。デバッガを使用してコードをテストする必要があります。コードから見つかるあなたの考えは正しいが、バグがある。 1〜2時間デバッグすれば、すべての問題を修正できるはずです。 –

関連する問題