これはうまくいくようですが、特定の状況でアルゴリズムがクラッシュすることがあるかどうかを知りたいと思います。隠された特定のケース、私のプログラムはカバーしないでしょうか? リストをソートするのは適切な方法ではないことは分かっていますが、これは私がしなければならないことです。あなたはサイクルに再び入力する必要があるかどうかをチェックするために(再び)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;
}
コードをテストしましたか?マーク平均でソートしているようです。それは動作しますか? –
それは私の価値観のために働いていましたが、発見されなかった事例があるかどうかを知りたいのです –
代わりに[コードレビュー](http://codereview.stackexchange.com)に投稿することを検討してください。 – pmg