我无法在单链表中交换节点。当两个节点都不是列表的开头时,我的代码当前有效。
编辑:我正在学习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函数执行此操作并且不更改函数所需的内容?我想我需要头指针?但是我该如何使用它?
答案 0 :(得分:1)
做两件事: - 在函数中传递struct textbuffer的地址。
void swapTB(TB * tb,int pos1,int pos2)
在main()中: -
swapTB(TB,POS1,POS2);
还要检查你的currx和咖喱是否为空。
session.delete()