数据结构,利用计算机的位异或操作,降低双向链表的存储需求。但实际中不推荐使用,主要以下原因:
2.1 常用的debug工具不支持xor的链表,使得debug更加麻烦。
2.2 通过增加代码的复杂度来降低内存开销,增加了维护的成本。
2.3 通常的垃圾回收机制对于这种表示无法工作。
2.4 尽管大部分语言支持,但是还是有一些语言不支持xor操作。
2.5 没有遍历链表的时候,指针式毫无意义的,比如另外的数据结构也包含了链表中的指针。
2.6 遍历链表时,为了计算下个指针的地址,你需要记住前一个节点的地址。
2.7 xor链表也无法提供双向链表的一些功能。比如仅仅知道一个节点将该节点从链表移除或者在仅仅知道一个节点时再该节点后面插入一个节点。
2.8 随着资源越来越便宜,内存越来越大,除了在一些嵌入式系统中,内存将不再是一个非常重要的因素。
参考:http://en.wikipedia.org/wiki/XOR_linked_list
附上实现源码
#include "stdafx.h"
#include
#define LEFT 0
#define RIGHT 1
#define ERROR 0
#define OK 1
#define Status int
// 定义节点
typedef struct XorNode
{
// 数据域
char data;
// 指针域
struct XorNode *LPPtr;
} XorNode,*XorPointer;
// 无头节点的异或指针双向链表
typedef struct {
// 分别指向链表的左端和右端
XorPointer Left,Right;
} XorLinkedList;
XorPointer XorP(XorPointer p,XorPointer q);
// 打印异或链表
void PrintXorList(XorLinkedList A,int direction);
// 插入
Status InstertXorList(XorLinkedList &A, int i, XorNode *a);
// 删除
Status DeleteXorList(XorLinkedList &A, int i);
int _tmain(int argc, _TCHAR* argv[])
{
XorLinkedList A;
A.Right = A.Left = NULL;
XorNode *a = (XorNode *)malloc(sizeof(XorNode));
a->data = 'A';
InstertXorList(A,1,a);
XorNode *b = (XorNode *)malloc(sizeof(XorNode));
b->data = 'B';
InstertXorList(A,2,b);
XorNode *c = (XorNode *)malloc(sizeof(XorNode));
c->data = 'C';
InstertXorList(A,3,c);
XorNode *d = (XorNode *)malloc(sizeof(XorNode));
d->data = 'D';
InstertXorList(A,4,d);
PrintXorList(A,LEFT);
printf("\n");
PrintXorList(A,RIGHT);
printf("删除第一个节点\n");
DeleteXorList(A,1);
PrintXorList(A,LEFT);
printf("\n");
getchar();
return 0;
}
XorPointer XorP(XorPointer p,XorPointer q) {
unsigned long x,y,z;
x = (unsigned long)p;
y = (unsigned long)q;
z = x^y;
return (XorPointer)z;
}
/************************************************************************/
/*
A 遍历输出的异或链表
direction 遍历的方向,LEFT左到右,RIGHT从右到左
*/
/************************************************************************/
void PrintXorList(XorLinkedList A,int direction) {
XorNode *p,*pre = NULL,*q = NULL;
if (direction == LEFT)
{
p = A.Left;
}
else {
p = A.Right;
}
while (p != NULL)
{
printf("%c",p->data);
q = XorP(pre,p->LPPtr);
pre = p;
p= q;
}
}
/************************************************************************/
/* 向链表的第i个节点之前插入一个节点,从1开始,左边算起! */
/************************************************************************/
Status InstertXorList(XorLinkedList &A, int i, XorNode *a) {
if (i <= 0)
{
return ERROR;
}
XorNode *p = A.Left,*pre = NULL,*q;
if (p == NULL)
{
A.Left = a;
A.Right = a;
a->LPPtr = NULL;
return OK;
}
if (i == 1)
{
q = XorP(pre,p->LPPtr);// 找到下一个节点,以便修改
p->LPPtr = XorP(a,q);
a->LPPtr = XorP(NULL,p);
A.Left = a;
return OK;
}
int count = 1;
while (count < i && p != NULL)
{
q = XorP(pre,p->LPPtr);
pre = p;
p = q;
count ++;
}
// 最后一个位置插入特殊处理
if (p == NULL)
{
q = XorP(pre->LPPtr,NULL);
pre->LPPtr = XorP(q,a);
a->LPPtr = XorP(pre,NULL);
A.Right = a;
}
else {
q = XorP(pre->LPPtr,p);
pre->LPPtr = XorP(q,a);
q = XorP(pre,p->LPPtr);
p->LPPtr = XorP(a,q);
a->LPPtr = XorP(pre,p);
}
return OK;
}
/************************************************************************/
/* 删除链表中第i个节点,从1开始左边开始 */
/************************************************************************/
Status DeleteXorList(XorLinkedList &A, int i) {
if (i <= 0)
{
return ERROR;
}
XorNode *p = A.Left,*pre = NULL,*q;
int count = 1;
if (p->LPPtr == NULL)
{
free(p);
A.Left = NULL;
A.Right = NULL;
printf("链表为空!!!");
return OK;
}
if (i == 1)
{
pre = XorP(p->LPPtr,NULL);
q = XorP(pre->LPPtr,p);
free(p);
pre->LPPtr = XorP(NULL,q);
A.Left = pre;
return OK;
}
while (countLPPtr);
pre = p;
p = q;
count++;
}
if (p == NULL)
{
printf("无此节点可删除\n");
return ERROR;
}
else {
if (XorP(p->LPPtr,pre) == NULL)
{
q = XorP(pre->LPPtr,p);
pre->LPPtr = XorP(q,NULL);
free(p);
A.Right = pre;
return OK;
}
else {
XorNode *temp1,*temp2;
q = XorP(p->LPPtr,pre);
temp1 = XorP(pre->LPPtr,p);
temp2 = XorP(q->LPPtr,p);
free(p);
pre->LPPtr = XorP(temp1,q);
q->LPPtr = XorP(temp2,pre);
return OK;
}
}
}