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)

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