begin
comment Test rig for CACM Algorithms 100 and 101 to illustrate their failures;
comment
ALGORITHM 100
ADD ITEM TO CHAIN-LINKED LIST
PHILIP J. KIVIAT
United States Steel Corp., Appl. Research Lab., Monroeville,
Penn. ;
procedure inlist (t,info,m,list,n,first,flag,addr,listfull);
integer n,m,first,flag,t; integer array info,list,addr;
label listfull;
comment inlist adds the information pair {t,info} to the chain-
link structured matrix list (i,j), where t is an order key >= 0, and
info(k) an information vector associated with t. info(k) has
dimension m, list(i,j) has dimensions (n * (m+3)). flag denotes
the head and tail of list(i,j), and first contains the address of
the first (lowest order) entry in list(i,j). addr(k) is a vector
containing the addresses of available (empty) rows in list(i,j).
Initialization: list(i,m+2) = flag, for some i <= n. If list(i,j) is
filled exit is to listfull;
begin integer i, j, k, link1, link2;
L0: if addr [1] = 0 then goto listfull; i ≔ 1;
L1: if list [i,1] ⩽ t
then begin if list [i ,2] ≠ 0 then begin link1 ≔ m + 2;
link2 ≔ m + 3; go to L2 end else begin if
list [i,m+2] =flag then begin i ≔ flag;
link1 ≔ m+3; link2 ≔ m+2; go to L3 end
else begin i ≔ i+1; go to L1 end end end
else begin link1 ≔ m+3; link2 ≔ m+2 end;
L2: if list [i,link2] ≠ flag
then begin k ≔ i; i ≔ ist [i,link2];
if (link2 = m+2 ∧ list [i,1] ⩽ t) ∨
(link2 ≠ m+2 ∧ list [i,1] > t) then go to L4
else go to L1 end
else begin list [i,link2] ≔ addr [1] end;
L3: j ≔ addr [1]; list [j,link1] ≔ i;
list [j ,link2] ≔ flag; if link2 = m + 2 then
first ≔ addr [1]; go to L5;
L4: j ≔ addr [1]; list [j,link1] ≔ list [i ,link1];
list [i,link1] ≔ list [k,link2] ≔ addr [1];
list [j,link2] ≔ i;
L5: list [j,1] ≔ t; for i ≔ 1 step 1 until m do
list [j,i+1] ≔ nfo [i]; for i ≔ 1 step 1 until n-1 do
addr [i] ≔ addr [i+1]; addr [n] ≔ 0
end inlist;
comment
ALGORITHM 101
REMOVE ITEM FROM CHAIN-LINKED LIST
PHILIP J. KIVIAT
United States Steel Corp., Appl. Res. Lab., Monroeville,
Penn. ;
procedure outlist (vector,m,list,n,first,flag,addr);
integer n,m,first,flag; integer array vector,list,addr;
comment outlist removes the first. entry (information pair with
lowest order key) from list(i,j) and puts it in vector(k);
begin integer i;
for i ≔ 1 step 1 until m+1 do vector[i] ≔ ist [first,i];
for i ≔ n-1 step -1 until 1 do addr [i+1] ≔ addr [i];
addr [1] ≔ first;
if list [first,m+3] = flag then
begin list [1,m+2] ≔ flag; first ≔ 1;
for i ≔ 1 step 1 until n do addr [i] ≔ i end
else begin first ≔ list [first,m+3];
list [first,m+2] ≔ flag end;
for i ≔ 1 step 1 until m+3 do list [addr[1], i] ≔ 0
end outlist ;
procedure fill list (tvalues,info,m,list,n,first,flag,addr,listfull, cause failure);
comment Fill list with sample data using Algorithm 100: inlist;
integer n, m, first, flag;
integer array addr, info, list, tvalues;
label listfull;
boolean cause failure;
begin
integer i, j, t;
for i ≔ 1 step 1 until n do
begin
comment set the key;
t ≔ tvalues[i];
comment set arbitrary values to be associated with the key;
for j ≔ 1 step 1 until m do
begin
info[j] ≔ 2×i + j
end;
if cause failure then
begin
info[1] ≔ 0
end;
outstrintnl(“Adding key ”, t);
inlist(t, info, m, list, n, first, flag, addr, listfull);
showlist(list, first, m, n, flag);
checklist(list, first, m, n, flag, i)
end
end fill list;
procedure showlist(list, first, m, n, flag);
comment show the contents of the list, the end is
assumed to be indicated by list[i, m+3] = flag;
integer array list;
integer first, m, n, flag;
begin
integer i, prev;
outstring(1, “List contents: ”);
i ≔ first;
prev ≔ flag;
next:
if i = flag then go to endofproc;
prev ≔ i;
outinteger(1, list[i, 1]);
i ≔ list[i, m+3];
go to next;
endofproc:
outstring(1, “\n”)
end showlist;
procedure checklist(list, first, m, n, flag, list length);
comment check that list is sorted from 1 ... list length
and of the indicated length;
integer array list;
integer first, m, n, flag, list length;
begin
boolean error;
error ≔ false;
if first < 1 ∨ first > n then
begin
outstrintnl(“Invalid v̲a̲l̲u̲e̲ f̲o̲r̲ first: ”, first);
error ≔ true
end
else
begin
integer checked, i, prev, t;
comment dummy key for comparison at the start of the list;
prev ≔ -1;
i ≔ first;
comment how many have been checked;
checked ≔ 0;
for checked ≔ checked + 1 while (checked ⩽ list length ∧ ¬error ∧ i ≠ flag) do
begin
t ≔ list[i, 1];
if t < prev then
begin
error ≔ true;
outstrint(“key ”, t);
outstrintnl(“out of order at position ”, i)
end;
prev ≔ t;
comment follow the n̲e̲x̲t̲ link.;
i ≔ list[i, m + 3]
end;
if checked ≠ list length + 1 then
begin
outstrint(“checking prematurely terminated after ”, checked - 1);
outstrintnl(“rather than ”, list length)
end
end
end checklist;
procedure clear list(m, list, n, first, addr, list length);
comment Clear the list sorted from 1 ... list length using
Algorithm 101: outlist;
integer array addr, list;
integer first, m, n, list length;
begin
comment Variables for the outlist procedure;
integer array vector[1:m + 1];
integer i;
outstring(1, “Clearing the list.\n”);
for i ≔ 1 step 1 until list length do
begin
outlist(vector, m, list, n, first, flag, addr)
end;
if list[1, m+2] ≠ flag then
begin
outstrintnl(“list[1, m+2] has incorrect v̲a̲l̲u̲e̲ f̲o̲r̲ an empty list: ”, list[1, m+2])
end;
if list[1, 1] > 0 then
begin
outstrintnl(“list[1, 1] has incorrect v̲a̲l̲u̲e̲ f̲o̲r̲ an empty list: ”, list[1, 1])
end
end clear list;
procedure outstrint(str, i);
comment output str following by i;
string str;
integer i;
begin
outstring(1, str); outinteger(1, i)
end outstrint;
procedure outstrintnl(str, i);
comment output str following by i and terminate with a newline;
string str;
integer i;
begin
outstrint(str, i);
outstring(1, “\n”)
end outstrintnl;
comment Beginning of the test program;
comment Variables for the inlist procedure;
integer n, m, first, flag;
comment info[1:m], list[1:n, 1:m+3], addr[1:n];
comment 100 must be <= n, and 4 should be >= m;
integer array info[1:4], list[1:100, 1:4+3], addr[1:100];
comment Variables for the test procedure;
integer i, j;
comment 100 must be <= n;
integer array tvalues[1:100];
boolean cause failure;
comment capacity of the list;
n ≔ 4;
comment amount of data associated with each key;
m ≔ 4;
comment index of the head item in list.
first := -1;
comment end-of-list marker;
flag ≔ -1;
comment whether to cause failures or not;
cause failure ≔ false;
comment set up the list of free locations;
for i ≔ 1 step 1 until n do
begin
addr[i] ≔ i
end;
comment Set necessary initial terminating marker;
list[1, m + 2] ≔ flag;
comment Set up the tvalues to be used;
tvalues[1] ≔ 7;
tvalues[2] ≔ 13;
tvalues[3] ≔ 6;
tvalues[4] ≔ 11;
if cause failure then
begin
outstring(1, “This run should cause one o̲r̲ more failures.\n”)
end
else
begin
outstring(1, “Set cause failure := t̲r̲u̲e̲; t̲o̲ demonstrate failures.\n”)
end;
if cause failure then
begin
comment causes multiple failures;
list[1,2] ≔ 1
end;
if list[1, 2] ≠ 1 then
begin
comment The following is needed to avoid subscript error if list[1,2] != 0;
list[1, m + 3] ≔ flag
end;
fill list(tvalues, info, m, list, n, first, flag, addr, listfull, cause failure);
comment try to fill the list beyond its capacity.
This should fail with a jump to listfull;
inlist(n + 1, info, m, list, n, first, flag, addr, listfull);
outstring(1, “Failed t̲o̲ correctly detect attempt t̲o̲ add too many entries.\n”);
go to testend;
listfull:
if i = (n+1) then
begin
outstrintnl(“List full correctly detected when attempting t̲o̲ add entry ”, i)
end;
testend:
clear list(m, list, n, first, addr, n)
end