Doubly-linked list/Element insertion: Difference between revisions

Content added Content deleted
(Racket)
(Updated D entry)
Line 230: Line 230:
struct Node(T) {
struct Node(T) {
T data;
T data;
Node* prev, next;
typeof(this)* prev, next;

this(T data_, Node* prev_=null, Node* next_=null) {
data = data_;
prev = prev_;
next = next_;
}
}
}


/// If prev is null, prev gets to point to a new node.
void show(T)(Node!(T)* list) {
void insertAfter(T)(ref Node!T* prev, T item) pure nothrow {
while (list) {
write(list.data, " ");
list = list.next;
}
writeln();
}

/// If prev is null, prev gets to point to a new node
void insertAfter(T)(ref Node!(T)* prev, T item) {
if (prev) {
if (prev) {
auto newNode = new Node!T(item, prev, prev.next);
auto newNode = new Node!T(item, prev, prev.next);
Line 256: Line 242:
} else
} else
prev = new Node!T(item);
prev = new Node!T(item);
}

void show(T)(Node!T* list) {
while (list) {
write(list.data, " ");
list = list.next;
}
writeln;
}
}


Line 261: Line 255:
Node!(string)* list;
Node!(string)* list;
insertAfter(list, "A");
insertAfter(list, "A");
show(list);
list.show;
insertAfter(list, "B");
insertAfter(list, "B");
show(list);
list.show;
insertAfter(list, "C");
insertAfter(list, "C");
show(list);
list.show;
}</lang>
}</lang>
{{out}}
Output:
<pre>A
<pre>A
A B
A B