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à?
codice:
/* 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;
}
Ancora infinitamente grazie
Ciao
Andrea