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
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