[C] zamiana miejscami elementu listy jednokierunkowej

Witam

Mam problem z funkcją która zamienia miejscami dwa elementy z listy jednokierunkowej.

zamien()

{

    struct Wezel *pomoc1;

    struct Wezel *pomoc2;

    struct Wezel *temp1;


    temp1 = (struct Wezel*) malloc (sizeof(struct Wezel));


    pomoc1 = first->next;

    pomoc2 = first->next->next; //zapamiętuje wskazniki f->n i f->n->n


    temp1=first;

    first=first->next; // zamieniam miejscami f i f->n

    first->next=temp1;


    first->next=pomoc1;

    first->next->next=pomoc2; //zwracam wskazniki


    //wyswietlanie bazy danych:


    struct Wezel *temp;

    temp=first;

    printf("\n");

    while(temp != NULL)

    {

        printf("* %-15.15s * ", temp->imie);

        printf("%-15.15s * \n", temp->nazwisko);

        temp=temp->next;

    }

}

po wykonaniu tego pokazuje mi tylko jeden wpis a drugi zostaje gdzieś zgubiony. Gdzie tutaj jest błąd?

Pomijając bezsensowne użycie zmiennych globalnych, powinno wyglądać np. tak:

void zamien()  {   struct Wezel *X0,*X1,*X2;

za pomocą tego napisałem funkcje sortującą bąbelkowo, jednak nie działa. Jak poda się przykładowo “d, c, b, a,” to wyświetla tylko “d”. Gdzie tutaj jest błąd?

funkcja ma oczywiście sortować listę wg. zmiennej “rodzaj”.

void sortuj(void)

Błąd polega na tym że nie zmieniasz first w przypadku wymiany pierwszej pary.

Mógłbyś napisać jak to powinno poprawnie wyglądać? Sama ta zamiana. Próbowałem już chyb a wszystkie możliwości kończą mi się pomysły.