2016-12-20 5 views
-1

Ich habe Probleme, Knoten in einer einfach verknüpften Liste zu tauschen. Mein Code funktioniert derzeit, wenn keiner der Knoten der Anfang der Liste ist.Tausche zwei Knoten in einer einfach verknüpften Liste aus

EDIT: Ich lerne über ADTs, also kann ich nicht ändern, was die Funktion eingibt und ausgibt.

typedef struct textbuffer *TB; 

struct textbuffer { 
    char *data; 
    TB next; 
}; 

void swapTB(TB tb, int pos1, int pos2) { 
    if (tb == NULL || pos1 == pos2) return; 
    int totalLines = linesTB(tb) - 1; 
    if (pos1 < FIRST_LINE || pos1 > totalLines || pos2 < FIRST_LINE || pos2 > totalLines) { 
     printf("Error: line number out of range, %d-%d.\n", FIRST_LINE, totalLines); 
     abort(); 
    } else { 
     TB all = tb; 
     int i = 0; 
     TB prevX = NULL; 
     TB currX = tb; 
     while (i != pos1) { 
      prevX = currX; 
      currX = currX->next; 
      i++; 
     } 

     int j = 0; 
     TB prevY = NULL; 
     TB currY = tb; 
     while (j != pos2) { 
      prevY = currY; 
      currY = currY->next; 
      j++; 
     } 

     if (prevX != NULL) { 
      prevX->next = currY; 
     } else { 
      all = currY; //update head of list 
     } 

     if (prevY != NULL) { 
      prevY->next = currX; 
     } else { 
      all = currX; //update head of list 
     } 

     TB temp = currY->next; 
     currY->next = currX->next; 
     currX->next = temp; 
    } 
    //return all; 
} 

Ich weiß, dass meine Art und Weise Knoten tauschen korrekt ist, weil, wenn ich ändern, um eine TB zurückkehren funktionieren (in diesem Fall alle), dann funktioniert es.

Meine Frage ist, wie mache ich es mit einer void-Funktion und ohne zu ändern, was die Funktion einnimmt? Ich denke ich brauche einen Kopfzeiger? Aber wie benutze ich das?

+1

Dieser Code sieht schrecklich kompliziert aus. Bitte geben Sie eine [mcve] an. –

+0

Ist 'TB' ein versteckter Zeiger? Ansonsten ist seine Sichtbarkeit/Reichweite auf die Funktion "swapTB" beschränkt. – LPs

+1

Fügen Sie diese Informationen in Ihren Post hinzu. – LPs

Antwort

0

Zwei Dinge tun: - übergebene Adresse Ihrer Struktur Textpuffer in einer Funktion.

Hohlraum swapTB (TB * TB int POS1, POS2 int)

in main(): -

swapTB (tb, POS1, POS2);

Und überprüfen Sie auch Ihre Currx und Curry NULL oder nicht.

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

TB head=NULL; 

void swapNodes(TB head_ref, int x, int y) 
{ 
    if (x == y) return; 
    head = head_ref; 

    struct node *prevX = NULL, *currX = head_ref; 
    while (currX && currX->data != x) 
    { 
     prevX = currX; 
     currX = currX->next; 
    } 

    struct node *prevY = NULL, *currY = head_ref; 
    while (currY && currY->data != y) 
    { 
     prevY = currY; 
     currY = currY->next; 
    } 

    if (currX == NULL || currY == NULL) 
     return; 

    if (prevX != NULL) 
     prevX->next = currY; 
    else 
     head = currY; 

    if (prevY != NULL) 
     prevY->next = currX; 
    else 
     head = currX; 

    struct node *temp = currY->next; 
    currY->next = currX->next; 
    currX->next = temp; 

} 

int main() 
{ 
    TB start=NULL; 
    // Create linked list here 

    swapNodes(start, pos1, pos2); 

    print_linkedlist(head); // print the linked list after swap 

    return 0; 
} 
+0

'TB ** tb' ->' TB * tb' ... ein Beispiel warum ist besser zu vermeiden, Verstecke mit typedef – LPs

+0

@LPs Ich übergeben Adresse des Zeigers und wie ich weiß, wir brauchen Doppel-Zeiger zu halten Adresse des einzelnen Zeigers, wie ich OP empfohlen habe, um die Adresse eines einzelnen Zeigers zu übergeben. –

+0

'typedef struct textbuffer * TB;' ....... – LPs

Verwandte Themen