[C++] Sortowanie elementów string w liście dwukierunkowej

0

Witam wszystkich. To mój pierwszy post na forum :)

Chciałem napisać program który wczytuję listę słów z pliku i sortuje je alfabetycznie w liście. Niestety nie działa poprawnie, zamienia kolejność tylko niektórych słów. Czy mógłbym prosić o pomoc, wskazanie błędu?

 
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

class wyraz
{
public:
	string w;
	wyraz * nast;
	wyraz * poprz;
};
wyraz * glowa=NULL;
wyraz * ostatni=NULL;

int main(void)
{
	wyraz * wsk=NULL;

	fstream plik;
	plik.open( "slownik.txt", ios::in | ios::out );
	if( plik.good() == true )
		cout << "Uzyskano dostep do pliku!" << endl;
	else 
		cout << "Dostep do pliku zostal zabroniony!" << endl;
		
	while(!plik.eof())
	{ 

		if(glowa==NULL)
		{
			glowa=wsk=new wyraz;
			wsk->poprz=NULL;
		}

		else
		{ 
			wsk->nast=new wyraz;
			wsk->nast->poprz=wsk;
			wsk=wsk->nast;
		}

		getline(plik,wsk->w);
		wsk->nast=NULL;

	}

	ostatni=wsk;

	/* SORTOWANIE */
	
	for(wsk=glowa; wsk->nast!=NULL ; wsk=wsk->nast)
	{
		//wsk=glowa;
		if(wsk->w > wsk->nast->w)
		{
			string temp_w;
			temp_w=wsk->w;
			wsk->w=wsk->nast->w;
			
			wsk->nast->w=temp_w;
			
		}
		
			
	}

	cout << "\n\n Lista posortowana: " << endl;
	wsk=glowa;
	while(wsk!=NULL)
	{
		cout << wsk->w << endl;
		wsk=wsk->nast;
	}
		
	return 0;
}
1

Zly masz algorytm sortowania. Za malo razy przelatujesz ta liste, w efekcie za malo razy sie swapuja elementy.
Najprostsza implementacja tego wyglada mniej-wiecej tak:

for(wsk2=glowa; wsk2->nast!=NULL ; wsk2=wsk2->nast) {
    for(wsk=glowa; wsk->nast!=NULL ; wsk=wsk->nast) {
        if(wsk->w > wsk->nast->w)
        {
            string temp_w;
            temp_w=wsk->w;
            wsk->w=wsk->nast->w;
            wsk->nast->w=temp_w;
        }
    }
}
0

No tak faktycznie :) Ja chciałem próbować jakoś powtarzać jeszcze raz ten sam algorytm ale tez nie wychodziło :D
Dziękuję za pomoc, już wszystko działa poprawnie :)

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