Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-02-2012, 03:21   #1
Saetta93
Member
 
Iscritto dal: Feb 2012
Messaggi: 55
[C] - Eliminazione nodo albero binario.

Ciao a tuttii

Io ho questo codice, devo completare la/le funzione/i per eliminare un nodo da un albero binario, ma sono ad un punto in cui non riesco a continuare..

In pratica all'interno di questo if (da quello che ho capito):

Codice:
if((*p)->ptrsx == NULL)  
        {
            num = (*p)->dato;
            free(*p);
            *p=NULL;
            risultato=num;
        }
dovrei salvare il contenuto della foglia, nel puntatore del nodo appena eliminato.. ma come devo fare?

Qualcuno può aiutarmi gentilmente?

Codice C:

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// #include <malloc.h>

typedef struct nodo{
    int dato;
    struct nodo *ptrsx;
    struct nodo *ptrdx;
}nodo;

int elimina(nodo** );

nodo* creazione(){
    nodo *q;
    q = malloc(sizeof(nodo));
    
    printf("\nInserisci un numero intero:\t");
    scanf("%i", &q->dato);
    printf("\n");
    
    q->ptrsx = NULL;
    q->ptrdx = NULL;
    
    return q;
}

void ins_ord(nodo *p,nodo *q)
{
    nodo *r;
    r = p;
    if(r->dato > q->dato) {
        if(r->ptrsx == NULL) {
            r->ptrsx = q;
        }else {
            ins_ord(r->ptrsx,q);
        }
    } else {
        if(r->ptrdx == NULL) {
            r->ptrdx = q;
        } else {
            ins_ord(r->ptrdx, q);
        }
    }
}

nodo* ins_bin(nodo *p) {
    nodo *q;
    q = creazione();
    
    if(p == NULL) {
        return q;
    } else {
        ins_ord(p, q);
    }
    
    return p;
}

void visita(nodo *p){
    nodo *r;
    r = p;
    if(r!=NULL)
    {
        if(r->ptrsx != NULL) {    // controllare il padre
            visita(r->ptrsx);
        }
        
        printf("%i", r->dato);
        printf("\t");
        
        if(r->ptrdx != NULL) {
            visita(r->ptrdx);
        }
    }
}

bool eliminazione(nodo **p, int val)
{
    if((*p) == NULL)
        return false;
    else {
        elimina(p);
        return true;
    }
}

int elimina(nodo **p)
{
    int num, risultato;
    if((*p)!=NULL)
    {
        if((*p)->ptrsx == NULL)  
        {
            num = (*p)->dato;
            free(*p);
            *p=NULL;
            risultato=num;
        }
        else
        {
            risultato = elimina(&((*p)->ptrdx));
        }
    }
    return risultato;
}


int main()
{
    nodo *radice = NULL;
    int scelta = 1, num;
    while(scelta != 0) {
        printf("1 - Inserimento ordinato;\n2 - Visita albero;\n3 - Cancella elemento;\n0 - Esci;\n\nScelta:\t");
        scanf("%i", &scelta);
        
        switch(scelta) {
            case 1: {
                radice=ins_bin(radice);
                
                break;
            }
            case 2: {
                printf("\nAlbero:\n");
                visita(radice);
                printf("\n\n");
                
                break;
            }
            case 3: {
                if(radice != NULL){
                    printf("\nInserisci il numero da cancellare:\t");
                    scanf("%d", &num);
                    radice->ptrsx=NULL;
                    radice->ptrdx=NULL;
                    eliminazione(&radice, num);
                } else {
                    printf("\nLa lista e' vuota.\n");
                }
                
                break;
            }
        }
    }
}
Grazie mille a tutti
Saetta93 è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2012, 12:32   #2
Saetta93
Member
 
Iscritto dal: Feb 2012
Messaggi: 55
Con un amico sono arrivato a questo codice:

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// #include <malloc.h>

typedef struct nodo{
    int dato;
    struct nodo *ptrsx;
    struct nodo *ptrdx;
}nodo;

nodo* creazione(){
    nodo *q;
    q = malloc(sizeof(nodo));
    
    printf("\nInserisci un numero intero:\t");
    scanf("%i", &q->dato);
    printf("\n");
    
    q->ptrsx = NULL;
    q->ptrdx = NULL;
    
    return q;
}

void ins_ord(nodo *p,nodo *q)
{
    nodo *r;
    r = p;
    if(r->dato > q->dato) {
        if(r->ptrsx == NULL) {
            r->ptrsx = q;
        }else {
            ins_ord(r->ptrsx,q);
        }
    } else {
        if(r->ptrdx == NULL) {
            r->ptrdx = q;
        } else {
            ins_ord(r->ptrdx, q);
        }
    }
}

nodo* ins_bin(nodo *p) {
    nodo *q;
    q = creazione();
    
    if(p == NULL) {
        return q;
    } else {
        ins_ord(p, q);
    }
    
    return p;
}



void visita(nodo *p){
    if(p != NULL){
        visita(p->ptrsx);
        printf("%i\t", p->dato);
        visita(p->ptrdx);
    }
}

bool eliminazione(nodo *p,int val){
    nodo *rd,*rs;
    if(p==NULL) return false;
    if(p->dato==val){
        rs=p->ptrsx;
        rd=p->ptrdx;
        free(p);
        if(rd == NULL)p=rs;
        else{
            while(rd->ptrsx != NULL) rd=rd->ptrsx;
            rd->ptrsx=rs;
            p=rd;
        }
        return true;
    }else if (val > p->dato) return eliminazione(p->ptrdx,val);
    else return eliminazione(p->ptrsx,val);
}

//funzione per la dellocazione finale dell'albero, usata alla fine del main
void dealloca(nodo *p){
    if(p!=NULL){
        dealloca(p->ptrsx);
        dealloca(p->ptrdx);
        free(p);
        p=NULL;
    }
}

int main()
{
    nodo *radice = NULL;
    int scelta = 1, num;
    while(scelta != 0) {
        printf("1 - Inserimento ordinato;\n2 - Visita albero;\n3 - Cancella elemento;\n0 - Esci;\n\nScelta:\t");
        scanf("%i", &scelta);
        
        switch(scelta) {
            case 1: {
                radice=ins_bin(radice);
                
                break;
            }
            case 2: {
                printf("\nAlbero:\n");
                visita(radice);
                printf("\n\n");
                
                break;
            }
            case 3: {
                if(radice != NULL){
                    printf("\nInserisci il numero da cancellare:\t");
                    scanf("%d", &num);
                    radice->ptrsx=NULL;
                    radice->ptrdx=NULL;
                    eliminazione(radice, num);
                } else {
                    printf("\nLa lista e' vuota.\n");
                }
                
                break;
            }
        }
    }
}
Però qualsiasi numero io voglia cancellare (sia che esista, e sia che non esista), mi elimina sempre la radice, ovvero il primo valore che inserisco nell'albero..

Come mai?
Saetta93 è offline   Rispondi citando il messaggio o parte di esso
Old 03-03-2012, 22:16   #3
Varilion
Member
 
Iscritto dal: Oct 2005
Messaggi: 68
perchè setti
Codice:
radice->ptrsx=NULL;
radice->ptrdx=NULL;
prima di chiamare "eliminazione(radice,val)" ?
Varilion è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Questo robot impara a muovere le labbra ...
iPhone 17 annienta la concorrenza in Cin...
La nuova Xiaomi SU7 batte un record: 4.2...
È possibile copiare i qubit: dei ...
BYD alza ulteriormente l'asticella: batt...
Il nuovo razzo spaziale riutilizzabile c...
L'ex leader di Assassin's Creed porta Ub...
Il razzo spaziale NASA SLS e la capsula ...
Samsung Galaxy S26 Ultra: quattro colora...
AWS investe 1,2 miliardi in Italia. Coin...
La navicella cinese Shenzhou-20 con il f...
I piani Business ed Education di Google ...
Ceres-2 e Lunga Marcia 3B: la Cina falli...
Motorola edge 70 appena uscito e già in ...
ARC Raiders non si accontenta: nel 2026 ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:56.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v