Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    178

    [C] Eliminare un nodo dalla lista

    Ciao a tutti.

    Ho fatto un programma che visualizza una lista di numeri casuali compresi tra 0 e 9. Ora devo fare in modo che l'utente possa eliminare a suo piacimento un elemento della lista. Ad esempio se ho la seguente lista:

    3--> 4--> 1--> 8--> 0--> 0--> NULL

    Mettiamo che l'utente voglia eliminare gli 0. Allora inserisce il valore 0 e la lista deve diventare:

    3--> 4--> 1--> 8--> NULL

    Il problema è che il programma non mi visualizza il risultato della lista modificata. Il codice che dovrebbe eliminare il nodo è questo:
    codice:
      while( startPtr != NULL) {
    
             ListNodePtr tempPtr;
    
    
             if( elimina == startPtr->data) {
                 tempPtr = startPtr;
                 startPtr = startPtr->nextPtr;
                 free(tempPtr);
             } else {
                 startPtr = startPtr->nextPtr;
             }
    
    
         }
    elimina è il valore inserito dall'utente. Il ragionamento è questo:

    se elimina è uguale al numero del nodo allora tampPtr (puntatore al nodo temporaneo) tempPtr = startPtr e startPtr->nextPtr avanza di nodo. Poi libera la memoria con la funzione free. In caso contrario fai avanzare startPtr al prossimo nodo.

    Ragazzi gentilmente dove ho sbagliato ?

    Grazie
    Ultima modifica di Bombonera; 12-08-2014 a 11:00

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Il nodo prima di quello che elimini punta ancora il nodo eliminato, che non esiste più.
    Tieni anche conto che la testa della lista ha bisogno di un trattamento speciale.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    178
    posto il programma intero:

    codice:
    // inserimento lista ed eliminazione
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    
    struct listNode {
    
    
        int info;
        struct listNode *nextPtr;
    };
    
    
    typedef struct listNode ListNode;
    typedef ListNode *ListNodePtr;
    
    
    void inserimento( ListNodePtr *topPtr );
    void stampa( ListNodePtr topPtr );
    void elimina( ListNodePtr *topPtr );
    
    
    int main( void ) {
    
    
        ListNodePtr startPtr = NULL;
    
    
        inserimento( &startPtr );
        stampa( startPtr );
        elimina( &startPtr );
        stampa( startPtr );
    }
    
    
    void elimina( ListNodePtr *topPtr ) {
    
    
        ListNodePtr currentPtr;
        ListNodePtr tempPtr;
        int x;
    
    
        currentPtr = *topPtr;
    
    
        printf("Inserisci elemento da eliminare\n");
        scanf("%d", &x);
    
    
        while( currentPtr != NULL ) {
    
    
            if(currentPtr->info == x ) {
    
    
                tempPtr = currentPtr;
                currentPtr = currentPtr->nextPtr;
                free(tempPtr);
            } else {
    
    
                currentPtr = currentPtr->nextPtr;
            }
        }
    }
    
    
    void stampa( ListNodePtr topPtr) {
    
    
        ListNodePtr currentPtr;
        currentPtr = topPtr;
    
    
        while( currentPtr != NULL ) {
    
    
            printf("%d--> ", currentPtr->info);
            currentPtr = currentPtr->nextPtr;
        }
        printf("NULL\n");
    }
    
    
    void inserimento( ListNodePtr *topPtr ) {
    
    
        ListNodePtr newPtr;
        int n, i, a;
    
    
        printf("Inserisci numero volte\n");
        scanf("%d", &n);
    
    
        for(i = 0; i < n; i++) {
    
    
        printf("Inserisci valore\n");
        scanf("%d", &a);
    
    
        newPtr = malloc( sizeof( ListNode ) );
        newPtr->info = a;
        newPtr->nextPtr = *topPtr;
        *topPtr = newPtr;
        }
    
    
        return;
    }
    Ultima modifica di Bombonera; 19-08-2014 a 12:37

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    178
    Nella funzione elimina, currentPtr prende l'indirizzo del primo elemento. L'utente inserisce il valore da eliminare. Vai avanti finché currentPtr != NULL. Se il valore inserito dall'utente corrisponde a uno di quello dei nodi allora elimina nodo. Il problema è che mi visualizza una lista infinita.
    Ultima modifica di Bombonera; 19-08-2014 a 12:38

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    178
    dove ho sbagliato ?

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Ma se hai una lista del tipo 1->2->1->3->NULL e in elimina inserisci 1 dovrebbe risultare 2->1->3->NULL o 2->3->NULL
    Comunque il problema resta quello che ti ho esposto prima.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    178
    2->3->NULL

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    178
    Comunque il problema resta quello che ti ho esposto prima.
    Scusami, puoi spiegare meglio ?.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    178
    mi stai dicendo che il nodo nextPtr precedente di quello che è stato eliminato punta ancora al nodo eliminato ?

    Se è cosi come si potrebbe fare ?

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    178
    ho modificato la funzione elimina in questo modo:

    codice:
    void elimina( ListNodePtr *topPtr ) {
    
    
         ListNodePtr previousPtr;
         ListNodePtr currentPtr;
         ListNodePtr tempPtr;
    
    
         int x;
    
    
         printf("Inserisci valore da eliminare\n");
         scanf("%d", &x);
    
    
         if( x == (*topPtr)->info) {
    
    
             tempPtr = *topPtr;
             *topPtr = (*topPtr)->nextPtr;
             free(tempPtr);
         } else {
    
    
             previousPtr = *topPtr;
             currentPtr = (*topPtr)->nextPtr;
    
    
             while( currentPtr != NULL && currentPtr->info != x) {
    
    
                 previousPtr = currentPtr;
                 currentPtr = currentPtr->nextPtr;
             }
                     tempPtr = currentPtr;
                     previousPtr->nextPtr = currentPtr->nextPtr;
                     free(tempPtr);
    
    
         }
    
    
    }
    devo dire che funziona.

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.