PDA

Visualizza la versione completa : [C] Visualizzazione di una lista circolare


thecrows
16-02-2011, 18:21
Salve ragazzi volevo avere maggiori chiarimenti su come poter risolvere un problema che ho con un sottoprogramma riguardo la visualizzazione di una lista circolare.
---------------------------------------------------
void visualizza(struct nodo *l )
{
struct nodo *app;
app=l;
if(app==NULL)
printf("\nLISTA VUOTA...\n");
else{
if(app->p==app)
printf("\nIl numero presente in lista e' %d. ",app->info);
else{
printf("\nI numeri presenti in lista sono: ");
do{
printf("\n\t %d",app->info);
app=app->p;
}while(app->p!=app);
}
}
}
-------------------------------------------------------
Il problema sussiste nel caso del do{ }while cio nel caso in cui nella nostra lista ci sia pi di un elemento. In pratica mi visualizza tutti gli elementi tranne l'ultimo (che poi nella lista circolare l'ultimo anche il primo per diciamo l'ultimo rispetto al primo che visualizza).
Vi sarei grato se mi aiutaste.
Stefano

Laikius91
16-02-2011, 22:14
Secondo me, in:



do{
printf("\n\t %d",app->info);
app=app->p;
}while(app->p!=app);


La condizione del while mi lascia dubbioso....
Cio tu hai una cosa del tipo:

[1]--->[2]--->[3] dove 1 punta a 2, 2 punta a 3 e tre punta a 1 giusto? Ma tra di loro sono diversi no?

thecrows
17-02-2011, 06:28
si praticamente si la situazione quell adescritta da te. il sottoprogramma visualizza solo 1 e 2 e 3 no.... Come posso risolvere... non riesco a trovare una condizione consona.

Laikius91
17-02-2011, 07:59
Ma se tu facessi una cosa del genere:



firts = app;

do{
printf("\n\t %d",app->info);
app=app->p;
}while(app!=first);


??
Potrebbe andare?

thecrows
17-02-2011, 17:03
penso proprio che sia la soluzione... adesso controllo...

thecrows
17-02-2011, 17:11
scusa non avevo letto bene cosa first? spiegami cosa significa la condizione... grz

Laikius91
17-02-2011, 17:50
Originariamente inviato da thecrows
scusa non avevo letto bene cosa first? spiegami cosa significa la condizione... grz


Allora, first non l'ho inizializzato, ma un "struct nodo*"...
Io ho ragionato cos, supponiamo di avere una lista fatta cos:



indirizzo struct
[info = 1; p = ]
[info = 2; p = ]
[info = 3; p = ]


Salvo l'indirizzo del primo elemento in firts (quindi salvo in first ) nel ciclo succede questo:

1) app = (punta al primo elemento);
2) stampo app->info;
3) sposto app e ho app = (secondo elemento);
4) app != first ? Si perch != !
5) stampo app->info;
6) sposto app e ho app = ;
7) app != first? Si perche != ;
8) stampo app->info;
9) sposto app e ho app = ;
10) app != first? No, perche == !
11) Esce dal ciclo!

Che dici pu tornare il ragionamento??

thecrows
17-02-2011, 18:23
Xfetto non fa una pecca. Adesso quello che voglio chiedere. Visto che la mia lista che gli passo alla funzione si chiama 'l' invece di dichiarare un altro puntatore di appoggio (in questo caso app2 perche gi app l'ho utilizzato), la condizione che mi hai corretto posso anche scriverla cos...



do{
printf("\n\t %d",app->info);
app=app->p;
}while(app!=l);

Laikius91
17-02-2011, 18:42
Originariamente inviato da thecrows
Xfetto non fa una pecca. Adesso quello che voglio chiedere. Visto che la mia lista che gli passo alla funzione si chiama 'l' invece di dichiarare un altro puntatore di appoggio (in questo caso app2 perche gi app l'ho utilizzato), la condizione che mi hai corretto posso anche scriverla cos...



do{
printf("\n\t %d",app->info);
app=app->p;
}while(app!=l);


Sisi hai perfettamente ragione, non mi ero accorto che app fosse gi una copia di un puntatore "l"!
Direi ottimo! :)

Funziona bene quindi?

thecrows
17-02-2011, 18:47
Sisi funziona bene adesso l'ese mi d un problema ina ricerca ma ho capito dove ho sbagliato e poi mi si blocca al 3 inserimento del dato "info"

uff ma che motivo c'?

Loading