Doubly-linked list/Traversal: Difference between revisions

m
Sort languages in alphabetical order
(Nimrod -> Nim)
m (Sort languages in alphabetical order)
Line 397:
=={{header|Fortran}}==
see [[Doubly-linked list/Definition#Fortran]]
 
=={{header|Go}}==
Code is identical to that for task Doubly-linked list/Element insertion except for addition of section at the end of main noted "traverse from end to beginning." Traversal from beginning to end is adequately demonstrated by the String method of dlList.
 
Also note that there is a doubly linked list in the Go standard library in package container/list.
<lang go>package main
 
import "fmt"
 
type dlNode struct {
string
next, prev *dlNode
}
 
type dlList struct {
head, tail *dlNode
}
 
func (list *dlList) String() string {
if list.head == nil {
return fmt.Sprint(list.head)
}
r := "[" + list.head.string
for p := list.head.next; p != nil; p = p.next {
r += " " + p.string
}
return r + "]"
}
 
func (list *dlList) insertTail(node *dlNode) {
if list.tail == nil {
list.head = node
} else {
list.tail.next = node
}
node.next = nil
node.prev = list.tail
list.tail = node
}
 
func (list *dlList) insertAfter(existing, insert *dlNode) {
insert.prev = existing
insert.next = existing.next
existing.next.prev = insert
existing.next = insert
if existing == list.tail {
list.tail = insert
}
}
 
func main() {
dll := &dlList{}
fmt.Println(dll)
a := &dlNode{string: "A"}
dll.insertTail(a)
dll.insertTail(&dlNode{string: "B"})
fmt.Println(dll)
dll.insertAfter(a, &dlNode{string: "C"})
fmt.Println(dll)
 
// traverse from end to beginning
fmt.Print("From tail:")
for p := dll.tail; p != nil; p = p.prev {
fmt.Print(" ", p.string)
}
fmt.Println("")
}</lang>
Output:
<pre>
<nil>
[A B]
[A C B]
From tail: B C A
</pre>
 
=={{header|Haskell}}==
<lang haskell>main = print . traverse True $ create [10,20,30,40]
 
data DList a = Leaf | Node { prev::(DList a), elt::a, next::(DList a) }
 
create = go Leaf
where go _ [] = Leaf
go prev (x:xs) = current
where current = Node prev x next
next = go current xs
 
isLeaf Leaf = True
isLeaf _ = False
 
lastNode Leaf = Leaf
lastNode dl = until (isLeaf.next) next dl
 
traverse _ Leaf = []
traverse True (Node l v Leaf) = v : v : traverse False l
traverse dir (Node l v r) = v : traverse dir (if dir then r else l)</lang>
 
==Icon and {{header|Unicon}}==
Line 518 ⟶ 613:
10</pre>
Uses the <code>print()</code> function from [[Rhino]] or [[SpiderMonkey]].
 
=={{header|Go}}==
Code is identical to that for task Doubly-linked list/Element insertion except for addition of section at the end of main noted "traverse from end to beginning." Traversal from beginning to end is adequately demonstrated by the String method of dlList.
 
Also note that there is a doubly linked list in the Go standard library in package container/list.
<lang go>package main
 
import "fmt"
 
type dlNode struct {
string
next, prev *dlNode
}
 
type dlList struct {
head, tail *dlNode
}
 
func (list *dlList) String() string {
if list.head == nil {
return fmt.Sprint(list.head)
}
r := "[" + list.head.string
for p := list.head.next; p != nil; p = p.next {
r += " " + p.string
}
return r + "]"
}
 
func (list *dlList) insertTail(node *dlNode) {
if list.tail == nil {
list.head = node
} else {
list.tail.next = node
}
node.next = nil
node.prev = list.tail
list.tail = node
}
 
func (list *dlList) insertAfter(existing, insert *dlNode) {
insert.prev = existing
insert.next = existing.next
existing.next.prev = insert
existing.next = insert
if existing == list.tail {
list.tail = insert
}
}
 
func main() {
dll := &dlList{}
fmt.Println(dll)
a := &dlNode{string: "A"}
dll.insertTail(a)
dll.insertTail(&dlNode{string: "B"})
fmt.Println(dll)
dll.insertAfter(a, &dlNode{string: "C"})
fmt.Println(dll)
 
// traverse from end to beginning
fmt.Print("From tail:")
for p := dll.tail; p != nil; p = p.prev {
fmt.Print(" ", p.string)
}
fmt.Println("")
}</lang>
Output:
<pre>
<nil>
[A B]
[A C B]
From tail: B C A
</pre>
 
=={{header|Haskell}}==
<lang haskell>main = print . traverse True $ create [10,20,30,40]
 
data DList a = Leaf | Node { prev::(DList a), elt::a, next::(DList a) }
 
create = go Leaf
where go _ [] = Leaf
go prev (x:xs) = current
where current = Node prev x next
next = go current xs
 
isLeaf Leaf = True
isLeaf _ = False
 
lastNode Leaf = Leaf
lastNode dl = until (isLeaf.next) next dl
 
traverse _ Leaf = []
traverse True (Node l v Leaf) = v : v : traverse False l
traverse dir (Node l v r) = v : traverse dir (if dir then r else l)</lang>
 
=={{header|Liberty BASIC}}==
Anonymous user