2017-04-01 5 views
0

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

당신은 당신이주기에 다시 입력 할 필요가 있는지 여부를 확인하기 위해 dinNou (다시)를 사용합니다. 주기는 do - while이고 dinNou은 0으로 초기화되고 변경이 발생하면 1로 수정됩니다. 기본적으로 변경 사항이 없을 때까지 변경합니다. 당신은 (l으로 초기화) tmpnext 요소가없는 것을 일어나는 경우는 false가됩니다

while (tmp->next); 

에서 inifite 루프로 이어지는 실수 있습니다. 그렇지 않은 경우에는 next 요소가 있는지 반복적으로 묻고 변경이 없으므로 항상 true가되어 무한 루프가 발생합니다. 당신이 내 의견으로는 무엇을하고자 했는가? while 작업을 수행하도록 설정된 블록을 whiletmpnext이되도록 사용하는 것입니다. 그것을 달성하기 위해, 단순히 세미콜론을 제거 :

while (tmp->next) 

당신은 루프 내에서 현재 학생의 평균 표시가 다음보다 큰 여부를 확인, 그렇게되면

. 그렇다면 interschimbare (스왑)으로 전화하고 dinNou을 1로 설정하십시오. 이것은 또한 잘못된 것 같습니다. 인접한 두 값을 교환해야한다면 interschimbaretmptmp->next이어야합니다. 결과적으로 pred 변수가 실제로 필요하지 않으므로 스왑이 완료되었는지 여부에 관계없이 tmptmp->next으로 설정해야합니다. 또는 스왑이 발생하면 루프를 해제 할 수 있습니다.

+0

내 코드를 편집했습니다. 지금 더 좋습니까? –

+0

@ CovrigGeorge-Manuel 훨씬 좋지만 여전히 정확하지는 않습니다. 디버거를 사용하고 코드를 테스트해야합니다. 코드에서 찾을 수있는 생각은 맞지만 버그가 있습니다. 한두 시간 동안 디버깅하면 모든 문제를 해결할 수 있습니다. –