//由于利用cpp的引用 文件名保存为*.cpp
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
//宏定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef char ElemType;
typedef struct XorNode{
ElemType data;
struct XorNode *LRPtr;
}XorNode,*XorPointer;
typedef struct{
XorPointer Left,Right;
}XorLinkedList;
//指针异或运算
XorPointer XorP(XorPointer p,XorPointer q)
{
unsigned long x,y;
x=(unsigned long)p;
y=(unsigned long)(q);
return (XorPointer)(x^y);
}
//创建节点
Status MakeNode(XorPointer &p,ElemType e)
{
p=(XorPointer)malloc(sizeof(XorNode));
if(!p) return FALSE;
p->data=e;
p->LRPtr=NULL;
return TRUE;
}
//创建链表
Status CreatXorLinkedList(XorLinkedList &L)
{
XorPointer p,q;
unsigned long x,y;
char string[100];
char input;
int i=0;
printf("input string: ");
scanf("%s",string);
input=string[i];
while(input!='\0')
{
if(!MakeNode(p,input)) { return FALSE;}
else
{
if(L.Left==NULL)
{L.Left=L.Right=p;q=p;}
else{
L.Right=p;
p->LRPtr=q;
q->LRPtr=XorP(p,q->LRPtr);
q=p;
}
i++;
input=string[i];
}
}
return TRUE;
}
//访问双向异或链表 调用方法 XorLinkedList为链表 direction为方向 0为从左方向(头)开始遍历 1为从右(尾)方向访问
void TraverseXorLinkedList(XorLinkedList L,int direction)
{
XorPointer p,q,r;
switch(direction)
{
case 0: p=q=r=L.Left;break;
case 1: p=q=r=L.Right;break;
default : p=q=r=L.Left;break;
}
while(p!=NULL)
{
printf("%c\t",p->data);
if(p==r) {p=p->LRPtr;}
else{
r=p;
p=XorP(p->LRPtr,q);
q=r;
}
}
}
//插入一个节点 在第i个节点前插入
Status InsertElemToXorLinkedList(XorLinkedList &L,int index,ElemType e)
{
XorPointer p,q,r;
XorPointer s;
int i=1;
if((L.Left==NULL)||(index<1))
{return FALSE;}
p=q=r=L.Left;
while(i<index&&p!=NULL)
{
if(p==r) {p=p->LRPtr;}
else{
r=p;
p=XorP(p->LRPtr,q);
q=r;
}
i++;
}
if(!p) {return FALSE;}
if(MakeNode(s,e)) {
if(p==L.Left) {
s->LRPtr=p;
p->LRPtr=XorP(s,p->LRPtr);
L.Left=s;
}
else{
s->LRPtr=XorP(p,q);
q->LRPtr=XorP(XorP(q->LRPtr,p),s);
p->LRPtr=XorP(XorP(p->LRPtr,q),s);
}
return TRUE;
}
else{return FALSE;}
}
//删除一个节点 删除第i个节点
Status DeleteElemToXorLinkedList(XorLinkedList &L,int index)
{
XorPointer p,q,r;
int i=1;
if((L.Left==NULL)||(index<1))
{return FALSE;}
p=q=r=L.Left;
while(i<index&&p!=NULL)
{
if(p==r) {p=p->LRPtr;}
else{
r=p;
p=XorP(p->LRPtr,q);
q=r;
}
i++;
}
if(!p) {return FALSE;}
if(p==L.Left) {
if(L.Left==L.Right) {L.Left=L.Right=NULL;}
else{
L.Left=p->LRPtr;
q=p->LRPtr;
q->LRPtr=XorP(q->LRPtr,p);
}
}
else{
r=XorP(q,p->LRPtr);
q->LRPtr=XorP(XorP(q->LRPtr,p),r);
if(p==L.Right) {L.Right=q;}
else{
r->LRPtr=XorP(XorP(r->LRPtr,p),q);
}
}
free(p); //释放节点
return TRUE;
}
int main(int argc, char *argv[])
{
XorPointer p;
XorLinkedList List;
List.Left=List.Right=NULL;
CreatXorLinkedList(List);
TraverseXorLinkedList(List,0);
printf("\n");
InsertElemToXorLinkedList(List,6,'e');
TraverseXorLinkedList(List,0);
printf("\n");
system("PAUSE");
return EXIT_SUCCESS;
}
异或双向链表
最新推荐文章于 2021-05-20 21:46:04 发布