Doubly-linked list/Element insertion: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) (Rename Perl 6 -> Raku, alphabetize, minor clean-up) |
|||
Line 4: | Line 4: | ||
{{Template:See also lists}} |
{{Template:See also lists}} |
||
=={{header|Ada}}== |
=={{header|Ada}}== |
||
Line 181: | Line 182: | ||
This function call changes the list from {a,b} to {a,b,c}. |
This function call changes the list from {a,b} to {a,b,c}. |
||
=={{header|C++}}== |
|||
C++ already has own linked list structure. If we were to roll our own linked list, we could implement function inserting new value after specific node like that: |
|||
<lang cpp>template <typename T> |
|||
void insert_after(Node<T>* N, T&& data) |
|||
{ |
|||
auto node = new Node<T>{N, N->next, std::forward(data)}; |
|||
if(N->next != nullptr) |
|||
N->next->prev = node; |
|||
N->next = node; |
|||
}</lang> |
|||
=={{header|C sharp|C#}}== |
=={{header|C sharp|C#}}== |
||
Line 215: | Line 203: | ||
//Insert C(15) between A and B |
//Insert C(15) between A and B |
||
InsertAfter(A, 15); |
InsertAfter(A, 15); |
||
}</lang> |
|||
=={{header|C++}}== |
|||
C++ already has own linked list structure. If we were to roll our own linked list, we could implement function inserting new value after specific node like that: |
|||
<lang cpp>template <typename T> |
|||
void insert_after(Node<T>* N, T&& data) |
|||
{ |
|||
auto node = new Node<T>{N, N->next, std::forward(data)}; |
|||
if(N->next != nullptr) |
|||
N->next->prev = node; |
|||
N->next = node; |
|||
}</lang> |
}</lang> |
||
Line 838: | Line 837: | ||
my $node_c = { %node_model }; |
my $node_c = { %node_model }; |
||
insert($node_a, $node_c);</lang> |
insert($node_a, $node_c);</lang> |
||
=={{header|Perl 6}}== |
|||
Using the generic definitions from [[Doubly-linked_list/Definition#Perl_6]]: |
|||
<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_Str does DLElem[Str] {} |
|||
class DLList_Str does DLList[DLElem_Str] {} |
|||
my $sdll = DLList_Str.new; |
|||
my $b = $sdll.first.post-insert('A').post-insert('B'); |
|||
$b.pre-insert('C'); |
|||
say $sdll.list; # A C B</lang> |
|||
{{out}} |
|||
<pre>A C B</pre> |
|||
=={{header|Phix}}== |
=={{header|Phix}}== |
||
Line 987: | Line 928: | ||
;;; insert C between A and b |
;;; insert C between A and b |
||
insert_double(A, C) -> _;</lang> |
insert_double(A, C) -> _;</lang> |
||
=={{header|PureBasic}}== |
=={{header|PureBasic}}== |
||
<lang PureBasic>Structure node |
<lang PureBasic>Structure node |
||
Line 1,043: | Line 985: | ||
Code is on the [[Doubly-Linked List]] page, in function <code>insert-between</code>. |
Code is on the [[Doubly-Linked List]] page, in function <code>insert-between</code>. |
||
=={{header|Raku}}== |
|||
(formerly Perl 6) |
|||
Using the generic definitions from [[Doubly-linked_list/Definition#Perl_6]]: |
|||
<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_Str does DLElem[Str] {} |
|||
class DLList_Str does DLList[DLElem_Str] {} |
|||
my $sdll = DLList_Str.new; |
|||
my $b = $sdll.first.post-insert('A').post-insert('B'); |
|||
$b.pre-insert('C'); |
|||
say $sdll.list; # A C B</lang> |
|||
{{out}} |
|||
<pre>A C B</pre> |
|||
=={{header|REXX}}== |
=={{header|REXX}}== |