import
ctypes
class
Node:
def
__init__(
self
, data):
self
.data
=
data
self
.link
=
0
class
XorLinkedList:
def
__init__(
self
):
self
.head
=
None
self
.nodes
=
[]
def
type_cast(
self
,
id
):
return
ctypes.cast(
id
, ctypes.py_object).value
def
forward_traversal(
self
):
if
(
self
.head
=
=
None
):
print
(
"Empty"
)
else
:
prev_id
=
0
current
=
self
.head
print
(current.data, end
=
"->"
)
next_id
=
1
while
(next_id):
next_id
=
prev_id ^ current.link
if
(next_id):
prev_id
=
id
(current)
current
=
self
.type_cast(next_id)
print
(current.data, end
=
"->"
)
def
insert_at_position(
self
, key, position):
if
(position <
1
):
print
(
"Can't insert"
)
elif
(position
=
=
1
):
n
=
Node(key)
if
(
self
.head
=
=
None
):
self
.head
=
n
else
:
self
.head.link
=
id
(n) ^
self
.head.link
n.link
=
id
(
self
.head)
self
.head
=
n
self
.nodes.append(n)
else
:
if
(
self
.head
=
=
None
):
print
(
"Out of range"
)
else
:
n
=
Node(key)
current
=
self
.head
m
=
id
(current)
i
=
1
prev_id
=
0
next_id
=
1
while
(next_id
and
i < position
-
1
):
next_id
=
prev_id ^ current.link
prev_id
=
id
(current)
if
(next_id):
current
=
self
.type_cast(next_id)
m
=
id
(current)
i
=
i
+
1
else
:
break
if
(i
=
=
position
-
1
):
next_id
=
prev_id ^ current.link
current.link
=
current.link ^ next_id ^
id
(n)
if
(next_id):
nxt
=
self
.type_cast(next_id)
nxt.link
=
id
(n) ^ nxt.link ^
id
(current)
n.link
=
id
(current) ^
id
(nxt)
else
:
n.link
=
id
(current)
self
.nodes.append(n)
else
:
print
(
"out of range"
)
obj
=
XorLinkedList()
obj.insert_at_position(
10
,
1
)
obj.insert_at_position(
20
,
1
)
obj.insert_at_position(
30
,
3
)
obj.insert_at_position(
40
,
2
)
obj.forward_traversal()