Doubly-linked list/Definition: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) (Rename Perl 6 -> Raku, alphabetize, minor clean-up) |
|||
Line 132: | Line 132: | ||
Empty from tail: saw I cat a it Was |
Empty from tail: saw I cat a it Was |
||
</pre> |
</pre> |
||
=={{header|ARM Assembly}}== |
=={{header|ARM Assembly}}== |
||
{{works with|as|Raspberry Pi}} |
{{works with|as|Raspberry Pi}} |
||
Line 374: | Line 375: | ||
</lang> |
</lang> |
||
=={{header|AutoHotkey}}== |
=={{header|AutoHotkey}}== |
||
see [[Doubly-linked list/AutoHotkey]] |
see [[Doubly-linked list/AutoHotkey]] |
||
Line 574: | Line 576: | ||
} |
} |
||
}</lang> |
}</lang> |
||
=={{header|C++}}== |
|||
{{works with|C++11}} |
|||
<lang cpp>#include <iostream> |
|||
#include <list> |
|||
int main () |
|||
{ |
|||
std::list<int> numbers {1, 5, 7, 0, 3, 2}; |
|||
numbers.insert(numbers.begin(), 9); //Insert at the beginning |
|||
numbers.insert(numbers.end(), 4); //Insert at the end |
|||
auto it = std::next(numbers.begin(), numbers.size() / 2); //Iterator to the middle of the list |
|||
numbers.insert(it, 6); //Insert in the middle |
|||
for(const auto& i: numbers) |
|||
std::cout << i << ' '; |
|||
std::cout << '\n'; |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
9 1 5 7 6 0 3 2 4 |
|||
</pre> |
|||
=={{header|C sharp}}== |
=={{header|C sharp}}== |
||
Line 643: | Line 624: | ||
.AddAfter() adds after a specified node. |
.AddAfter() adds after a specified node. |
||
.AddFirst() adds at the head.</pre> |
.AddFirst() adds at the head.</pre> |
||
=={{header|C++}}== |
|||
{{works with|C++11}} |
|||
<lang cpp>#include <iostream> |
|||
#include <list> |
|||
int main () |
|||
{ |
|||
std::list<int> numbers {1, 5, 7, 0, 3, 2}; |
|||
numbers.insert(numbers.begin(), 9); //Insert at the beginning |
|||
numbers.insert(numbers.end(), 4); //Insert at the end |
|||
auto it = std::next(numbers.begin(), numbers.size() / 2); //Iterator to the middle of the list |
|||
numbers.insert(it, 6); //Insert in the middle |
|||
for(const auto& i: numbers) |
|||
std::cout << i << ' '; |
|||
std::cout << '\n'; |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
9 1 5 7 6 0 3 2 4 |
|||
</pre> |
|||
=={{header|Clojure}}== |
=={{header|Clojure}}== |
||
Line 1,200: | Line 1,202: | ||
let e = Some {prev=Some link; data=elt; next=link.next} |
let e = Some {prev=Some link; data=elt; next=link.next} |
||
link.next <- e</lang> |
link.next <- e</lang> |
||
=={{header|Fortran}}== |
=={{header|Fortran}}== |
||
Line 1,709: | Line 1,710: | ||
=={{header|JavaScript}}== |
=={{header|JavaScript}}== |
||
See [[Doubly-Linked List (element)#JavaScript]], [[Doubly-Linked List (element insertion)#JavaScript]] and [[Doubly-Linked List (traversal)#JavaScript]] |
See [[Doubly-Linked List (element)#JavaScript]], [[Doubly-Linked List (element insertion)#JavaScript]] and [[Doubly-Linked List (traversal)#JavaScript]] |
||
=={{header|Julia}}== |
=={{header|Julia}}== |
||
Line 2,122: | Line 2,122: | ||
<pre>15 -> 14 -> 12 |
<pre>15 -> 14 -> 12 |
||
hello -> world</pre> |
hello -> world</pre> |
||
=={{header|Oberon-2}}== |
=={{header|Oberon-2}}== |
||
<lang oberon2> |
<lang oberon2> |
||
Line 2,216: | Line 2,217: | ||
[1] (DList) [A, C, B] |
[1] (DList) [A, C, B] |
||
</pre> |
</pre> |
||
=={{header|Perl 6}}== |
|||
This shows a complete example. (Other entries in the section focus on aspects of this solution.) |
|||
<lang perl6>role DLElem[::T] { |
|||
has DLElem[T] $.prev is rw; |
|||
has DLElem[T] $.next is rw; |
|||
has T $.payload = T; |
|||
method pre-insert(T $payload) { |
|||
die "Can't insert before beginning" unless $!prev; |
|||
my $elem = ::?CLASS.new(:$payload); |
|||
$!prev.next = $elem; |
|||
$elem.prev = $!prev; |
|||
$elem.next = self; |
|||
$!prev = $elem; |
|||
$elem; |
|||
} |
|||
method post-insert(T $payload) { |
|||
die "Can't insert after end" unless $!next; |
|||
my $elem = ::?CLASS.new(:$payload); |
|||
$!next.prev = $elem; |
|||
$elem.next = $!next; |
|||
$elem.prev = self; |
|||
$!next = $elem; |
|||
$elem; |
|||
} |
|||
method delete { |
|||
die "Can't delete a sentinel" unless $!prev and $!next; |
|||
$!next.prev = $!prev; |
|||
$!prev.next = $!next; # conveniently returns next element |
|||
} |
|||
} |
|||
role DLList[::DLE] { |
|||
has DLE $.first; |
|||
has DLE $.last; |
|||
submethod BUILD { |
|||
$!first = DLE.new; |
|||
$!last = DLE.new; |
|||
$!first.next = $!last; |
|||
$!last.prev = $!first; |
|||
} |
|||
method list { ($!first.next, *.next ...^ !*.next).map: *.payload } |
|||
method reverse { ($!last.prev, *.prev ...^ !*.prev).map: *.payload } |
|||
} |
|||
class DLElem_Int does DLElem[Int] {} |
|||
class DLList_Int does DLList[DLElem_Int] {} |
|||
my $dll = DLList_Int.new; |
|||
$dll.first.post-insert(1).post-insert(2).post-insert(3); |
|||
$dll.first.post-insert(0); |
|||
$dll.last.pre-insert(41).pre-insert(40).prev.delete; # (deletes 3) |
|||
$dll.last.pre-insert(42); |
|||
say $dll.list; # 0 1 2 40 41 42 |
|||
say $dll.reverse; # 42 41 40 2 1 0</lang> |
|||
{{out}} |
|||
<pre>0 1 2 40 41 42 |
|||
42 41 40 2 1 0</pre> |
|||
=={{header|Phix}}== |
=={{header|Phix}}== |
||
Line 2,566: | Line 2,501: | ||
</lang> |
</lang> |
||
=={{header|Raku}}== |
|||
(formerly Perl 6) |
|||
This shows a complete example. (Other entries in the section focus on aspects of this solution.) |
|||
<lang perl6>role DLElem[::T] { |
|||
has DLElem[T] $.prev is rw; |
|||
has DLElem[T] $.next is rw; |
|||
has T $.payload = T; |
|||
method pre-insert(T $payload) { |
|||
die "Can't insert before beginning" unless $!prev; |
|||
my $elem = ::?CLASS.new(:$payload); |
|||
$!prev.next = $elem; |
|||
$elem.prev = $!prev; |
|||
$elem.next = self; |
|||
$!prev = $elem; |
|||
$elem; |
|||
} |
|||
method post-insert(T $payload) { |
|||
die "Can't insert after end" unless $!next; |
|||
my $elem = ::?CLASS.new(:$payload); |
|||
$!next.prev = $elem; |
|||
$elem.next = $!next; |
|||
$elem.prev = self; |
|||
$!next = $elem; |
|||
$elem; |
|||
} |
|||
method delete { |
|||
die "Can't delete a sentinel" unless $!prev and $!next; |
|||
$!next.prev = $!prev; |
|||
$!prev.next = $!next; # conveniently returns next element |
|||
} |
|||
} |
|||
role DLList[::DLE] { |
|||
has DLE $.first; |
|||
has DLE $.last; |
|||
submethod BUILD { |
|||
$!first = DLE.new; |
|||
$!last = DLE.new; |
|||
$!first.next = $!last; |
|||
$!last.prev = $!first; |
|||
} |
|||
method list { ($!first.next, *.next ...^ !*.next).map: *.payload } |
|||
method reverse { ($!last.prev, *.prev ...^ !*.prev).map: *.payload } |
|||
} |
|||
class DLElem_Int does DLElem[Int] {} |
|||
class DLList_Int does DLList[DLElem_Int] {} |
|||
my $dll = DLList_Int.new; |
|||
$dll.first.post-insert(1).post-insert(2).post-insert(3); |
|||
$dll.first.post-insert(0); |
|||
$dll.last.pre-insert(41).pre-insert(40).prev.delete; # (deletes 3) |
|||
$dll.last.pre-insert(42); |
|||
say $dll.list; # 0 1 2 40 41 42 |
|||
say $dll.reverse; # 42 41 40 2 1 0</lang> |
|||
{{out}} |
|||
<pre>0 1 2 40 41 42 |
|||
42 41 40 2 1 0</pre> |
|||
=={{header|REXX}}== |
=={{header|REXX}}== |