17/05/2022, 18:52
apatriarca ha scritto:In realtà il tuo codice è più complesso del necessario. Se la lista è vuota non c'è nulla da stampare (caso base) mentre se c'è almeno un nodo nella lista chiamiamo la funzione sul resto della lista in modo da stampare tutti gli elementi successivi e concludiamo stampando il valore in quel nodo. Insomma è sufficiente la seguente funzione che avevi postato qualche post fa:
- Codice:
void listPrintReverse_exemption(TList list) {
if (list == NULL)
return;
listPrintReverse_exemption(list->link);
printf("%d\n", list->info.key);
}
Che problemi hai incontrato con questa funzione?
18/05/2022, 01:17
18/05/2022, 08:03
18/05/2022, 15:39
TBST
HTtoBST_exemption(THT *ht, TBST bst)
{
for (int i = 0; i < ht->n_bucket; i++)
{
while (ht->bucket[i] && ht->bucket[i]->info.key % 10 == 0)
{
TNode *temp = ht->bucket[i];
ht->bucket[i] = ht->bucket[i]->link;
if (BSTsearch(bst, temp->info) == NULL)
{
BSTinsert(bst, temp->info);
}
nodeDestroy(temp);
}
if (ht->bucket[i] == NULL)
{
continue;
}
TNode *prev = ht->bucket[i];
TNode *node = prev->link;
while (node != NULL)
{
if (node->info.key % 10 != 0)
{
node = node->link;
prev = prev->link;
continue;
}
TNode *temp = node;
node = node->link;
prev->link = node;
if (BSTsearch(bst, temp->info) == NULL)
{
BSTinsert(bst, temp->info);
}
nodeDestroy(temp);
}
}
return bst;
}
TList
BSTtoList(TBST bst, TList list)
{
// Caso base: l'albero è vuoto, niente da aggiungere
if (bst != NULL)
{
// Divide e combina: aggiungo il sotto-albero sinistro (elementi minori)
list = BSTtoList(bst->left, list);
// Aggiungo l'elemento
list = listInsert(list, bst->info);
// Aggiungo il sotto-albero destro (elementi maggiori)
list = BSTtoList(bst->right, list);
}
return list;
}
void listPrintReverse_exemption(TList list) {
// Caso base
if(list == NULL)
return;
// Divide et Impera
listPrintReverse_exemption(list->link);
printf("%d\n",list->info.key);
}
TBST BSTremoveLast(TBST bst) {
// Caso base
if(bst == NULL)
{
return bst;
}
if( bst->right == NULL )
{
return bst->left;
}
bst->right = BSTremoveLast( bst->right );
return bst;
}
20/05/2022, 09:13
20/05/2022, 13:32
giacomovicinanza ha scritto:Si mi è tutto chiaro grazie mille per avermi aiutato
info.key % 10 != 0
e poi cancellare la lista originale. In questo modo non avresti iterato su una lista da cui stavi rimuovendo elementi, anche se al costo di qualche allocazione in più.
Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000—
Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.
Powered by phpBB © phpBB Group - Privacy policy - Cookie privacy
phpBB Mobile / SEO by Artodia.