异或指针双链表的创建、打印(严奶奶数据结构练习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);}
- 异或指针双链表的创建、打印(严奶奶数据结构练习2.34)
- 奶奶奶奶奶奶的
- 双链表的创建、删除、插入及打印(数据结构)
- 数据结构:单链表(一)的创建、插入、删除、遍历,打印
- 奶奶~我亲爱的奶奶
- 数据结构:链表的创建和打印
- 自动生成打印无指针结构的数据结构的代码
- 练习3: 通过打印指针,加深对交换函数和指针的理解。
- 我的奶奶
- 我想我的奶奶
- 奶奶
- 数据结构 二叉树的创建 关于二级指针的问题
- 指针的指针小小练习
- 指针的简单练习
- 指针的练习
- [原创]写给我的奶奶
- 今天,是奶奶的生日
- [数据结构]链表创建、打印、反转
- 使用Spring 的JDBC
- vs2010C#项目-英文版打包中文框架出错的解决办法
- 2013-BIT程序设计 11.识别条形码 -- 模拟
- 随笔2013,10,18
- 笔记7:vb.net的异步读写数据流(使用线程、委托)
- 异或指针双链表的创建、打印(严奶奶数据结构练习2.34)
- ubuntu安装jdk7
- Android 内存分析工具
- sqlite3 数据库命令操作
- android仿淘宝界面
- printk,klogd,syslogd 关系
- C++ WideCharToMultiByte函数注意事项
- Android 源码编译make的错误处理
- POJ 2777 Count Color (线段树区间更新)