c - 'memory efficient doubly linked list' 是如何工作的?

标签 c algorithm data-structures xor-linkedlist mem.-efficient-linkedlist

Data Structures and Algorithms Made Easy , struct 内存高效内存列表给出如下,

struct LinkNode
{
 int data;
 struct LinkNode* ptrdiff;
}

ptrdiff中,将完成上一个节点和下一个节点的异或运算。例如,前一个节点的地址为100,下一个节点的地址为500

因此,在 ptrdiff 中地址将为 400。现在如何移动到下一个或上一个节点(就像我们在双向链表中所做的那样),仅仅通过知道它们的地址的异或?

我是否遗漏了任何步骤?

最佳答案

第一个节点没有前一个节点,最后一个节点没有下一个节点...所以将第一个节点之前的节点和最后一个节点之后的节点的地址视为0。这足以开始遍历,当你遍历时,你手头总是有前一个节点的地址,这样你就可以确定后一个节点的地址。下面是遍历这样一个列表并打印数据的示例……将第一个或最后一个节点的地址传递给 printxorlist,它将向前或向后打印它:

void printxorlist(struct LinkNode* node)
{
    struct LinkNode* prev = NULL;
    while (node)
    {
        printf("%d\n", node->data);
        struct LinkNode* next = (struct LinkNode*)((intptr_t)node->ptrdiff ^ (intptr_t)prev);
        prev = node;
        node = next;
    }
}

请注意,我们必须强制转换 node->ptrdiff,因为它实际上没有正确的类型。最好是正确地声明它:

struct LinkNode
{
    int data;
    intptr_t ptrdiff;
}

然后

void printxorlist(struct LinkNode* node)
{
    struct LinkNode* prev = NULL;
    while (node)
    {
        printf("%d\n", node->data);
        struct LinkNode* next = (struct LinkNode*)(node->ptrdiff ^ (intptr_t)prev);
        prev = node;
        node = next;
    }
}

关于c - 'memory efficient doubly linked list' 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25820051/

相关文章:

c++ - 用C/C++实现执行超时

c - 查找一个月的第一天属于星期几的结果不正确

java - API后端如何实现线程的公平使用策略?

c++ - 如何从 multimap 中删除特定的重复项?

c++ - 处理复杂直方图数据的最有效方法?

c - Jaccard距离在C中的实现

c++ - 转义序列?在 Qstring 中使用引号

python - 使用 t-SNE 降维执行聚类

algorithm - 从源到目标的最小操作数。

java - 二叉搜索树是平衡的吗?