Salve a tutti, scrivo (nuovamente) per un aiuto su una funzione per le liste. Qualcuno forse si ricorderà del precedente post dove chiedevo aiuti e generalità sulle liste (eliminazione, inserimento, etc...)..Bene, quella parte mi è finalmente chiara, e come consigliato da qualcuno, ho eliminato le dichiarazioni con i typedef, e mi è risultato tutto più semplice oserei dire.
Ora ho "risolto" questo esercizio, che, data una lista di tot elementi, cerca all'interno di essa una sequenza di numeri consecutivi e li somma, lasciando poi il nodo della loro somma.
Esempio: 10 5 3 2 1
Risultato: 10 5 6
Il mio esercizio funziona, in quanto spostando il puntatore gli faccio "saltare" 2 e 1 e al posto del 3 ci piazzo 6, ma non sono riuscito a utilizzare free per liberare la memoria, quindi, praticamente, perso ogni collegamento al nodo 2 e al nodo 1, essi rimangono smarriti in memoria, giusto?
Ora vi chiedo, va bene lo stesso? Posso incappare in errori? Con le prove che ho effettuato finora non ne ho riscontrati., tuttavia a occhi più esperti potrebbero saltar fuori problemi legati al fatto che non libero effettivamente memoria.
struct nodo {
int valore;
struct nodo *next;
};
struct nodo * sequenza(struct nodo * testa)
{
printf("Ora cerco sottosequenze di numeri consecutivi e sommo tali numeri.\n");
struct nodo * current, *app;
if(testa == NULL || testa->next == NULL) { //chiaramente se la testa ha 0 o al massimo 1 elemento, non cerco sottosequenze
return testa;
}
else
{
current = testa;
while(current && current->next) {
app = current;
while((app && app->next) && (app->valore +1 == app->next->valore)) {
current->valore += (app->next->valore);
app = app->next;
}
if(current != app) current->next = app->next;
current = current->next;
}
}
return testa;
}