XOR 链表实现中的分段错误

Segmentation fault on XOR linked lists implementation

代码非常简单,也许我遗漏了导致分段错误的明显内容。乍一看,双向异或链表实现代码(打算)创建三个节点,并以从左到右的方式遍历它们。

#include <iostream>

using namespace std;

typedef struct node { int data = 0; struct node* npx = NULL; }n;

n *zor(n *a, n *b) {
    return (n*)((uintptr_t) a ^ (uintptr_t) b);
}

int main() {

    n *head, *a, *b;

    head = new n;
    a = new n;
    b = new n;

    head->npx = zor(NULL, a);
    a->npx = zor(head, b);
    b->npx = zor(a, NULL);

    n* ptr = head;
    while (ptr != NULL) {
        cout << ptr->data;
        ptr = zor(ptr, ptr->npx);
    }
}

我希望在遍历列表中的所有节点后输出为“000”。

出了什么问题

链接是正确结合前一个指针和下一个指针构建的。

link = previous ^ next

不幸的是,稍后恢复下一个指针时

ptr = zor(ptr, ptr->npx);

尝试用

重建下一个
next = current ^ link

而不是

next = previous ^ link

导致下一个损坏。这意味着您需要更多的簿记来跟踪前一个节点。

可能的解决方案

n* current = head; // changed name to make code match description
n* previous = NULL; // no previous at the head
while (current != NULL) {
    cout << current->data;
    n* next = zor(previous, current->npx); // need a temp so we can update previous
    previous = current; // current becomes the next's previous
    current = next; // advance current to next
}