proste sortowanie przez wybieranie

0

witam, mam problem przy prostym sortowaniu przez wybieranie, aż wstyd.

template <class T>
element<T>* Lista<T>::find_min(element<T>*poczatek){
    element<T> *pom=poczatek;
    element<T> *min=pom;
    min->wart=pom->wart;
    pom=pom->next;

    while (pom){
        if (pom->wart<min->wart)
            min=pom;
        pom=pom->next;

    }
    return min;

}

template <class T>
void Lista<T>::swap(element<T> *a,element<T> *b){
    element <T>* temp = new element <T>;
    cout<<"test 2: "<<a->wart;
    temp->wart=a->wart;
    a->wart=b->wart;
    b->wart=temp->wart;
}

template <class T>
Lista<T> Lista<T>::sortuj(){
    element<T> *pom=this->head;
    cout<<"test: "<<pom->wart;
    while (pom->next){
        swap(pom,find_min(pom));

        pom=pom->next;
    }
    return *this;

}

problem polega na tym: powiedzmy ze input to lista 2,1. powinno posortowac i wypisac 1,2. wypisuje 1,0. problem jest w przekazaniu parametru pierwszego do funkcji find_min. output z programu jest dokladnie taki:
test : 2
test : 0
1, 0

widac wiec ze przy przekazaniu parametru pom do funkcji find_min on jakims cudem sie zmienia z 2 na 0... z góry dziękuję za pomoc

1
  1. Nie używaj innego niż angielskie nazewnictwa: http://4programmers.net/Forum/1208091
  2. cout<<"test: "<<pom->wart; dodać if(pom) ...
  3. element <T>* temp = new element <T>; po kiego tu coś przydzielasz i robisz wyciek pamięci? Poza tym musisz wymienić wartości więc T temp=a->wart; a->wart=b->wart; b->wart=temp; lub zwyczajnie std::swap(a->wart,b->wart);
  4. Po kiego to: min->wart=pom->wart; przecież wiersz wyżej masz: min=pom;
  5. Przed wihile nie rób pom=pom->next; ponieważ jeżeli lista jest pusta już sięgasz pod nullptr. Zwyczajnie wywal ten wiersz.
  6. Nie potrzebujesz tego pom w find_min spokojnie możesz użyć poczatek
  7. Funkcja sortuj sortuje samą siebie po czym robi kopię samej siebie przy return? WTF?
  8. Stawiaj znaki *,& przy deklaracji kolo zmiennej a nie koło typu, ponieważ: int* a,b; oznacza że a - to wskaźnik zaś b to zwykły int, zapis int *a,b; wizualnie odróżnia a od b
  9. Czyli:
template<class T> element<T> *Lista<T>::find_min(element<T> *curr)
  {
   element<T> *min=curr;
   for(;curr;curr=curr->next) if(curr->wart<min->wart) min=curr;
   return min;
  }

template<class T> Lista<T> &Lista<T>::sortuj() 
  {
   for(element<T> *curr=head;curr;curr=curr->next) std::swap(curr->wart,find_min(curr)->wart);
   return *this;
  }
0
_13th_Dragon napisał(a):

Nie używaj innego niż angielskie nazewnictwa: http://4programmers.net/Forum/1208091

  1. cout<<"test: "<<pom->wart; dodać if(pom) ...
  2. element <T>* temp = new element <T>; po kiego tu coś przydzielasz i robisz wyciek pamięci? Poza tym musisz wymienić wartości więc T temp=a->wart; a->wart=b->wart; b->wart=temp; lub zwyczajnie std::swap(a->wart,b->wart);
  3. Po kiego to: min->wart=pom->wart; przecież wiersz wyżej masz: min=pom;
  4. Przed wihile nie rób pom=pom->next; ponieważ jeżeli lista jest pusta już sięgasz pod nullptr. Zwyczajnie wywal ten wiersz.
  5. Nie potrzebujesz tego pom w find_min spokojnie możesz użyć poczatek
  6. Funkcja sortuj sortuje samą siebie po czym robi kopię samej siebie przy return? WTF?
  7. Stawiaj znaki *,& przy deklaracji kolo zmiennej a nie koło typu, ponieważ: int* a,b; oznacza że a - to wskaźnik zaś b to zwykły int, zapis int *a,b; wizualnie odróżnia a od b
  8. Czyli:
template<class T> element<T> *Lista<T>::find_min(element<T> *curr)
  {
   element<T> *min=curr;
   for(;curr;curr=curr->next) if(curr->wart<min->wart) min=curr;
   return min;
  }

template<class T> Lista<T> &Lista<T>::sortuj() 
  {
   for(element<T> *curr=head;curr;curr=curr->next) std::swap(curr->wart,find_min(curr)->wart);
   return *this;
  }

Dzieki za odpowiedz, rzeczywiscie strasznie duzo glupich bledów. wszystko juz jest ok :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1