Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C]: cancellazione elemento lista lineare

    Salve,
    vi riporto il seguente codice:
    codice:
    void cancella(struct elemento *p,int n) {
        struct elemento *paus;
        printf("\n\n\t\tEliminazione occorrenze del \"%d\"....\n",n);
        paus = p;
        while(p!=NULL) {
            if(p->inf==n) { 
                paus->pun = p->pun;
                free(p);
                p = (struct elemento*)malloc(sizeof(struct elemento));
                p = paus;
            } 
            paus = p;
            p = p->pun;
        }
    }
    Questa routine funziona, eleminia tutit gli elementi corrispondenti a n, ma se è il primo elemento a corrispondere a n, non lo cancella ma gli assegna il valore di 0. Perchè?
    Grazie in anticipo

  2. #2
    Posta la struct elemento

    MrC

  3. #3
    codice:
    p = (struct elemento*)malloc(sizeof(struct elemento));
    p = paus;
    Mi dici quale spirito maligno ti ha condotto a tutto cio`? :tongue:

  4. #4
    codice:
    struct elemento {
        int inf;
        struct elemento *pun;
    } *crea_lista(void);

  5. #5
    r0x: che ha di maligno?
    Cancella quell'elemento, e lo ricrea però con l'indirizzo dell'elemento precedente.

  6. #6
    Vediamo un po' che hai scritto...
    codice:
    void cancella(struct elemento *p,int n) 
    /*questa funzione immagino prenda l'inizio della lista ed il 
    valore da cancellare...*/
    {
        struct elemento *paus;
        printf("\n\n\t\tEliminazione occorrenze del \"%d\"....\n",n);
        paus = p;
        while(p!=NULL) {
            if(p->inf==n) { /*se p contiene il numero da cancellare..*/ 
                paus->pun = p->pun;
    
                free(p);
                
                p = (struct elemento*)malloc(sizeof(struct elemento));
                /*Qui non hai bisogno del cast esplicito*/
    
                p = paus;
                /*In questo butti lo spazio appena allocato!!!!
                A cosa ti serve l'allocazione se devi eliminare dei 
                nodi??*/
    
    
            } 
            paus = p;
            p = p->pun;
        }
    }
    È strano che non ottieni un bel segmentation fault!!

    Nel caso in cui il primo della lista sia da eliminare, con questo
    codice fai:

    punti paus e p entrambi allo spazio da eliminare
    lo elimini tramite p
    fai di nuovo puntare p allo spazio a cui non puoi accedere


    E' un errore grave!


    Inoltre in questo codice, a parte altri errori, c'e' un altro grosso errore di fondo.
    Tu dai alla funzione il puntatore allo spazio del primo nodo,
    ma se questo poi verra' deallocato, non hai alcun modo di avvertire fuori dalla tua funzione, che l'inizio della lista
    e' cambiato!!!!!


    Per questo hai due soluzioni:
    1-soluzione semplice) Mantieni in una variabile globale il puntatore
    all'inizio della lista; cosi non lo devi neanche passare alla funzione
    e lo puoi sovrascrivere quando ti serve..

    2-un po' piu' complessa) passi alla variabile il puntatore al puntatore del primo nodo :quipy:


    E cmq il codice lo devi riscrivere

    Ciau

    MrC

  7. #7
    Originariamente inviato da Gmalex

    p = (struct elemento*)malloc(sizeof(struct elemento));
    p = paus;


    Cancella quell'elemento, e lo ricrea però con l'indirizzo dell'elemento precedente.
    Manco per niente!
    Cancella l'elemento, (quel free che stava piu' su) (levandogli lo spaizo allocato)

    e crea un altro spazio che fa puntare da p che, attenzione, sara' diverso da quello di prima!!!!

    e poi con:
    p = paus;

    lo perdi (perche' perdi il puntatore)...

    fai diversi errori di concetto..


    MrC

  8. #8
    Non ho capito niente °_°

  9. #9
    me li cancella gli elementi, solo il primo (se è lui) non mi cancella e me lo assegna 0.

  10. #10
    cmq, + tardi, quando sarò meno fuso provo a rileggermi la tua risposta!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.