Ciao,
stavo vedendo gli esercizzi di esame di programmazione 1 con le relative soluzioni ma a mio modesto parere questa soluzione mi sembra sbagliata...
L'esercizio è il seguente:
"Scrivere una funzione che preso in input il puntatore al primo elemento di una lista di stringhe, elimini i duplicati e ritorni il puntatore alla lista così ripulita.
Gli elementi della lista hanno il seguente tipo:
typedef struct SList{
char str[30];
struct SList *next;
};
Il prototipo della funzione è SList *Ripulisci(SList *)
Il codice della soluzione è questa ma mi puzza:
Le cose che mi sembrano strane sono 2:codice:/* Riceve in ingresso il puntatore al primo nodo e restituisce il puntatore alla lista ripulita */ SList *Ripulisci(SList *list){ if(list != NULL && list->next !! NULL){ SList *e = list; // Imposta il puntatore e al primo nodo do{ if(!strcmp(e-str, e->next-str)){ // Se le stringhe sono uguali SList *p = e->next; e->next = p->next; free(p); } else e = e->next; }while(e->next != NULL); } return list; // Ritorna il puntatore all'inizio della lista ripulita }
1) Si dichiara ile variabili puntaore *e e *p in mezzo al codice....ma non andrebbero dichiarate all'inizio della funzione o è solo una cosa di stile?
2) la funzione compara con la strcmp il valore contenuto nel campo str puntato da e con il valore del campo str puntato da str->next.
Se alla prima esecuzione del ciclo non trova due stringhe uguali il valore di e viene fatto passare al nodo successivo con e = e->next e il ciclo ricomincia...
ma così non controlla solo nodi adiacenti?!?!
Cioè io credo che per ogni nodo dovrebbe scorrere tutti i nodi, se trova un nodo contenente la stessa stringa lo elimina e poi continua a scorrere la lista fino alla fine per vedere se c'è un altro doppione e poi rinizia il ciclo dal secondo nodo e fà la stessa cosa....
Spero di essere stato chiaro
E' sbagliata questa soluzione (quella del codice)?
Grazie
Andrea