작동하는 것처럼 보입니다. 그러나 특정 상황이 내 알고리즘 충돌을 일으키는 지 알고 싶습니다. 아무에게도 아이디어가 없습니다. 숨겨진 특별한 경우, 내 프로그램에서 다루지 않을 것인가? 목록을 정렬하는 것이 적절한 방법이 아니라는 것을 알고 있지만 이것이 내가해야 할 일입니다.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