Sortowanie listy jednokierunkowej

0

Witam, męczę się już dosyć długo z procedurą która sortowała by alfabetycznie listę jednokierunkową. Moglibyście mi zapisać kod takiej procedury. Byłbym ogromnie wdzięczny. :)
Pozdrawiam

0

Nie lepiej zadbać o to aby podczas dodawania węzła umieszczał się on w "odpowiednim" miejscu? Wtedy lista będzie ZAWSZE posortowana...

0

btw a żeby zamienić miejscami dwa elemetnty wystraczy
\

 
temp:=prev;
        prev:=prev.next;
        prev.next:=temp;

bo ja juz zgłupiałem teraz

0

Długi kod i może nie byc zrozumiały na 1 rzut oka ale jak go przeanalizujesz, połapiesz jak napisac "dobra" liste..

#include<iostream>
using namespace std;

enum {Cm,Cw,Cr};

class Data
{
    public:
    Data(int val):myVal(val) {}
    ~Data() {}
    int Porownaj(const Data &);
    void Pokaz() {cout<<myVal<<endl;}
    private:
    int myVal;
};

int Data::Porownaj(const Data & innaData)
{
    if(this->myVal > innaData.myVal) return Cw;
    if(this->myVal < innaData.myVal) return Cm;
    else return Cr;
}

class Wezel;
class WezelGlowy;
class WezelOgon;
class WezelDanych;

class Wezel
{
    public:
    Wezel() {}
    virtual ~Wezel() {}
    virtual Wezel * Wstaw(Data * dane)=0;
    virtual void Pokaz()=0;
    private:
};

class WezelDanych:public Wezel
{
    public:
    WezelDanych(Data* dane,Wezel* next);
    ~WezelDanych() {delete myNext; delete myData;}
    virtual Wezel * Wstaw(Data * dane);
    virtual void Pokaz() {myData->Pokaz(); myNext->Pokaz();}
    private:
    Data *myData;
    Wezel *myNext;
};

WezelDanych::WezelDanych(Data* dane,Wezel* next):myData(dane),myNext(next)
{
}

Wezel* WezelDanych::Wstaw(Data *dane)
{
    int wynik=myData->Porownaj(*dane);

    switch(wynik)
    {
        case Cr:
        case Cw:
        {
            WezelDanych * nowedane= new WezelDanych(dane,this);
            return nowedane;
        }
        case Cm:    myNext=myNext->Wstaw(dane);
                    return this;
    }
    return this;
}

class WezelOgon:public Wezel
{
    public:
    WezelOgon() {}
    ~WezelOgon() {}
    virtual Wezel * Wstaw(Data* dane);
    virtual void Pokaz() {}
    private:
};

Wezel * WezelOgon::Wstaw(Data *dane)
{
    WezelDanych * nowedane = new WezelDanych(dane,this);
    return nowedane;
}

class WezelGlowy :public Wezel
{
    public:
    WezelGlowy();
    ~WezelGlowy() {delete myNext;}
    virtual Wezel * Wstaw (Data * dane);
    virtual void Pokaz() {myNext->Pokaz();}
    private:
    Wezel * myNext;
};

WezelGlowy::WezelGlowy()
{
    myNext= new WezelOgon;
}

Wezel * WezelGlowy::Wstaw(Data * dane)
{
    myNext = myNext->Wstaw(dane);
    return this;
}

class Lista
{
    public:
    Lista();
    ~Lista() {delete myHead;}
    void Wstaw(Data* dane);
    void PokazAll() {myHead->Pokaz();}
    private:
    WezelGlowy* myHead;
};

Lista::Lista()
{
    myHead=new WezelGlowy;
}

void Lista::Wstaw(Data*dane)
{
    myHead->Wstaw(dane);
}

int main()
{
    Data * dane;
    int val;
    Lista ll;

    for(;;)
    {
        cout<<"podaj wartosc- 0 koniec: ";
        cin>>val;
        if(!val) break;
        dane = new Data(val);
        ll.Wstaw(dane);
    }
    ll.PokazAll();
    return 0;
}
0

dzięki trochę poczytałem ten Twój kod :) ostatecznie zrobilem tak

procedure swap(el1,el2:plist);
var zespol,miasto,rok,miesiac,dzien,cena,liczba,koszt:string;
begin
 zespol:=el1.zespol;
 miasto:=el1.miasto;
 rok:=el1.rok;
  miesiac:=el1.miesiac;
  dzien:=el1.dzien;
  cena:=el1.cena;
  liczba:=el1.liczba;
  koszt:=el1.koszt;
  el1.zespol:=el2.zespol;
  el1.miasto:=el2.miasto;
  el1.rok:=el2.rok;
  el1.miesiac:=el2.miesiac;
  el1.dzien:=el2.dzien;
  el1.cena:=el2.cena;
  el1.liczba:=el2.liczba;
  el1.koszt:=el2.koszt;
  el2.zespol:=zespol;
  el2.miasto:=miasto;
  el2.rok:=rok;
  el2.miesiac:=miesiac;
  el2.dzien:=dzien;
  el2.cena:=cena;
  el2.liczba:=liczba;
  el2.koszt:=koszt;
end; 
procedure TForm1.RadSortzespolClick(Sender: TObject);
var i,j,l,m:integer; wsk:plist;
begin
  wsk:=first;
  l:=dlugosc(first);
  m:=l-1;
  for i:=0 to l do begin

    for j:=0 to m-1 do begin
      if (wsk.zespol>wsk.next.zespol)  then
          swap(wsk,wsk.next);
      if (wsk.zespol=wsk.next.zespol) and (wsk.miasto>wsk.next.miasto) then
        swap(wsk,wsk.next);
     wsk:=wsk.next;
    end;
    wsk:=first;
   end;
  odswiez(Lista);
end;
procedure TForm1.RadSortMiastoClick(Sender: TObject);
var i,j,l,m:integer; wsk:plist;
begin
  wsk:=first;
  l:=dlugosc(first);
  m:=l-1;
  for i:=0 to l do begin

    for j:=0 to m-1 do begin
      if (wsk.miasto>wsk.next.miasto)  then
          swap(wsk,wsk.next);
      if (wsk.miasto=wsk.next.miasto) and (wsk.zespol>wsk.next.zespol) then
        swap(wsk,wsk.next);
     wsk:=wsk.next;
    end;
    wsk:=first;
   end;
  odswiez(Lista);
end; 

zamieniam pola rekordu a elementów listy nie ruszam. Wrzucam gdyby ktos miał kiedys podobny problem

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