54 lines
3 KiB
Rexx
54 lines
3 KiB
Rexx
/*REXX program demonstrates how to create and show a single-linked list.*/
|
|
@.=0 /*define a null linked list. */
|
|
call set@ 3 /*linked list: 12 Proth primes. */
|
|
call set@ 5
|
|
call set@ 13
|
|
call set@ 17
|
|
call set@ 41
|
|
call set@ 97
|
|
call set@ 113
|
|
call set@ 193
|
|
call set@ 241
|
|
call set@ 257
|
|
call set@ 353
|
|
call set@ 449
|
|
call list@
|
|
after = 97 /* ◄──── REXX code to do insert. */
|
|
newVal=100 /* ◄──── " " " " " */
|
|
#=@..after /* ◄──── " " " " " */
|
|
call ins@ #,newVal /* ◄──── " " " " " */
|
|
say
|
|
say 'a new value of' newval "has been inserted after element value:" after
|
|
call list@
|
|
exit /*stick a fork in it, we're done.*/
|
|
/*──────────────────────────────────INS@ subroutine─────────────────────*/
|
|
ins@: procedure expose @.; parse arg #,y
|
|
@._last=@._last+1 /*bump number of list elements. */
|
|
_=@._last
|
|
@._._value=y /*define new value list element. */
|
|
@._._next=@.#._next
|
|
@.#._next=_
|
|
@..y=_ /*set a locator pointer to self. */
|
|
@.max_width=max(@.max_width,length(y)) /*set maximum width of any value.*/
|
|
return /*return to invoker of this sub. */
|
|
/*──────────────────────────────────LIST@ subroutine────────────────────*/
|
|
list@: say; w=max(7, @.max_width ) /*use the max width of nums or 7.*/
|
|
say center('item',6) center('value',w) center('next',6)
|
|
say center('' ,6,'─') center('' ,w,'─') center('' ,6,'─')
|
|
p=1
|
|
do j=1 until p==0 /*show all entries of linked list*/
|
|
say right(j,6) right(@.p._value,w) right(@.p._next,6)
|
|
p=@.p._next
|
|
end /*j*/
|
|
return
|
|
/*──────────────────────────────────SET@ subroutine─────────────────────*/
|
|
set@: procedure expose @.; parse arg y /*get element to be added to list*/
|
|
_=@._last /*set the previous last element. */
|
|
n=_+1 /*bump last ptr in linked list. */
|
|
@._._next=n /*set the next pointer value. */
|
|
@._last=n /*define next item in linked list*/
|
|
@.n._value=y /*set item to the value specified*/
|
|
@.n._next=0 /*set the next pointer value. */
|
|
@..y=n /*set a locator pointer to self. */
|
|
@.max_width=max(@.max_width,length(y)) /*set maximum width of any value.*/
|
|
return /*return to invoker of this sub. */
|