我在交換單鏈表中的節點時遇到問題。我的代碼當前工作時沒有任何節點是列表的開始。交換單鏈表中的兩個節點
編輯:我瞭解的ADT,所以我不能改變什麼功能的輸入和輸出。
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;
}
我知道我的交換節點的方式是正確的,因爲如果我改變函數返回一個TB(在這種情況下,所有),那麼它的工作原理。
我的問題是如何將我與一個void函數和不改變什麼功能需要在做呢?我想我需要一個頭指針?但是,我該如何使用它?
這個代碼看起來非常地複雜。順便提一下[mcve]。 –
「TB」是一個隱藏指針嗎?否則它的可見性/範圍僅限於'swapTB'函數。 – LPs
將這些信息添加到您的帖子中。 – LPs