Doubly-linked list/Definition: Difference between revisions

Added solution for Action!
(Add swift)
(Added solution for Action!)
Line 8:
{{Template:See also lists}}
<br><br>
 
=={{header|Action!}}==
The user must type in the monitor the following command after compilation and before running the program!<pre>SET EndProg=*</pre>
{{libheader|Action! Tool Kit}}
<lang Action!>CARD EndProg ;required for ALLOCATE.ACT
 
INCLUDE "D2:ALLOCATE.ACT" ;from the Action! Tool Kit. You must type 'SET EndProg=*' from the monitor after compiling, but before running this program!
 
DEFINE NODE_SIZE="5"
TYPE ListNode=[BYTE data CARD prv,nxt]
 
ListNode POINTER listBegin,listEnd
 
PROC AddBegin(BYTE v)
ListNode POINTER n
 
n=Alloc(NODE_SIZE)
n.data=v
n.prv=0
n.nxt=listBegin
IF listBegin THEN
listBegin.prv=n
ELSE
listEnd=n
FI
listBegin=n
RETURN
 
PROC AddEnd(BYTE v)
ListNode POINTER n
 
n=Alloc(NODE_SIZE)
n.data=v
n.prv=listEnd
n.nxt=0
IF listEnd THEN
listEnd.nxt=n
ELSE
listBegin=n
FI
listEnd=n
RETURN
 
PROC AddBefore(BYTE v ListNode POINTER node)
ListNode POINTER n,tmp
 
IF node=0 THEN
PrintE("The node is null!") Break()
ELSEIF node=listBegin THEN
AddBegin(v)
ELSE
n=Alloc(NODE_SIZE)
n.data=v
n.prv=node.prv
n.nxt=node
tmp=node.prv
tmp.nxt=n
node.prv=n
FI
RETURN
 
PROC AddAfter(BYTE v ListNode POINTER node)
ListNode POINTER n,tmp
 
IF node=0 THEN
PrintE("The node is null!") Break()
ELSEIF node=listEnd THEN
AddEnd(v)
ELSE
n=Alloc(NODE_SIZE)
n.data=v
n.nxt=node.nxt
n.prv=node
tmp=node.nxt
tmp.prv=n
node.nxt=n
FI
RETURN
 
PROC Clear()
ListNode POINTER n,next
 
n=listBegin
WHILE n
DO
next=n.nxt
Free(n,NODE_SIZE)
n=next
OD
listBegin=0
listEnd=0
RETURN
 
PROC PrintList()
ListNode POINTER n
 
n=listBegin
Print("(")
WHILE n
DO
PrintB(n.data)
IF n.nxt THEN
Print(", ")
FI
n=n.nxt
OD
PrintE(")")
RETURN
 
PROC TestAddBegin(BYTE v)
AddBegin(v)
PrintF("Add %B at the begin:%E",v)
PrintList()
RETURN
 
PROC TestAddEnd(BYTE v)
AddEnd(v)
PrintF("Add %B at the end:%E",v)
PrintList()
RETURN
 
PROC TestAddBefore(BYTE v ListNode POINTER node)
AddBefore(v,node)
PrintF("Add %B before %B:%E",v,node.data)
PrintList()
RETURN
 
PROC TestAddAfter(BYTE v ListNode POINTER node)
AddAfter(v,node)
PrintF("Add %B after %B:%E",v,node.data)
PrintList()
RETURN
 
PROC TestClear()
Clear()
PrintE("Clear the list:")
PrintList()
RETURN
 
PROC Main()
Put(125) PutE() ;clear screen
AllocInit(0)
listBegin=0
listEnd=0
 
PrintList()
TestAddBegin(1)
TestAddBegin(2)
TestAddEnd(3)
TestAddBefore(4,listBegin.nxt)
TestAddBefore(5,listBegin)
TestAddAfter(6,listEnd.prv)
TestAddAfter(7,listEnd)
TestClear()
RETURN</lang>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Doubly-linked_list_definition.png Screenshot from Atari 8-bit computer]
<pre>
()
Add 1 at the begin:
(1)
Add 2 at the begin:
(2, 1)
Add 3 at the end:
(2, 1, 3)
Add 4 before 1:
(2, 4, 1, 3)
Add 5 before 2:
(5, 2, 4, 1, 3)
Add 6 after 1:
(5, 2, 4, 1, 6, 3)
Add 7 after 3:
(5, 2, 4, 1, 6, 3, 7)
Clear the list:
()
</pre>
 
=={{header|Ada}}==
Anonymous user