一、异或运算的基本知识
1. 什么是异或运算
假设二进制数10跟二进制数01进行异或运算的时候,即10 ^ 01,从右往左依次进行运算,相同情况的异或结果为0,否则为1。即0 ^ 1 = 1, 1 ^ 0 = 1,则10 ^ 01 = 11
2. 运算规则
X⊕X = 0
X⊕0 = X
X⊕Y = Y⊕X
(X⊕Y)⊕Z = X⊕(Y⊕Z)
3. 指针异或运算实战
https://blog.csdn.net/weixin_39666151/article/details/90731384
记住这点:在异或指针双向链表中,每个结点的LRPtr
由前后两个结点指针异或运算得出
二、异或指针双向链表的实现
具体包括:
XorPointer XorP_XorL(XorPointer p, XorPointer q); /* 返回指针p和指针q的异或值 */
Status Init_XorL(Xor L); /* 初始化异或指针双向链表 */
Status Create_XorL(Xor L, int n, XElemType elem[]); /* 创建异或指针双向链表 */
XorPointer Prior_Next_Ptr_XorL(Xor L, XorPointer cur, int mark);/* 获取当前结点的前驱或后继 */
void Traverse_XorL(Xor L, int mark); /* 打印异或指针双向链表 */
实现方式一:整表创建法。具体代码如下:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef char XElemType;
//定义异或指针双向链表结点结构
typedef struct XorNode
{
XElemType data;
struct XorNode *LRPtr;
}XorNode, *XorPointer;
//定义无头结点异或指针双向链表
typedef struct
{
XorPointer Left;
XorPointer Right;
}XorLinkedList, *Xor;
XorPointer XorP_XorL(XorPointer p, XorPointer q); /* 返回指针p和指针q的异或值 */
Status Init_XorL(Xor *L); /* 初始化异或指针双向链表 */
Status Create_XorL(Xor L, int n, XElemType elem[]); /* 创建异或指针双向链表 */
XorPointer Prior_Next_Ptr_XorL(Xor L, XorPointer cur, int mark);/* 获取当前结点的前驱或后继 */
void Traverse_XorL(Xor L, int mark); /* 打印异或指针双向链表 */
int main()
{
Xor L;
XElemType *data = "1234567";