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?
Dieser Code sieht schrecklich kompliziert aus. Bitte geben Sie eine [mcve] an. –
Ist 'TB' ein versteckter Zeiger? Ansonsten ist seine Sichtbarkeit/Reichweite auf die Funktion "swapTB" beschränkt. – LPs
Fügen Sie diese Informationen in Ihren Post hinzu. – LPs