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

    [C++] Lista concatenata, scambio di nodi

    Ho pensato a questa funzione per scambiare due nodi, ho considerato il caso in cui il nodo da scambiare è in testa e in coda:

    codice:
    void swap(pNodo &lista)
    {
         if(lista->next != 0){
             pNodo tmp = lista->next;
             lista->next = tmp->next;
             tmp->next = lista;
             lista = tmp;
             //delete tmp;
             }
         else{
              pNodo tmp = lista->next;
              tmp->next = lista;
              lista->next = 0;
              lista = tmp;
              //delete tmp;
              }
    }
    come vedete ho "annullato" "delete tmp", così lo scambio funziona, ma se ho capito bene mi ritroverei due puntatori che puntano all'elemento in testa (nel caso in cui lo scambio avviene tra i due puntatori in testa), così elimino tmp che mi serviva temporaneamente per lo scambio, ma quando vado a stampare la lista ecco cosa succede:

    codice:
      Inserisci elementi:
     4
     6
     1
     4
     9
     7
     5
     7
     0
      Elemento: 7 - Posizione: 8
      Elemento: 5 - Posizione: 7
      Elemento: 7 - Posizione: 6
      Elemento: 9 - Posizione: 5
      Elemento: 4 - Posizione: 4
      Elemento: 1 - Posizione: 3
      Elemento: 6 - Posizione: 2
      Elemento: 4 - Posizione: 1
    
      Elemento: 10490208 - Posizione: 10489888
      Elemento: 7 - Posizione: 8
      Elemento: 7 - Posizione: 6
      Elemento: 9 - Posizione: 5
      Elemento: 4 - Posizione: 4
      Elemento: 1 - Posizione: 3
      Elemento: 6 - Posizione: 2
      Elemento: 4 - Posizione: 1
    lo scambio lo fa, ho controllato anche passo la procedura stampando passo passo gli elementi a cui puntano i puntatori, però succede questo quando stampo la lista ed elimino "tmp"...

  2. #2
    Se fai delete tmp elimini l'elemento a cui punta lista...
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    "lista = tmp;" così non lo salvo?

  4. #4
    Stai solo copiando un puntatore... se elimini ciò a cui punta tmp, ovviamente elimini ciò a cui punta lista, visto che entrambi puntano alla stessa cosa.
    Secondo me tra l'altro è una pessima idea usare il typedef pNodo, visto che ti nasconde il fatto che quelle variabili sono solo dei puntatori ad un nodo allocato altrove.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Quindi se faccio "delete tmp" elimino il nodo a cui punta, non il puntatore, giusto?
    Invece che definire un tipo puntatore che punta ad una struct di tipo nodo, potrei dichiarare così la lista?

    codice:
    typedef struct nodo
    {
           int elem;
           nodo *next;
    } lista;

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.