Doubly-linked list/Element insertion: Difference between revisions

Content added Content deleted
(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}}==