Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C] Eliminare un nodo

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    7

    Eliminare un nodo [C]

    Salve a tutti.

    Ho questo codice che crea una lista dinamica di int e la visualizza.

    Volendo eliminare un numero dalla lista, come posso fare? Devo fare in modo da poter indirizzare il puntatore del nodo precedente a quello successivo al nodo da eliminare e poi facendo un free(puntatore).

    Solo non riesco a far passare l'indirizzo a cui puntare al nodo precedente

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void crealista();
    void visualizzalista();
    
    struct elenco {
       int numero;
       struct elenco *pun;
       };
    
    int i,n;
    struct elenco *p,*paux;
    
    main()
    {
       crealista();
       visualizzalista();
    }
    
    void crealista()
    {
       printf("Quanti numeri vuoi inserire nella lista? ");
       scanf("%i",&n);
    
       if (n==0)
          p = NULL;
       else
       {
            p = (struct elenco *)malloc(sizeof(struct elenco));
          printf("\nInserisci il valore: ");
          scanf("%i",&p->numero);
          paux = p;
          for (i=1;i<=n-1;i++)
          {
             paux->pun = (struct elenco *)malloc(sizeof(struct elenco));
             paux = paux->pun;
             printf("\nInserisci il valore: ");
                  scanf("%i",&paux->numero);
                  if (i==n-1)
                    paux->pun = NULL;
          }
       }
    }
    
    void visualizzalista()
    {
       system("cls");
       paux = p;
       while (paux != NULL)
       {
          printf("%i\n",paux->numero);
          paux = paux->pun;
       }
    }
    Grazie mille per eventuali consigli

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    codice:
    lista elimina(lista l, tipo_dato dato)
    {
       if (lista == NULL)
          return NULL;
       else if (lista->info == dato)
       {
          lista temp = lista;
          lista = lista->next;
          free(temp);
       }
       else
           lista->next = elimina(lista->next, dato);
       return lista;
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    7
    praticamente tu usi un puntatore ausiliario che prende l'indirizzo del nodo contenente il dato da eliminare, poi il puntatore che scorre lo sposti al successivo e elimini il nodo puntato dal puntatore ausiliario?

    Non ho provato ancora ma sei sicuro che funzioni?

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    7
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void crealista();
    void visualizzalista();
    void eliminanumero();
    
    struct elenco {
       int numero;
       struct elenco *pun;
       };
    
    int i,n;
    struct elenco *p,*paux, *paux2;
    
    main()
    {
       crealista();
       visualizzalista();
       eliminanumero();
       visualizzalista();
    }
    
    void crealista()
    {
       printf("Quanti numeri vuoi inserire nella lista? ");
       scanf("%i",&n);
    
       if (n==0)
          p = NULL;
       else
       {
            p = (struct elenco *)malloc(sizeof(struct elenco));
          printf("\nInserisci il valore: ");
          scanf("%i",&p->numero);
          paux = p;
          for (i=1;i<=n-1;i++)
          {
             paux->pun = (struct elenco *)malloc(sizeof(struct elenco));
             paux = paux->pun;
             printf("\nInserisci il valore: ");
                  scanf("%i",&paux->numero);
                  if (i==n-1)
                    paux->pun = NULL;
          }
       }
    }
    
    void visualizzalista()
    {
       system("cls");
       paux = p;
       while (paux != NULL)
       {
          printf("%i\n",paux->numero);
          paux = paux->pun;
       }
    } 
    
    void eliminanumero()
    {
    	int dato;
    	printf("Che numero vuoi eliminare? ");
    	scanf("%i",&dato);
    	paux = p;
            while (paux != NULL)
            {
                if (paux->numero == dato)
    	    {
    		paux2 = paux;
                    paux = paux->pun;
    		free(paux2);
    	    }
    	paux = paux->pun;
            }
    }
    modificato il codice così ma non funziona e in effetti dubito abbia molto senso

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    non avevo fatto caso al fatto che usassi variabili globali... allora la versione che ho fatto io (ricorsiva) non va bene...

    codice:
    void eliminanumero()
    {
            int dato;
            printf("Che numero vuoi eliminare? ");
            scanf("%i",&dato);
            paux = p;
            if (paux)
                while (paux->pun != NULL)
                {
                      if (paux->pun->numero == dato)
                      {
                         paux2 = paux->pun;
                         paux->pun = paux->pun->pun;
                         free(paux2);
                         break;
                      }
                      paux = paux->pun;
                }
    }
    dovrebbe funzionare...

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    7
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void crealista();
    void visualizzalista();
    void eliminanumero();
    
    struct elenco {
       int numero;
       struct elenco *pun;
       };
    
    int i,n;
    struct elenco *p,*paux, *paux2;
    
    main()
    {
       char risp;
    	
       crealista();
       visualizzalista();
    }
    
    void crealista()
    {
       printf("Quanti numeri vuoi inserire nella lista? ");
       scanf("%i",&n);
    
       if (n==0)
          p = NULL;
       else
       {
            p = (struct elenco *)malloc(sizeof(struct elenco));
          printf("\nInserisci il valore: ");
          scanf("%i",&p->numero);
          paux = p;
          for (i=1;i<=n-1;i++)
          {
             paux->pun = (struct elenco *)malloc(sizeof(struct elenco));
             paux = paux->pun;
             printf("\nInserisci il valore: ");
                  scanf("%i",&paux->numero);
                  if (i==n-1)
                    paux->pun = NULL;
          }
       }
    }
    
    void visualizzalista()
    {
       char risp;
    	
       system("cls");
       paux = p;
       while (paux != NULL)
       { 
          printf("%i\n",paux->numero);
          paux = paux->pun;
       }
       printf("\n\nVuoi eliminare un numero? (s/n): ");
       scanf("%1s",&risp);
       switch (risp) { 
    	case 's': eliminanumero();
    	break;
    	case 'n': exit(0);
    	break;
    	default:
    	printf("\n%i",risp);
    	printf("\n\nIl tasto scelto non permette azioni! Il programma viene terminato");
    	exit(0);
    }
    } 
    
    void eliminanumero()
    {
            int dato;
            printf("Che numero vuoi eliminare? ");
            scanf("%i",&dato);
            paux = p;
                while (paux->pun != NULL)
                {
                      if (paux->pun->numero == dato || paux->numero == dato)
                      {
                         paux2 = paux->pun;
                         paux->pun = paux->pun->pun;
                         free(paux2);
                         break;
                      }
                    paux = paux->pun;
                }
    visualizzalista();
    }
    questo il codice completo, elimina eventuali numeri e tutto ok.

    Il problema pero', come avevo giustamente pensato vedendo il codice sopra, é che il primo numero della lista non viene eliminato

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    7
    allora, ho riscritto daccapo la routine di cancellazione di un numero dalla lista e funziona bene, c'è solo un problema: perché se inserisco un numero da cancellare che non è in elenco il programma crasha?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void crealista();
    void visualizzalista();
    void eliminanumero();
    
    struct elenco {
       int numero;
       struct elenco *pun;
       };
    
    int i,n;
    struct elenco *p,*paux, *paux2;
    
    main()
    {
       char risp;
    	
       crealista();
       visualizzalista();
    }
    
    void crealista()
    {
       printf("Quanti numeri vuoi inserire nella lista? ");
       scanf("%i",&n);
    
       if (n==0)
          p = NULL;
       else
       {
            p = (struct elenco *)malloc(sizeof(struct elenco));
          printf("\nInserisci il valore: ");
          scanf("%i",&p->numero);
          paux = p;
          for (i=1;i<=n-1;i++)
          {
             paux->pun = (struct elenco *)malloc(sizeof(struct elenco));
             paux = paux->pun;
             printf("\nInserisci il valore: ");
                  scanf("%i",&paux->numero);
                  if (i==n-1)
                    paux->pun = NULL;
          }
       }
    }
    
    void visualizzalista()
    {
       char risp;
    	
       system("cls");
       paux = p;
       while (paux != NULL)
       { 
          printf("%i\n",paux->numero);
          paux = paux->pun;
       }
       printf("\n\nVuoi eliminare un numero? (s/n): ");
       scanf("%1s",&risp);
       switch (risp) { 
    	case 's': eliminanumero();
    	break;
    	case 'n': exit(0);
    	break;
    	default:
    	printf("\n%i",risp);
    	printf("\n\nIl tasto scelto non permette azioni! Il programma viene terminato");
    	exit(0);
    }
    } 
    
    void eliminanumero()
    {
            int dato;
            printf("Che numero vuoi eliminare? ");
            scanf("%i",&dato);
            paux = p;
                while (paux != NULL)
    	    {
    		    if (paux == p && paux->numero == dato)
    		    {
    			    p = paux->pun;
    			    free(paux);
    			    break;
    		    }
    		    else if (paux->pun->numero == dato)
    		    {
    			    paux->pun = paux->pun->pun;
    			    paux2 = paux->pun;
    			    free(paux2);
    			    break;
    		    }
    		    paux = paux->pun;
    	    }
    visualizzalista();
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    codice:
    void eliminanumero()
    {
            int dato;
            printf("Che numero vuoi eliminare? ");
            scanf("%i",&dato);
            paux = p;
                while (paux != NULL)
    	    {
    		    if (paux == p && paux->numero == dato)
    		    {
    			    p = paux->pun;
    			    free(paux);
    			    break;
    		    }
    		    else if (paux->pun->numero == dato)
    		    {
    			    paux2 = paux->pun; /* Ho invertito queste due linee */
    			    paux->pun = paux->pun->pun;
    			    free(paux2);
    			    break;
    		    }
    		    paux = paux->pun;
    	    }
    visualizzalista();
    }
    il problema che vedevo era nell'eliminazione...

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 © 2024 vBulletin Solutions, Inc. All rights reserved.