Ciao,
oddioo l'esame si avvicina (è su carta, non deve girare eil proff guarda più che altro la logica che ci stà dietro)....questo era il primo esercizio di un vecchio esame...esercizio a sbarramento...ovvero se non si prendono 7 punti su 10 su questo puoi anche aver fatto gli altri esercizzi tutti perfetti ma sei tristemente bocciato...
Come logica ci dovrei essere...perchè ad occhio e croce è la stessa usata dal proff nella soluzione ma non mi gira e il compilatore dà vari errori...
Potete dirmi cosa ci sia di sbagliato e se come logica ci stà?
Ancora infinitamente graziecodice:/* La funzione int Comp(LStr *L) riceve il puntatore al primo nodo della lista ordinata in senso non decrescente rispetto al valore del campo val, la modifica in modo tale che elementi consecutivi che hanno lo stesso valore del campo val sono sostituiti da un elemento il cui valore del campo val è lo stesso e il campo str è la stringa prodotta dalla concatenazione, nell' ordine, delle strighe degli elementi sostituiti. La funzione ritorna il numero massimo di elementi con lo stesso valore del campo val */ #include <stdio.h> #include <stdlib.h> typedef struct VStr{ long val; char *str; struct VStr *next; }VStr, *LStr; int Comp(LStr *L){ int max = 0; // Valore massimo da restituire al chiamante int numvol = 0; // Numero di doppioni trovati per un determinato elemento int nuovalunghezza; // Numero di caratteri della nuova stringa int val; // Contiene il valore del campo val puntato da L LStr prev; /* Contiene l'indirizzo del nodo che precede il nodo puntato da L */ prev = NULL; // Inizialmente prev corrisponde a NULL perchè L punta 1° nodo while(L!=NULL) // Scorre la lista fino alla fine /* Se L non punta al primo nodo e il valore del campo val del nodo precedente (messo in val) è uguale al valore del campo val del nodo corrente */ if(prev != NULL && val == L->val){ /* Calcola la nuova lunghezza della nuova stringa */ nuovalunghezza = strlen(prev->str)+strlen(L->str); /* Rialloca dinamicamente per inserire la nuova stringa */ prev->str = realloc((prev->str, (nuovalunghezza+1)*sizeof(char)); /* Concatena le 2 strinhe nel campo str puntato da prev */ strcat(prev->str, L->str); /* Linka il nodo puntato da prev al nodo puntato da L (L sarà eliminato) */ prev->next = L->next; /* Libera la memoria del vettore il cui puntatore è nel campo str puntato da L */ free(L->str); /* Elimina il nodo L e libera la memoria */ free(L); L = prev->next; // Aggiorna il valore di L al nodo successivo numvol++; // Incrementa il numero di doppioni trovati } else{ if(numvol > max) max = numvol; numvol = 1; val = L->val; prev = L; L = L->next; } if(numvol > max) max = numvol; return max; }
Ciao
Andrea

Rispondi quotando