Doubly-linked list/Traversal: Difference between revisions

m (Sort languages in alphabetical order)
Line 32:
Ada.Text_IO.New_Line;
end Traversing;</lang>
 
=={{header|ALGOL 68}}==
LinkedList.alg:
<lang algol68># Node struct - contains next and prev NODE pointers and DATA #
MODE NODE = STRUCT(
DATA data,
REF NODE prev,
REF NODE next
);
 
# List structure - contains head and tail NODE pointers #
MODE LIST = STRUCT(
REF NODE head,
REF NODE tail
);
 
# --- PREPEND - Adds a node to the beginning of the list ---#
PRIO PREPEND = 1; #/* Declares the priority of the operation */#
OP PREPEND = (REF LIST list, DATA data) VOID:
(
HEAP NODE n := (data, NIL, NIL); # Creates new node on heap #
IF head OF list IS REF NODE(NIL) THEN
head OF list := tail OF list := n
ELSE
next OF n := head OF list;
prev OF head OF list := head OF list := n
FI
);
#--- APPEND - Adds a node to the end of the list ---#
PRIO APPEND = 1;
OP APPEND = (REF LIST list, DATA data) VOID:
(
HEAP NODE n := (data, NIL, NIL);
IF head OF list IS REF NODE(NIL) THEN
head OF list := tail OF list := n
ELSE
prev OF n := tail OF list;
next OF tail OF list := tail OF list := n
FI
);
 
#--- REMOVE_FIRST - removes & returns node at end of the list ---#
PRIO REMOVE_FIRST = 1;
OP REMOVE_FIRST = (REF LIST list) DATA:
(
IF head OF list ISNT REF NODE(NIL) THEN
DATA d := data OF head OF list;
prev OF next OF head OF list := NIL;
head OF list := next OF head OF list;
d # return d #
FI
);
#--- REMOVE_LAST: removes & returns node at front of list --- #
PRIO REMOVE_LAST = 1;
OP REMOVE_LAST = (REF LIST list) DATA:
(
IF head OF list ISNT REF NODE(NIL) THEN
DATA d := data OF tail OF list;
next OF prev OF tail OF list := NIL;
tail OF list := prev OF tail OF list;
d # return d #
FI
);
#--- PURGE - removes all elements from the list ---#
PRIO PURGE = 2;
OP PURGE = (REF LIST list) VOID:
(
head OF list := tail OF list := NIL
#/* sets the refs to NIL, allowing the heap to take back the
memory */#
);
 
#--- returns the data at the end of the list ---#
PRIO LAST_IN = 2;
OP LAST_IN = (REF LIST list) DATA: (
IF head OF list ISNT REF NODE(NIL) THEN
data OF tail OF list
FI
);
 
#--- returns the data at the front of the list ---#
PRIO FIRST_IN = 2;
OP FIRST_IN = (REF LIST list) DATA: (
IF head OF list ISNT REF NODE(NIL) THEN
data OF head OF list
FI
);
 
#--- Traverses through the list forwards ---#
PROC forward traversal = (LIST list) VOID:
(
REF NODE travel := head OF list;
WHILE travel ISNT REF NODE(NIL) DO
list visit(data OF travel); # call user defined visit #
travel := next OF travel
OD
);
 
#--- Traverses through the list backwards ---#
PROC backward traversal = (LIST list) VOID:
(
REF NODE travel := tail OF list;
WHILE travel ISNT REF NODE(NIL) DO
list visit(data OF travel);
travel := prev OF travel
OD
)</lang>
 
<lang algol68>PR READ "LinkedList.alg" PR;
 
MODE EMPLOYEE = STRUCT(STRING name, INT salary, INT years);
MODE DATA = EMPLOYEE; #Sets the data type that is in the list#
 
# Function that traversals call for each node in list #
PROC list visit = (REF DATA data) VOID:
(
print((
"EMPLOYEE NAME : ", name OF data , newline,
" SALARY: " , salary OF data, newline,
" YEARS : " , years OF data, newline
))
);
 
#***************************************************************#
main:
(
EMPLOYEE empl;
name OF empl := "one";
salary OF empl := 100;
years OF empl := 10;
LIST list := (NIL, NIL);
 
list PREPEND empl;
name OF empl := "two";
salary OF empl := 200;
years OF empl := 20;
list APPEND empl;
name OF empl := "three";
salary OF empl := 300;
years OF empl := 30;
list APPEND empl;
salary OF empl := 400;
years OF empl := 40;
name OF empl := "four";
list APPEND empl;
 
forward traversal(list);
PURGE list;
forward traversal(list);
)</lang>
{{out}}
<pre>
EMPLOYEE NAME : one
SALARY: +100
YEARS : +10
EMPLOYEE NAME : two
SALARY: +200
YEARS : +20
EMPLOYEE NAME : three
SALARY: +300
YEARS : +30
EMPLOYEE NAME : four
SALARY: +400
YEARS : +40
</pre>
 
=={{header|AutoHotkey}}==
Anonymous user