现在,我正在练习使用C ++来介绍算法。 问题是:
解释如何仅使用一个指针实现双向链表 值x.np每个项目而不是通常的两个(next和prev)。假设 所有指针值都可以解释为k位整数,和 定义x.np = x.next XOR x.prev,k-bit" exclusive-or" x.next 和x.prev。 (值NIL由0表示)。一定要描述一下 您需要什么信息才能访问列表的头部。演示如何 在这样的列表上实现SEARCH,INSERT和DELETE操作。 还显示了如何在O(1)时间内反转这样的列表。
在XOR函数中,我首先将指向class的指针转换为unsigned long和Xor这两个值。然后将结果转换回指向class的指针。我不知道它为什么不起作用。这是我的代码:
struct node
{
int key;
node *np;
} ;
struct list_n
{
node *head;
node *tail;
};
以上是两个结构,下面是插入
void insert_element(list_n *_list, int _key)
{
node *present_node= new node;
present_node->key=_key;
present_node->np=xor_gate(nullptr,_list->tail);
if(_list->tail) _list-> tail->np=xor_gate(present_node,xor_gate(nullptr,_list->tail->np ));
if(!_list->head) _list->head=present_node;
_list->tail=present_node;
}
以下是Xor门:
node *xor_gate(node *left,node *right)
{
unsigned long result;
result = ( reinterpret_cast<unsigned long>(left) ) ^ ( reinterpret_cast<unsigned long>(right) );
node *output =new node;
output = reinterpret_cast<node*> (result); // yes or no
return output ;
}
void list_n_inti(list_n *a )
{
a->head =nullptr;
a->tail =nullptr;
}
我已多次查看代码。我认为这个问题是由XOR门引起的。
如果您发现了错误,请告诉我。如果你有任何其他方法来回答这个问题。请告诉我。
谢谢
答案 0 :(得分:1)
xor_gate
中存在内存泄漏,但我认为如果将代码编译为32位,则代码可以正常工作。如果将其编译为64位,则unsigned long
通常不能包含指针。
试试这个:
#include <cstdint> // for uintptr_t
node *xor_gate(node *left,node *right)
{
using std::uintptr_t;
uintptr_t result = ( reinterpret_cast<uintptr_t>(left) ) ^ ( reinterpret_cast<uintptr_t>(right) );
return reinterpret_cast<node*> (result);
}