View Full Version : [C] Problema con le liste
alberto.frz
06-02-2007, 18:53
ciao, ho un piccolo problemino con le liste.
ho creato questo tipo di lista semplice di caratteri
typedef struct elemento {
char info;
struct elemento *next;
}Elemento;
typedef Elemento *Lista;
supponendo di avere una lista non vuota, come faccio a sapere se i caratteri al suo interno sono ordinati in maniera crescente o decrescente?
qualche dritta?
:help:
Non la ho compilata e non sono perfettamente sicuro sia ANSI C, quindi non mi prendo nessuna responsabilità se ti fonderà la CPU ed espellerà i cd dai tuoi drive ottici a mo' di frisbee :fagiano:.
Comunque dovrebbe controllare se la lista è ordinata in modo crescente.
int isOrdered(Elemento* lista) {if (lista->next == NULL)return 1;
if (lista->info <= lista->next->info)return isOrdered(lista->next);
return 0;
}
Naturalmente per controllare se è ordinata in modo decrescente basterà sostituire < con > nel secondo if ;)
alberto.frz
06-02-2007, 23:34
ma la lista è di char... :confused:
supponendo di avere una lista non vuota, come faccio a sapere se i caratteri al suo interno sono ordinati in maniera crescente o decrescente?Ok, allora innanzitutto stabiliamo di realizzare una funzione che possa ritornare, ad esempio, un int che possa avere i seguenti valori:
+1 = lista ordinata in modo crescente
-1 = lista ordinata in modo decrescente
0 = lista non ordinata o comunque con ordine non determinato (pensiamo ad una lista in cui ci sono, per ipotesi, tutte le informazioni uguali).
Il procedimento da seguire per ottenere questo è il seguente.
Alla funzione viene passato il puntatore alla 'root' della lista. Dentro la funzione è necessario avere 2 variabili, chiamiamole 'dir' e 'c'.
Si fa la scansione dell'intera lista, per ogni elemento si verifica se esiste un elemento successivo. Se esiste un elemento successivo, si fa una comparazione delle due informazioni adiacenti. Se info1 > info2 si mette c=-1, se info1 < info2 si mette c=+1, altrimenti si mette c=0.
A questo punto è necessario verificare se la comparazione "concorda" o meno con 'dir'. Se dir==0 e c != 0 si fa dir=c. Se invece sia 'dir' che 'c' sono diversi da 0 e non "concordano" (sono diversi), si fa immediatamente un return di 0.
Si continua così con gli elementi successivi. Alla fine si fa ritornare 'dir'.
Il risultato è appunto quello di ottenere un +1/-1/0 che indica l'ordinamento come spiegato all'inizio.
Spero di aver spiegato in modo chiaro.
alberto.frz
07-02-2007, 09:39
...Se info1 > info2 si mette c=-1, se info1 < info2 si mette c=+1, altrimenti si mette c=0...
ma allora devo trattare i char come se fossero dei int per il confronto...?!
ma allora devo trattare i char come se fossero dei int per il confronto...?!Certo .... un char lo puoi trattare nello stesso modo in cui tratti gli altri tipi base (short, int ....).
alberto.frz
07-02-2007, 10:05
:D hai proprio ragione...a volte mi perdo su un bicchier d'acqua.
grazie :mano: è già la seconda volta che mi aiuti!
ciao!!!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.