异或指针双向链表的每一个节点内,只用LRPtr域来存储前后节点指针的异或值。
通过 a^(a^b)=(a^a)^b=b
(a^b)^b=a^(b^b)=a
来实现求取前后节点指针的实现。同时,节点XorLinklist存放异或指针双向链表的头结点、尾节点的地址。
将节点指针转换为无符号整型进行异或,返回一个指针类型的异或值。
代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct XorNode{
char date;
struct XorNode *LRPtr;
}XorNode;
typedef struct {
XorNode *left,*right;
}XorLinkedlist;
#define TRUE 1
#define FALSE 0
XorLinkedlist *creatXorNode(XorLinkedlist *, int c); /* 函数creatXorNode :创建一个异或指针双向链表 */
XorNode *XorP(XorNode *p, XorNode *q); /* 函数XorP :返回p,q的异或值 */
void listprintf(XorLinkedlist *linklist, int ); /* 函数listprintf: 打印异或指针双向链表 */
main(){
int c;
XorLinkedlist *linklist=NULL;
while(scanf("%c",&c)!=EOF)
linklist=creatXorNode(linklist,c);
listprintf(linklist,TRUE); /* TRUE顺序打印,FALSE逆序打印 */
printf("\n");
listprintf(linklist,FALSE);
return 0;
}
XorLinkedlist *creatXorNode(XorLinkedlist *linklist, int c) {
XorNode *k,*prior,*next,*u;
if(linklist==NULL) {
linklist=(XorLinkedlist *)malloc(sizeof(XorLinkedlist));
linklist->left=(XorNode *)malloc(sizeof(XorNode));
linklist->left->date=c;
linklist->left->LRPtr=XorP(linklist->left,linklist->left);
linklist->right=linklist->left;
return linklist;
}
next=XorP(linklist->right,linklist->left->LRPtr); /* 首元节点的后继 */
prior=linklist->right; /* 首元结点的前驱 */
k=linklist->left;
do {
if(c<linklist->left->date) {
k=linklist->left;
linklist->left=(XorNode *)malloc(sizeof(XorNode));
linklist->left->date=c;
linklist->left->LRPtr=XorP(linklist->right,k); /* 新的首元结点的前驱是linklist->right, 后继是k */
k->LRPtr=XorP(linklist->left,XorP(linklist->right,k->LRPtr)); /* 原来首元结点k的后继未变,前驱变为linklist->left,后继通过XorP求出 */
linklist->right->LRPtr=XorP(XorP(k,linklist->right->LRPtr),linklist->left); /* 原来首元结点的前驱节点的LRPtr也会改变 */
return linklist;
}
else if (c>=k->date&&(next==linklist->left||c<=next->date)) {
u=next;
next=(XorNode *)malloc(sizeof(XorNode));
next->date=c;
next->LRPtr=XorP(k,u);
k->LRPtr=XorP(prior,next);
u->LRPtr=XorP(next,XorP(k,u->LRPtr)); /* 在任何位置插入新的节点都会改变三个节点(前驱,当前,后继)的LRRtr项 */
if(u==linklist->left)
linklist->right=next;
return linklist;
}
else {
prior=k;
k=next;
next=XorP(prior,k->LRPtr);
}
} while(k!=linklist->left);
}
XorNode *XorP(XorNode *p, XorNode *q){
unsigned k;
k=(unsigned )p^(unsigned)q;
return (XorNode *)k;
}
void listprintf(XorLinkedlist *linklist,int c) {
XorNode *k,*i,*p,*u;
if(c!=TRUE&&c!=FALSE)
return;
if(linklist==NULL)
return;
if(c==TRUE) { /* 设置打印顺序,TRUE顺序打印,FALSE逆序打印 */
k=linklist->left;
i=linklist->right;
}
else {
k=linklist->right;
i=linklist->left;
}
p=k;
do {
printf("%c",k->date);
u=k;
k=XorP(i,k->LRPtr);
i=u;
}while(k!=p);
}