在单链表中交换两个节点

时间:2016-12-20 08:18:35

标签: c function pointers linked-list

我无法在单链表中交换节点。当两个节点都不是列表的开头时,我的代码当前有效。

编辑:我正在学习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函数执行此操作并且不更改函数所需的内容?我想我需要头指针?但是我该如何使用它?

1 个答案:

答案 0 :(得分:1)

做两件事: - 在函数中传递struct textbuffer的地址。

void swapTB(TB * tb,int pos1,int pos2)

在main()中: -

swapTB(TB,POS1,POS2);

还要检查你的currx和咖喱是否为空。

session.delete()