Algorytm sortujący liste przesuwa listę o jeden w prawo.

0

Definicja listy:

struct elem
{
    int wiek;
    elem*nastepny;
    elem();
};


elem::elem ()
{
    nastepny=0;
}

struct lista
{

    elem*pierwszy;
    void dodaj ();
    int usun (int x);
    void dodajdotab (int tab[]);
    int sortujliste (elem *pocz, int n);
    void dodajdddddddddddddddotab ();
    void sortujlisdfgdfte (elem *pocz);
    int usunpoindeksie (int x);
    lista();
};


lista::lista ()
{
    pierwszy=0;
}
 

Definicja funkcji znajdź

 elem znajdz (elem *element, int x)
{
    if(x>0)
        return znajdz(element->nastepny, x-1);
    if(x==0)
        return *element;

}

a oto algorytm sortujący:

int lista:: sortujliste (elem *pocz, int n)
{
 elem * e, * p;
 int v;

pierwszy = new elem;
pierwszy->nastepny = new elem;
pierwszy->nastepny->nastepny = NULL;

  for(int i = 0; i < n; i++)
    {
    v=znajdz(pocz,i).wiek;

    for(p = pierwszy; v > p->nastepny->wiek; p = p->nastepny) ;

    e = new elem;
    e->wiek = v;
    e->nastepny = p->nastepny;

    p->nastepny = e;
    }


 for(p = pierwszy->nastepny; p->nastepny; p = p->nastepny)

cout << p->wiek << " ";


  return 0;
} 

Problem w tym że po posortowaniu "pierwszy" jest pusty a dopiero pierwszy-> nastepny reprezentuje pierwszy wyraz listy.

0

jedno zasadnicze pytanie. Dlaczego funkcja sortuj tworzy cokolwiek? Tam nie powinno byc nic tworzone. NIC

0

Primo - sortowanie opiera się na istniejące dane, ale nie na tworzeniu dodatkowych
Secundo - po co wyważasz otwarte drzwi? Najlepiej użyj gotowych rzeczy niż tworzysz wszystko od nowa. (Chyba, że to jest zadanie, albo chcesz poznać tajniki).
Tertio - na twoim miejscu utworzyłbym iterator do twojej listy. Na bazie tego iteratora możesz utworzyć funkcję sortującą. Wtedy wystarczy zwykły szablon funkcji, który za parametr weźmie typ iteratora oraz docelowe porównywane dane.

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