4° Appello – 09/07/2019 - Domanda 4

Tnodo* deleteFunction(Tnodo* l, int s){
	if(l!=NULL){
		Tnodo* tmp = l;
		while(tmp->next!=NULL){
			if(tmp->dato>s){
				if(tmp->prev!=NULL){
					(tmp->prev)->next = tmp->next;
				}
				(tmp->next)->prev = tmp->prev;
				Tnodo* toDelete = tmp;
				tmp = tmp->next;
				delete toDelete;
			}else{
				tmp = tmp->next;
			}
		}
		if(tmp->dato>s){
			if(tmp->prev!=NULL){
				(tmp->prev)->next = NULL;
				delete tmp;
			}else{
				tmp=NULL;
			}
		}
	}
	return l;
}

(NON sono certo sia corretta)

Mi sembra corretto :call_me_hand: copio qui sotto come l’ho scritto io.
(ti ho copiato l’idea di fare delete sul puntatore copiato e non sul “cursore”, io avrei eliminato il cursore direttamente (sbagliando))

Tnodo* funzione(Tnodo* l, int s){
	if(l==NULL) return l;
	Tnodo* cur = l;
	while(cur!=NULL){ //analizzo il caso dell'ultimo elemento qui dentro
		if(cur->dato>s){
			Tnodo* toDelete = cur;
			if(cur->prev==NULL){
				//caso primo elemento
				cur->next->prev=NULL;
				delete toDelete;
			}
			else if(cur->next==NULL){
				//caso ultimo elemento
				cur->prev->next=NULL;
				delete toDelete;
			}
			else{
				//caso in mezzo
				cur->next->prev=cur->prev;
				cur->prev->next=cur->next;
				delete toDelete;
			}
		}
		cur=cur->next;
	}
	return l;
}

Ciao stavo leggendo la tua soluzione quando ho pensato:
Ma se l’elemento fosse unico?
La lista doppiamente concatenata avrebbe una struttura del genere:

      prev  |  ELEMENTO |  next
NULL <----- |           | -----> NULL
            | DATO: ... |

A questo punto, assumendo che il dato all’interno dell’elemento abbia un valore superiore alla soglia impostata, verrebbe eseguito il primo blocco condizionale dopo la riga Tnodo* toDelete = cur;.
Non esistendo peró un elemento successivo su cui effettuare questa operazione cur->next->prev=NULL; il programma andrebbe in errore.

Sbaglio?

Hai ragione! Bisognerebbe aggiungere un if apposito…