PDA

View Full Version : [C] problema soluzione esercizio


D4rkAng3l
19-05-2005, 17:16
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:


/* 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
}


Le cose che mi sembrano strane sono 2:

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

VICIUS
19-05-2005, 18:20
Ciao,
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?
Nello standard ansi è obbligatorio dichiarare tutte le varibili prima del codice. Se pero usi C99 o c++ puoi tranquillamente mischiarli.

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.
Probabilmente il professore ha assunto, o meglio ha deciso che la lista di stringhe era ordianta.

ciao ;)

D4rkAng3l
19-05-2005, 18:49
Nello standard ansi è obbligatorio dichiarare tutte le varibili prima del codice. Se pero usi C99 o c++ puoi tranquillamente mischiarli.


Probabilmente il professore ha assunto, o meglio ha deciso che la lista di stringhe era ordianta.

ciao ;)


mmmm si perchè se è ordinata così funzionerebbe, però nel testo non c'è scritto ed è il secondo esercizio che trovo logicamente errato...l'altro era su un vettore di strutture...quindi non ci sono cavoli di interpretazione come questo...la cosa inizia a seccarmi....

+ più recente l'ansi o il c99? quale dei due è più usato?

sirus
19-05-2005, 19:06
mmmm si perchè se è ordinata così funzionerebbe, però nel testo non c'è scritto ed è il secondo esercizio che trovo logicamente errato...l'altro era su un vettore di strutture...quindi non ci sono cavoli di interpretazione come questo...la cosa inizia a seccarmi....

+ più recente l'ansi o il c99? quale dei due è più usato?
è più recente il C99 ;) e attualmente si usa il C99 come fosse ANSI ;) o quasi anche se non si dovrebbe :D

comunque (non so era tutto specificato nel testo) ma il programma funziona ;)

71104
19-05-2005, 19:41
un piccolo OT per DarkAngel: vedo che migliori a vista d'occhio: l'altro giorno ti incasinavi con un programma che prende i dati in input e li inserisce in una lista e adesso guarda come ti destreggi tra gli elementi duplicati :) :D
dai scherzi a parte, continua così e fagli vedere di che pasta sei fatto!! :D
PS: a voler essere veramente pignoli, potremmo dire che quella soluzione un problema ce l'ha, e per l'esattezza si tratta di un leak piuttosto grave; vediamo se lo trovi da te ;) ;)

D4rkAng3l
20-05-2005, 10:50
un piccolo OT per DarkAngel: vedo che migliori a vista d'occhio: l'altro giorno ti incasinavi con un programma che prende i dati in input e li inserisce in una lista e adesso guarda come ti destreggi tra gli elementi duplicati :) :D
dai scherzi a parte, continua così e fagli vedere di che pasta sei fatto!! :D
PS: a voler essere veramente pignoli, potremmo dire che quella soluzione un problema ce l'ha, e per l'esattezza si tratta di un leak piuttosto grave; vediamo se lo trovi da te ;) ;)

mmm ora lo cerco...ma mi stai prendendo in giro cmq? stò già abbastanza depresso perchè sò che questo esame non lo passerò :cry: Scusate se in questyo periodo rompo particolarmente le balle sul forum ma stò incasinatissimo :cry: devo darlo questo esame...assolutamente...è vitale :cry:

71104
20-05-2005, 12:30
mmm ora lo cerco...ma mi stai prendendo in giro cmq?
assolutamente no! mi sa che nel mess precedente c'era qualche big grin di troppo :)