Odwracanie listy jednokierunkowej [ANSI C]

pawwach
Użytkownik
Użytkownik
Posty: 11
Rejestracja: 10 sty 2011, o 20:44
Płeć: Mężczyzna
Lokalizacja: Kamienica/Kraków
Podziękował: 1 raz

Odwracanie listy jednokierunkowej [ANSI C]

Post autor: pawwach »

Witam,

Oto uczyniłem prostą listę jednokierunkową:

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>

struct el_listy {
    int klucz;
    el_listy *nast;
};

int main(){
    el_listy *head;
    head=(el_listy*)malloc(sizeof(el_listy*));
    head->nast=NULL;
}
Teraz moje zadanie brzmi - odwrócić listę bez użycia dodatkowej listy/tablicy. Jakieś pomysły? Iteracyjnie/rekurencyjnie? Nie oczekuję kodu, zadowolę się jakąś sensownie naprowadzającą podpowiedzią
Awatar użytkownika
argv
Użytkownik
Użytkownik
Posty: 569
Rejestracja: 27 maja 2009, o 01:27
Płeć: Mężczyzna
Podziękował: 51 razy
Pomógł: 66 razy

Odwracanie listy jednokierunkowej [ANSI C]

Post autor: argv »

Iteracyjnie - bardzo podobnie do przechodzenia listy, ale z jednym pomocniczym wskaźnikiem czyli standardowe poprz, akt i jakiś pom (jego funkcja to bycie poprzem poprza).
pawwach
Użytkownik
Użytkownik
Posty: 11
Rejestracja: 10 sty 2011, o 20:44
Płeć: Mężczyzna
Lokalizacja: Kamienica/Kraków
Podziękował: 1 raz

Odwracanie listy jednokierunkowej [ANSI C]

Post autor: pawwach »

No i niestety, nie rozumiem Cię Moje przeglądanie iteracyjne wygląda tak:

Kod: Zaznacz cały

void przegladaj_ite(el_listy *head){
     el_listy *p=head->nast;
     if (p==NULL) printf("Lista jest pusta.");
     else {
     while(p!=NULL){
                    printf("%d ", p->klucz);
                    p=p->nast;
     }
     }
}
Xitami

Odwracanie listy jednokierunkowej [ANSI C]

Post autor: Xitami »

Kod: Zaznacz cały

p=head; r=null
while p!=NULL
    q=p->nast
    p->nast=r
    r=p
    p=q
head=r
pawwach
Użytkownik
Użytkownik
Posty: 11
Rejestracja: 10 sty 2011, o 20:44
Płeć: Mężczyzna
Lokalizacja: Kamienica/Kraków
Podziękował: 1 raz

Odwracanie listy jednokierunkowej [ANSI C]

Post autor: pawwach »

Dziękuję za podpowiedzi Panowie Pamiętając, że u mnie głowa listy nie zawiera żadnej interesującej mnie wartości klucza, a jedynie wskaźnik do pierwszego elementu listy właściwej, mój kod wygląda tak:

Kod: Zaznacz cały

void odwroc (el_listy *head){
    el_listy *a=head->nast; // aktualny
    el_listy *p=NULL; // poprzedni
    el_listy *n=NULL; // nastepny
    
    while (a!=NULL){
        n=a->nast;
        a->nast=p;
        p=a;
        a=n;    
    }
    
    head->nast=p;
}
I działa
ODPOWIEDZ