C++ 异或双链表

C++ 异或双链表,c++,data-structures,doubly-linked-list,C++,Data Structures,Doubly Linked List,因此,作为练习的一部分,我试图创建一个XOR双链表,但我的removeFirst()函数一直出现分段错误。我不知道出了什么问题,有人知道吗 这是节点的外观: class Node{ public: int data; Node *XOR; }; 我使用此函数计算XOR: Node* returnXOR(Node *a, Node *b){ return (Node*)((uintptr_t) (a) ^ (uintptr_t) (b)); } 这是我的XOR双链表

因此,作为练习的一部分,我试图创建一个XOR双链表,但我的removeFirst()函数一直出现分段错误。我不知道出了什么问题,有人知道吗

这是节点的外观:

class Node{

public:
    int data;
    Node *XOR;

};
我使用此函数计算XOR:

Node* returnXOR(Node *a, Node *b){
    return (Node*)((uintptr_t) (a) ^ (uintptr_t) (b));
}
这是我的XOR双链表类:

class XORDLL{

public:
Node *head;

XORDLL(){
    head = NULL;
}

void addFirst(int data){
    // Make a newNode pointer
    Node *newNode = new Node;

    // Set the variables
    newNode->data = data;
    newNode->XOR = returnXOR(head, NULL);   

    // If the head is not empty set the XOR of the head to the next XOR the newNode
    if(head != NULL){
        head->XOR = returnXOR(newNode, returnXOR(head->XOR, NULL));
    }   

    // Set the newNode to the head 
    head = newNode;
}

void removeFirst(){
    // If head is equal to NULL, do nothing
    if(head == NULL){
        return;
    }
    // Store current head
    Node *tmp = head;

    // Set head equal to the next address
    head = returnXOR(tmp->XOR, NULL);
    head->XOR = returnXOR(tmp->XOR, tmp);


    // Delete tmp variable
    delete tmp;
}

void printList(){
    Node *current = head;
    Node *prev = NULL;
    Node *next;
    while(current != NULL){
        printf("%d ", current->data);
        next = returnXOR(current->XOR, prev);
        prev = current;
        current = next;           
    }
    printf("\n");
}
};
当我运行这段代码时:

int main(){
    XORDLL l;
    l.addFirst(1);
    l.addFirst(2);
    l.addFirst(3);
    l.printList();
    l.removeFirst();
    l.printList();
    return 0;
}
这是输出:

3 2 1
分段故障(堆芯倾倒)

删除
malloc
的数据。您需要
释放它,或者使用
new
代替
malloc
。 另一个错误是您错过了这一行:

          void removeFirst(){
          // If head is equal to NULL, do nothing
          if(head == NULL){
              return;
          }
          // Store current head
          Node *tmp = head;

          // Set head equal to the next address
          head = returnXOR(tmp->XOR, NULL);
          head->XOR = returnXOR(head->XOR, tmp); <<<<<<<<<<<<<<<<<< Here

          // Free tmp variable
          free(tmp);
      }
void removeFirst(){
//如果head等于NULL,则不执行任何操作
if(head==NULL){
返回;
}
//存储当前磁头
节点*tmp=头部;
//将磁头设置为下一个地址
head=returnXOR(tmp->XOR,NULL);

head->XOR=returnXOR(head->XOR,tmp);您使用
returnXOR
函数获取两个现有
节点
的原始内存地址,对两个原始内存地址进行异或,并将结果强制转换为指向另一个
节点
的指针。不幸的是,生成的内存地址成为指向
节点
的有效指针的实际可能性微乎其微。因此,您的崩溃他就像是拿了非洲沙漠中两个绿洲的地理长度和格度,排他或数字长度/格度,移动到新的坐标集,并期望在那里找到第三个绿洲。这也是我所想的,但为什么我的打印列表()当使用相同的方法时,函数可以正常工作。因为,如果你计算出数学,代码总是访问两个有效的节点,然后计算一个空值(第一个带NULL的XOR,带0的XOR,什么都不做;下一个迭代将内存地址与自身异或,产生一个空值)。你在那里很幸运。顺便说一句,
删除当前、上一个、下一个;
不会做你认为它会做的事。它不会,我重复一遍,不会删除三个指针。这似乎是个好主意。谢谢你提供的信息,我将不得不自己解决。@JornvanderMaat
Node*newNode=(Node*)malloc sizeof(Node))在C++程序中,为什么使用<代码> MalOC < /CUT>?代码不显示行为,因为<代码>节点< /C>不是POD类型。代码不构造<代码>节点< /Cord>对象——在C++中,<代码>运算符new <代码>用于动态构造类型。所有<代码> Malc C <代码>都分配字节-它不合作。nstruct对象。虽然这也是事实,但这是所示代码中许多问题中最小的一个。因此我更改了代码以摆脱delete语句并免费使用,但仍然得到相同的输出。修复了另一个错误:)一开始不应该调用
malloc
,因为
节点
数据是完全错误的因此,你不应该鼓励使用<代码>免费<代码>。我也可以说,不应该调用<代码>新< /代码>。但是当你在低级XORIN指针上工作时,我认为 MALLC/<代码>不是一个大问题,因为它不是真正的C++,它只是C。