Cancellare nodo casuale lista

di il
1 risposte

Cancellare nodo casuale lista

Raga ho scritto un algoritmo per cancellare un nodo casuale dalla mia lista la logica l'ho capita benissimo con un puntatore punto all'elemento prima da cancellare mi sposto in avanti di 1 nodo con il puntatore"originale" e collego quello "fake" a quello originale ma non mi funziona vi posto il sorgente :

// inizio è la mia lista e num è un numero che precedentemente è stato generato casualmente tra i possibili contando i nodi della lista
struct nodo *cancella_nodo(struct nodo*inizio,int num)
{
int i=0;
    struct nodo *old;
    old=inizio;
    if((num==0)&&conta_nodi(inizio)==1)// c'è un solo elemento e si deve anche cancellare
    {
        
    inizio=(struct nodo*)malloc(sizeof(struct nodo));//nuova lista
        printf("hai perso tutti gli oggetti magici\n");
        return inizio;}
    for(i=0;i<num;i++)//uso il for perchè so già quante volte ripetere il ciclo
        inizio=inizio->next;
    old=inizio->next;
    inizio=inizio->next;
    old=inizio;
    return old;
}



1 Risposte

  • Re: Cancellare nodo casuale lista

    La logica non è proprio quella che tu dici perchè
    se hai un solo elemento come fai a puntare il precedente ?
    se invece hai tre elementi e vuoi cancellare il secondo elemento
    se punti il primo e cancelli il secondo in una botta sola avresti eliminato sia il secondo che il terzo cosa che tu non avresti voluto o sbaglio?
    in questo caso si procede nel seguente modo:
    punti l'elemento che vuoi cancellare ti conservi il nodo successivo
    carichi il nodo precedente a quello che vuoi cancellare e modifichi il puntatore successivo facendolo puntare a quello che ti eri conservato.
    questo nel caso che il tuo nodo sia una lista ad un solo link mentre se stai parlando di un albero binario basta che fai puntare il ramo che vuoi cancellare a zero e poi deallochi tutti i record a partire dal record che vuoi cancellare fino a che non trovi l'ultimo record di quel ramo.
    comunque guarda lo sche e capirai meglio.
    struttura a singolo link
    ------------------------------------------
    ! informazione ! record successivo !
    ------------------------------------------
    1 2 3
    ------------ ------------ -----------
    ! abc ! 2 ! ! def ! 3 ! ! ghi ! 0 !
    ------------ ------------- ------------
    adesso se voglio cancellare record 1
    cancello fisicamente il record e lasci gli altri invariati
    se voglio cancellare il record 2 faccio

    ------------ -----------
    ! abc ! 3 ! ! ghi ! 0 !
    ------------ ------------
    dopo ciò cancello il record 2 fisicamente

    congli alberi binari e più complesso perchè
    abcde
    3 2
    lgftra kljmn
    4 6 7 5
    adesso se voglio cancellare il recod 3 dovr0 cancellare tutti i suoi sottorami quindi la cosa più semplice è porre 0 al posto del 3 ed andare a deallocare tutti i suoi sotto rami.

    ti consiglio di andarti a rivedere un pò la teoria
Devi accedere o registrarti per scrivere nel forum
1 risposte