异或指针双链表的创建、打印(严奶奶数据结构练习2.34)

来源:互联网 发布:打印机如何网络共享 编辑:程序博客网 时间:2024/05/16 01:03

异或指针双向链表的每一个节点内,只用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 0XorLinkedlist *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);}


原创粉丝点击