-
Notifications
You must be signed in to change notification settings - Fork 0
/
xorlist.c
154 lines (118 loc) · 2.44 KB
/
xorlist.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//
// xorlist.c
// xorlist
//
// Created by sake on 15/1/9.
// Copyright (c) 2015年 sake. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include "xorlist.h"
typedef struct node * PTR;
#define LOOPOVER(preAddr, curAddr) \
for(PTR nextAddr ;(nextAddr = XOR(preAddr, curAddr->link))!= NULL;) { \
preAddr = curAddr; \
curAddr = nextAddr; \
}
#define FOREACH(preAddr, curAddr) \
for(PTR nextAddr = curAddr; \
nextAddr != NULL ; \
nextAddr = XOR(preAddr, curAddr->link), \
preAddr = curAddr, \
curAddr = nextAddr)
unsigned long makeUL(PTR p) {
return (unsigned long)p;
}
PTR XOR(PTR p, PTR q) {
return (PTR)(makeUL(p)^makeUL(q));
}
PTR insert_back(PTR root, int data) {
PTR p = NULL, q = root;
p = (PTR)malloc(sizeof(struct node));
p->data = data;
p->link = NULL;
if (root == NULL) {
root = p;
} else {
PTR pre = NULL;
LOOPOVER(pre, q);
p->link = XOR(NULL, q);
q->link = XOR(p, pre);
}
return root;
}
PTR delete(PTR root, int data) {
return root;
}
PTR getTail(PTR root) {
PTR pre = NULL, q = root;
LOOPOVER(pre, q);
return q;
}
void loop(PTR root) {
PTR pre = NULL, q = root;
FOREACH(pre, q){
printf("%d\n",q->data);
}
}
Iter begin(PTR root){
Iter it = {
.cur = root,
.pre = NULL,
.next = root->link
};
return it;
}
Iter rbegin(PTR root){
PTR pre = NULL, q = root;
LOOPOVER(pre, q);
Iter it = {
.cur = q,
.pre = pre,
.next = NULL
};
return it;
}
Iter end(PTR root){
PTR pre = NULL, q = root;
LOOPOVER(pre, q);
Iter it = {
.cur = NULL,
.pre = q,
.next = NULL
};
return it;
}
Iter rend(PTR root){
Iter it = {
.cur = NULL,
.pre = NULL,
.next = root
};
return it;
}
void next(Iter* nd){
PTR pre = nd->pre;
nd->pre = nd->cur;
if (nd->next != NULL){
nd->cur = nd->next;
} else {
nd->cur = XOR(nd->cur->link, pre);
}
nd->next = NULL;
}
void pre(Iter* nd){
PTR next = nd->next;
nd->next = nd->cur;
if (nd->pre != NULL){
nd->cur = nd->pre;
} else {
nd->cur = XOR(nd->cur->link, next);
}
nd->pre = NULL;
}
int same(Iter *A, Iter *B) {
return A->cur == B->cur &&
A->next == B->next &&
A->pre == B->pre;
}