Doubly-linked list/Definition: Difference between revisions
Content added Content deleted
(added Unicon example) |
|||
Line 1,171: | Line 1,171: | ||
n1 = firstNode x |
n1 = firstNode x |
||
Just n2 = nextNode x n1</lang> |
Just n2 = nextNode x n1</lang> |
||
==Icon and {{header|Unicon}}== |
|||
Uses Unicon's classes. |
|||
The DoubleList is made from elements of DoubleLink. [[Doubly-Linked List (element)#Icon_and_Unicon]], [[Doubly-Linked List (element insertion)#Icon_and_Unicon]] and [[Doubly-Linked List (traversal)#Icon_and_Unicon]] |
|||
<lang Unicon> |
|||
class DoubleList (item) |
|||
method head () |
|||
node := item |
|||
every (node := node.traverse_backwards ()) # move to start of list |
|||
return node |
|||
end |
|||
method tail () |
|||
node := item |
|||
every (node := node.traverse_forwards ()) # move to end of list |
|||
return node |
|||
end |
|||
method insert_at_head (value) |
|||
head().insert_before (DoubleLink(value)) |
|||
end |
|||
method insert_at_tail (value) |
|||
tail().insert_after (DoubleLink (value)) |
|||
end |
|||
# insert a node for new_value after that for target_value, |
|||
# i.e. in the middle of the list |
|||
method insert_after (target_value, new_value) |
|||
node := head () |
|||
every node := head().traverse_forwards () do |
|||
if (node.value = target_value) |
|||
then { |
|||
node.insert_after (DoubleLink (new_value)) |
|||
break |
|||
} |
|||
end |
|||
# constructor initiates a list making a node from given value |
|||
initially (value) |
|||
self.item := DoubleLink (value) |
|||
end |
|||
</lang> |
|||
An <code>insert_before</code> method was added to the DoubleLink class: |
|||
<lang Unicon> |
|||
# insert given node before this one, losing its existing connections |
|||
method insert_before (node) |
|||
if (\prev_link) then prev_link.next_link := node |
|||
node.prev_link := prev_link |
|||
node.next_link := self |
|||
self.prev_link := node |
|||
end |
|||
</lang> |
|||
To test the double-linked list: |
|||
<lang Unicon> |
|||
procedure main () |
|||
dlist := DoubleList (5) |
|||
every i := 4 to 1 by -1 do |
|||
dlist.insert_at_head (i) |
|||
every i := 6 to 10 do |
|||
dlist.insert_at_tail (i) |
|||
dlist.insert_after (3, 11) |
|||
every node := dlist.head().traverse_forwards () do |
|||
write (node.value) |
|||
end |
|||
</lang> |
|||
Output: |
|||
<pre> |
|||
1 |
|||
2 |
|||
3 |
|||
11 |
|||
4 |
|||
5 |
|||
6 |
|||
7 |
|||
8 |
|||
9 |
|||
10 |
|||
</pre> |
|||
=={{header|J}}== |
=={{header|J}}== |