Sortowanie listy jednokierunkowej

0

Witam, mam problem z posortowaniem listy 1 kierunkowej.
Sortuje względem pola "polskie".

lista:

struct element{
    char polskie[50];
    int ilosc_tlumaczen;
    char angielskie[T][50];
    struct element *nast;
};
typedef struct element ELEMENT;
typedef ELEMENT *ADRES;

funkcja sortująca:

void sortowanie(ADRES *pierwszy){
ADRES *pom;
char tab[50];
int zmiany;
do{
for(*pom=*pierwszy;*pom!=NULL;*pom=*pom->nast){
    if(strcmp(*pom->polskie,*pom->nast->polskie)>0){
        strcpy(tab,*pom->polskie);
        strcpy(*pom->polskie,*pom->nast->polskie);
        strcpy(*pom->nast->polskie,tab);
    }
}}while(zmiany!=0);
}

kompilator pokazuje błędy takie:

error: expected identifier before '*' token|
error: request for member 'polskie' in something not a structure or union|
error: request for member 'nast' in something not a structure or union|

nie wiem czy poprawnie to na wskaźnikach zrobiłem, ale chcę aby to posortowało całą listę orginalną, a nie tylko kopię stworzoną przez funkcję.
Proszę o pomoc.

2

Przy sortowaniu listy weź pod uwagę, że masz wskaźniki, więc musisz podmienić tylko informacje o adresach w odpowiednich miejscach...

1

Przede wszystkim, @kaczus ma rację, powinieneś podmieniać wyłącznie adresy. Co do samego błędu, operatory mają inne priorytety niż Ci się wydaje:

*pom->polskie

to tak naprawdę:

*(pom->polskie)

kiedy chciałeś

(*pom)->polskie
0

dodałem nawiasy, ale program się teraz wysypuje. nie bardzo rozumiem o co chodzi z tymi wskaźnikami. mógłby ktoś pomóc co zmienić?

void sortowanie(ADRES *pierwszy){
ADRES *pom;
char tab[50];
int zmiany;
do{
for(*pom=*pierwszy;*pom!=NULL;*pom=(*pom)->nast){
    if(strcmp((*pom)->polskie,(*pom)->nast->polskie)>0){
        strcpy(tab,(*pom)->polskie);
        strcpy((*pom)->polskie,(*pom)->nast->polskie);
        strcpy((*pom)->nast->polskie,tab);
    }
}}while(zmiany!=0);
}
0

bo mogę to dać do maina wtedy nie będzie trzeba wskaźników?
ale chciałbym nauczyć się przez funkcję

0

Nie ma znaczenia. co przekazujesz do funkcji (znaczy ogólnie ma, ale tu nie o to chodzi w uwagach), znaczenie ma to, że w drzewie masz wskaźniki i podmiana miejscami może no wyglądać (według tego co robisz, czyli porównania okolicznych elementów):

ELEMENT buf;
...
buf = (*pom)->nast;
(*pom)->nast = (*pom);
(*pom) = buf;

druga rzecz
zmienna zmiany ma nieustaloną wartość....

0
void sortowanie(ADRES *pierwszy){
ADRES *pom;
ADRES buf;
int zmiany=0;
do{
for(*pom=*pierwszy;*pom!=NULL;*pom=(*pom)->nast){
    if(strcmp((*pom)->polskie,(*pom)->nast->polskie)>0){
        buf = (*pom)->nast;
        (*pom)->nast = (*pom);
        (*pom) = buf;
    }
}}while(zmiany!=0);
}

niestety nadal nie działa, ja nie mam pomysłów ;(

0

a zapomniałem żeby przy wejściu do ifa zmieny były inne niż 0.
niestety to też nie pomogło ;/

void sortowanie(ADRES *pierwszy){
ADRES *pom;
ADRES buf;
int zmiany=0;
do{
for(*pom=*pierwszy;*pom!=NULL;*pom=(*pom)->nast){
    if(strcmp((*pom)->polskie,(*pom)->nast->polskie)>0){
        buf = (*pom)->nast;
        (*pom)->nast = (*pom);
        (*pom) = buf;
        zmiany++;
    }
}}while(zmiany!=0);
}
0

zmieniłem na coś takiego, na dodatek w forze zmieniłem warunek na

(*pom)->nast!=ostatni

już nie wywala programu, ale pętla jest nieskończona.

void sortowanie(ADRES *pierwszy,ADRES ostatni){
ADRES *pom;
ADRES buf;
int zmiany;
do{
    zmiany=0;
for(*pom=*pierwszy;(*pom)->nast!=ostatni;*pom=(*pom)->nast){
    if(strcmp((*pom)->polskie,(*pom)->nast->polskie)>0){
        buf = (*pom)->nast;
        (*pom)->nast = (*pom);
        (*pom) = buf;
        zmiany++;
    }
}}while(zmiany!=0);
}

"ostatni" to adres ostatniego elementu listy.

0

pokazuje się taki komunikat

warning: 'pom' is used uninitialized in this function [-Wuninitialized]|

dotyczy on linii

for(*pom=*pierwszy;(*pom)->nast!=*ostatni;*pom=(*pom)->nast)
0

To znaczy, że nigdzie wcześniej nie ustawiasz pom.

0

dlaczego tam wychodzi pętla nieskończona?

1

Bo nie wziąłeś pod uwagę kilku dodatkowych aspektów. Podmiany wszystkich nextów, oraz ew zmiany przy pierwszym. Powiedzmy, że doszedłeś do etapu, gdzie można wkleić Ci fragment większy, do analizy. Ponieważ nazwy masz jakie masz, to zastosowałem podobne, czyli tez tak trochę od czapy:

void sortowanie(ADRES *pierwszy)
{
	ADRES pom;
	ADRES buf,bef, bnast;
	int zmiany;
	do
	{
		zmiany=0;
		for(pom=*pierwszy, bef = NULL;pom->nast!=NULL;pom=(pom)->nast)
		{
			if(strcmp((pom)->polskie,pom->nast->polskie)>0)
			{
				buf = pom->nast;
				bnast = pom->nast->nast;

				buf->nast = pom;
				pom->nast = bnast;
				pom = buf;



				if (bef == NULL)
					*pierwszy = pom;
				else
					bef->nast = pom;
				zmiany++;
			}
			bef = pom;
		}
	}while(zmiany!=0);
}
0

hmm mógłbyś mi opisać na czym polega te bnast, bef, buf?
jak mniej więcej działa algorytm?

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