[C] scambio 2 elementi in una lista

di il
10 risposte

[C] scambio 2 elementi in una lista

Ciao a tutti,
sto provando a scambiare 2 elementi di una lista ma non riesco a capire dove sbaglio, premetto che sono le prime volte!
vi posto il codice che ho prodotto:

typedef struct array *link;
struct array {
  int key;
  link next;
  link prev;
};
void swap(link a, link b) { 
     link an=a->next;
     link ap=a->prev;
     link bn=b->next;
     link bp=b->prev;
     link tmp;
     if (b!=NULL) {
     if (a->prev==NULL){
     b->prev=NULL;
     a->prev=an;
     b->next=a;
     a->next=bn;
     bn->prev=a;
     }
     else
     {
     b->prev=ap;
     b->next=a;
     a->prev=b;
     a->next=bn;
     bn->prev=a;
     }
     }
}
Naturalmente ho altre funzioni per creare e inserire nodi nella lista, ma il problema deve essere nello swap!
Grazie a tutti!

10 Risposte

  • Re: [C] scambio 2 elementi in una lista

    Ciao violalbi91,
    ti sei dimenticato di usare tmp, per fare lo swap devi usarlo.
  • Re: [C] scambio 2 elementi in una lista

    Hai ragione ma non so come usarlo!!cioè devo creare un nodo tmp che uguaglio a B e poi lo collego ad A??
  • Re: [C] scambio 2 elementi in una lista

    Quando scambi due elementi, diciamo due interi a e b devi fare:
    
    int tmp = a;
    a = b;
    b = tmp;
    
    Lo stesso vale per i nodi, prima copi un nodo in temp, poi lo sovrascivi con b, e poi metti in b il tmp.
  • Re: [C] scambio 2 elementi in una lista

    Non riesco proprio a farlo funzionare!!
  • Re: [C] scambio 2 elementi in una lista

    Se devi scambiare due nodi dentro una lista ti basta scambiare il dato contenuto nei nodi (nel tuo caso il campo key), non è necessario scambiare tutti i puntatori. In pratica i nodi rimangono al loro posto e i contenuti si scambiano.
    
    struct Node 
    {
    	int key;
    	Node* next;
    	Node* prev;
    };
    
    void Swap(Node* a, Node* b)
    {
    	// tralascio la gestione dei NULL per semplicità 
    	int tmp = a->key; 
    	a->key = b->key;
    	b->key = tmp;
    }
    
    Poi esiste il caso in cui lo scambio dei dati sia molto oneroso (complesse strutture dati, ma bastano anche semplici stringhe), in questo caso conviene scambiare i puntatori.
  • Re: [C] scambio 2 elementi in una lista

    Ti ringrazio per la risposta finalmente il mio programma comincia un pò a funzionare, per curiosità e per imparare mi potresti far vedere lo swap dei nodi??perchè ci sto diventando pazzo non riesco a farlo funzionare!!Grazie mille!!
  • Re: [C] scambio 2 elementi in una lista

    Et voilà:
    
    void Swap(Node* a, Node* b)
    {
    	// tralascio la gestione dei NULL per semplicità 
    	Node* tmpPrev = a->prev; 
    	Node* tmpNext = a->next; 
    
    	a->prev = b->prev;
    	a->next = b->next;
    
    	b->prev = tmpPrev;
    	b->next = tmpNext;
    }
    
  • Re: [C] scambio 2 elementi in una lista

    Grazie mille ora forse ci sono, l'unica cosa è che facendo cosi mi toglie dalla lista il B!!!!non capisco perchè!!!!
  • Re: [C] scambio 2 elementi in una lista

    Che ti devo dire, controlla bene il codice e fa qualche giro col debugger (la ricerca degli errori è una abilità da sviluppare) se non lo trovi posta il codice.
  • Re: [C] scambio 2 elementi in una lista

    Ho risolto grazie mille dell'aiuto!!
Devi accedere o registrarti per scrivere nel forum
10 risposte