异或双向链表

//由于利用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;
}
 


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值