2013-07-09 16 views
5

Sto provando a scambiare gli indirizzi di due nodi adiacenti in un elenco collegato. Ho provato a scambiare i loro valori, usando una variabile int temp e funziona perfettamente bene. Ma ora, voglio scambiare due indirizzi con i puntatori. Sfortunatamente, ha creato un ciclo infinito all'interno del mio ciclo while. Ecco il mio frammento di codice:Confusione sui puntatori C (Elenco collegato)

Utilizzando int: // funzionato perfettamente bene

node* swapNumbers(node* head, int data){ 
    int temp; 
    node *cursor = head; 

    while(cursor!=NULL){ 
     if(cursor->data == data){ 
      temp = cursor->data; 
      cursor->data = cursor->next->data; 
      cursor->next->data = temp; 
      //printf("1: %d\n", cursor->data); 
      //printf("2: %d\n", cursor->next->data); 

      return cursor;  
     } 
     cursor = cursor->next; 
    } 
    return NULL; 
} 

Utilizzando gli indirizzi: // Questo ha creato un ciclo infinito!

node* swapNumbers(node* head, int data){ 
    node *temp = NULL; 
    node *cursor = head; 

    while(cursor!=NULL){ 
     if(cursor->data == data){ 
      temp = cursor; 
      cursor = cursor->next; 
      cursor->next = temp; 
     return cursor;  
     } 
     cursor = cursor->next; 
    } 
    return NULL; 
} 

mia typedef struct contiene quanto segue:

typedef struct node 
{ 
    int data; 
    struct node* next; 
} node; 

Sono nuovo di C e puntatori sono ancora mi confondo. Qualsiasi aiuto sarà apprezzato!

+3

Disegna un diagramma: crea riquadri con linee e frecce che rappresentano i puntatori successivi. Al fine di invertire due nodi in un elenco collegato, è necessario modificare il puntatore nel nodo * precedente * (o la testata dell'elenco se nessun nodo precedente), nonché i due nodi scambiati. –

+1

si trova la risposta qui: [Scambia i nodi in un elenco collegato singolarmente] (http: // stackoverflow.it/questions/15315914/swap-nodes-in-a-singly-linked-list/15316061 # 15316061) –

risposta

1

Per non entrare in un ciclo infinito, è necessario salvare il valore predecessore di cursor in un valore temporaneo puntato da un altro puntatore.

0

Ci sono tre casi che devi gestire nel tuo codice.

  1. Se il nodo dati è Primo nodo. Devi cambiare il puntatore della testa. Mentre passi solo il puntatore non puoi cambiare la testa è il secondo elemento.

  2. Se il nodo dati è l'ultimo nodo. Non puoi scambiare.

  3. Se il nodo di dati è il nodo centrale. Hai richiesto il cursore precedente, quindi puoi puntarlo sul nodo corretto. Si supponga se avete nodo prev

    if(cursor->data == data) 
        { 
         temp = cursor; 
         cursor = cursor->next; 
         if (NULL == cursor) 
          return NULL; 
         temp->next = cursor->next; 
         prev->next = cursor. 
         cursor->next = temp; 
         return cursor;  
        } 
    
+0

Hai un "." invece di un ";" alla fine di una riga – Alexis

0

Posso suggerire un approccio semplice per scambiare due nodi in una lista concatenata?

/* p points to the node before a, a and b are the nodes to be swapped */ 
void swap_address(node* p, node* a, node* b) 
{ 
    node* n = b->next; /* save the address of the node after b */ 

    if (!p || !a || !b) 
    { 
     printf("One of the arguments is NULL!\n"); 
     return; 
    } 

    p->next = b; /* p points to b */ 
    b->next = a; /* b points to a */ 
    a->next = n; /* a points to the node that was originally after b */ 
} 

Sulla mia macchina ho provato con la seguente definizione struct:

typedef struct node 
{ 
    struct node* next; 
    int val; 
} node; 

E ho usato in questo modo:

swap_address(b, c, d); 

ho avuto nodi head ->a ->b ->c ->d che aveva i valori 1, 2, 3 e 4 in questo ordine.

Dopo lo scambio l'ordine cambiato a 1 -> 2 -> 4 -> 3.

E 'questo quello che cercate?

+0

Si noti che questo non è C89 valido e richiede C99 + per funzionare. Hai una dichiarazione dopo una dichiarazione. – Jite

+0

@Jite Non mi ero reso conto che questo fosse un requisito ma abbastanza equo, ho spostato la dichiarazione all'inizio del blocco. – Nobilis