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

    [C] Lista concatenata

    Ciao a tutti.
    Devo fare una funzione per eliminare un elemento in fondo alla lista, ma non ci riesco.

    Praticamente io ho una struttura di questo tipo:

    codice:
    typedef struct nodo{
    	int dato;
    	struct nodo* next;
    }nodo;
    Io scorro tutta la lista fino ad arrivare all'ultimo elemento, cioè alla struct che ha next=NULL.

    Uso la funzione free per liberare la memoria, ma non so come assegnare al campo del penultimo elemento (next).

    Questo è quello che sono riuscito a fare:

    codice:
    void cancInFondo(nodo *lista)
    {
    	if(lista!=NULL)
    	{
    		while(lista->next!=NULL)
    			lista = lista->next;
    		free(lista);
    		*lista=NULL;
    	}
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2009
    Messaggi
    7
    Dovresti richiedere lo spazio in memoria con un'istruzione del tipo:

    nuovo* = (nodo*) malloc(sizeof(nodo));

    per poi inserire il dato che ti serve e linkarlo al puntatore dell'ultimo elemento della lista.

    free devi utilizzarlo solo dopo che hai eliminato un elemento per liberare lo spazio che era occupato

  3. #3
    Originariamente inviato da dave87
    Dovresti richiedere lo spazio in memoria con un'istruzione del tipo:

    nuovo* = (nodo*) malloc(sizeof(nodo));

    per poi inserire il dato che ti serve e linkarlo al puntatore dell'ultimo elemento della lista.

    free devi utilizzarlo solo dopo che hai eliminato un elemento per liberare lo spazio che era occupato
    Ma io non devo riallocare una struttura, voglio solo che la penultima abbia il campo next che punti a NULL(e non che punti ad un'altra struttura) e non so come farlo...

  4. #4
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    se fai una free prima di *lista = null ti darà segmentation fault (ma già il compilatore dovrebbe dirtelo se è serio con un warning)

    devi fare una if dentro il while.. se lista->next->next è null allora lista è il penultimo.. deallochi l'ultimo e poni lista->next a null

  5. #5
    Originariamente inviato da Stoicenko
    se fai una free prima di *lista = null ti darà segmentation fault (ma già il compilatore dovrebbe dirtelo se è serio con un warning)

    devi fare una if dentro il while.. se lista->next->next è null allora lista è il penultimo.. deallochi l'ultimo e poni lista->next a null
    Ci avevo pensato anche io, ma non rischio di "sforare" fancendo lista->next->next se lista->next è null? Perchè così vado avanti di 2 e non posso sapere se è null

  6. #6
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    metti un controllo doppio nell'if..e cmq non puoi sforare.. se cicli la lista dall'inizio mi spieghi come fai? l'unico momentpo è quando hai 2 elementi.. ma puoi benissimo usarlo come caso base prima di ciclare con while

  7. #7
    Io ho fatto questo

    codice:
    void cancInFondo(nodo **lista)
    {
    	nodo *temp = *lista;
    	if(lista!=NULL)
    	{
    		if(*lista->next == NULL)
    			*lista = NULL;
    		else
    		{
    		   while(temp->next!=NULL && temp->next->next!=NULL)
    			   temp = temp->next;
    		   free(temp->next);
    		   temp->next = NULL;
    		}
    	}
    }
    Ho trattato come caso base 1 elemento.

  8. #8
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ciao . . . Quello che dovresti fare è soltanto ottenere un puntatore al penultimo nodo cosí potrai sia deallocare l' ultimo nodo, sia aggiornare la lista (e va fatto in quest' ordine) . . .
    codice:
     
    void cancInFondo( nodo** lista )
    {
    nodo* newLastNode, *currNode;
    if( *lista )
    {
     currNode = *lista;
     if( currNode->next )
     {
      while( currNode->next )
      {
       newLastNode = currNode;
       currNode = currNode->next;
      }
      free(newLastNode->next);
      newLastNode->next = NULL;
     }
     else
     {
      free(*lista);
      *lista = NULL;
     }
    }
    }
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

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.