数据结构——异或指针双向链表的一道习题
来自数据结构习题:
异或指针双向链表类型 XorLinkedList 和 指针异或函数 XorP 定义如下:
typedef struct XorNode {
char data;
struct XorNode LRPtr;
} XorNode,*XorPointer;
typedef struct { //无头结点的异或指针双向链表
XorPointer Left,Right; //分别指向链表的左端和右端
} XorLinkedList;
XorPointer XorP(XorPointer p,XorPointer q);
// XorP返回指针p和q的异或值
假设在算法描述语言中引入指针的二元运算 "异或 "(用 "¤ "表示),若a和b都是指针
则a¤b的运算结果仍为指针,且有:
a¤(a¤b)=(a¤a)¤b=b
b¤(a¤b)=(b¤b)¤a=a
则可以利用一个指针域来实现双向链表L,链表L中每个结点只含有两个域:
data域和LRPtr域,
其中LRPtr域存放该结点的左邻与右邻结点(不存在时为NULL)的异或。
若设指针L.Left指向链表中最左结点,L.Rright链表中最右结点,
则可实现从左向右或从右向左遍历此双向链表的操作。
题目:从左导游遍历链表中各元素的值。
参考答案是:
void Print_XorLinkedList(XorLinkedList L)//从左向右输出异或链表的元素值
{
p=L.left;pre=NULL;
while(p)//这里我不明白,既然是双向链表,这个能判断结束么?最后一个元素的后继应该是首元素吧。
{
printf("%d",p->data);
q=XorP(p->LRPtr,pre);
pre=p;p=q; //任何一个结点的LRPtr域值与其左结点指针进行异或运算即得到其右结点指针
}
}//Print_XorLinkedList