1つのリンクリストでノードを交換する際に問題があります。私のコードは現在、どちらのノードもリストの先頭ではないときに動作します。1つのリンクリストで2つのノードを交換する
EDIT:私は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関数を使用して、関数の取り込みを変更せずに行う方法です。私は頭のポインタが必要だと思いますか?しかし、どうすればそれを使うことができますか?
このコードは非常に複雑です。 BTWは[mcve]を提供してください。 –
'TB'は非表示のポインタですか?さもなければ、その可視性/有効範囲は 'swapTB'関数に限定されます。 – LPs
これらの情報をあなたの投稿に追加してください。 – LPs