190 lines
3.0 KiB
Plaintext
190 lines
3.0 KiB
Plaintext
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 PTR="CARD"
|
|
DEFINE NODE_SIZE="6"
|
|
TYPE SetNode=[PTR data,prv,nxt]
|
|
TYPE SetInfo=[PTR name,begin,end]
|
|
|
|
PROC PrintSet(SetInfo POINTER s)
|
|
SetNode POINTER n
|
|
CHAR ARRAY a
|
|
|
|
n=s.begin
|
|
PrintF("%S=(",s.name)
|
|
WHILE n
|
|
DO
|
|
Print(n.data)
|
|
a=n.data
|
|
IF n.nxt THEN
|
|
Print(", ")
|
|
FI
|
|
n=n.nxt
|
|
OD
|
|
PrintE(")")
|
|
RETURN
|
|
|
|
PROC CreateSet(SetInfo POINTER s CHAR ARRAY n)
|
|
s.name=n
|
|
s.begin=0
|
|
s.end=0
|
|
RETURN
|
|
|
|
PTR FUNC Find(SetInfo POINTER s CHAR ARRAY v)
|
|
SetNode POINTER n
|
|
|
|
n=s.begin
|
|
WHILE n
|
|
DO
|
|
IF SCompare(v,n.data)=0 THEN
|
|
RETURN (n)
|
|
FI
|
|
n=n.nxt
|
|
OD
|
|
RETURN (0)
|
|
|
|
BYTE FUNC Contains(SetInfo POINTER s CHAR ARRAY v)
|
|
SetNode POINTER n
|
|
|
|
n=Find(s,v)
|
|
IF n=0 THEN
|
|
RETURN (0)
|
|
FI
|
|
RETURN (1)
|
|
|
|
PROC Append(SetInfo POINTER s CHAR ARRAY v)
|
|
SetNode POINTER n,tmp
|
|
|
|
IF Contains(s,v) THEN RETURN FI
|
|
|
|
n=Alloc(NODE_SIZE)
|
|
n.data=v
|
|
n.prv=s.end
|
|
n.nxt=0
|
|
IF s.end THEN
|
|
tmp=s.end tmp.nxt=n
|
|
ELSE
|
|
s.begin=n
|
|
FI
|
|
s.end=n
|
|
RETURN
|
|
|
|
PROC Remove(SetInfo POINTER s CHAR ARRAY v)
|
|
SetNode POINTER n,prev,next
|
|
|
|
n=Find(s,v)
|
|
IF n=0 THEN RETURN FI
|
|
|
|
prev=n.prv
|
|
next=n.nxt
|
|
|
|
Free(n,NODE_SIZE)
|
|
|
|
IF prev THEN
|
|
prev.nxt=next
|
|
ELSE
|
|
s.begin=next
|
|
FI
|
|
IF next THEN
|
|
next.prv=prev
|
|
ELSE
|
|
s.end=prev
|
|
FI
|
|
RETURN
|
|
|
|
PROC AppendSet(SetInfo POINTER s,other)
|
|
SetNode POINTER n
|
|
|
|
n=other.begin
|
|
WHILE n
|
|
DO
|
|
Append(s,n.data)
|
|
n=n.nxt
|
|
OD
|
|
RETURN
|
|
|
|
PROC RemoveSet(SetInfo POINTER s,other)
|
|
SetNode POINTER n
|
|
|
|
n=other.begin
|
|
WHILE n
|
|
DO
|
|
Remove(s,n.data)
|
|
n=n.nxt
|
|
OD
|
|
RETURN
|
|
|
|
PROC Clear(SetInfo POINTER s)
|
|
SetNode POINTER n
|
|
|
|
DO
|
|
n=s.begin
|
|
IF n=0 THEN RETURN FI
|
|
Remove(s,n.data)
|
|
OD
|
|
RETURN
|
|
|
|
PROC Union(SetInfo POINTER a,b,res)
|
|
Clear(res)
|
|
AppendSet(res,a)
|
|
AppendSet(res,b)
|
|
RETURN
|
|
|
|
PROC Difference(SetInfo POINTER a,b,res)
|
|
Clear(res)
|
|
AppendSet(res,a)
|
|
RemoveSet(res,b)
|
|
RETURN
|
|
|
|
PROC SymmetricDifference(SetInfo POINTER a,b,res)
|
|
SetInfo tmp1,tmp2
|
|
|
|
CreateSet(tmp1,"")
|
|
CreateSet(tmp2,"")
|
|
Difference(a,b,tmp1)
|
|
Difference(b,a,tmp2)
|
|
Union(tmp1,tmp2,res)
|
|
Clear(tmp1)
|
|
Clear(tmp2)
|
|
RETURN
|
|
|
|
PROC TestSymmetricDifference(SetInfo POINTER a,b,res)
|
|
SymmetricDifference(a,b,res)
|
|
PrintF("%S XOR %S: ",a.name,b.name)
|
|
PrintSet(res)
|
|
RETURN
|
|
|
|
PROC TestDifference(SetInfo POINTER a,b,res)
|
|
Difference(a,b,res)
|
|
PrintF("%S-%S: ",a.name,b.name)
|
|
PrintSet(res)
|
|
RETURN
|
|
|
|
PROC Main()
|
|
SetInfo s1,s2,s3
|
|
|
|
Put(125) PutE() ;clear screen
|
|
|
|
AllocInit(0)
|
|
CreateSet(s1,"A")
|
|
CreateSet(s2,"B")
|
|
CreateSet(s3,"C")
|
|
|
|
Append(s1,"John") Append(s1,"Bob")
|
|
Append(s1,"Mary") Append(s1,"Serena")
|
|
Append(s2,"Jim") Append(s2,"Mary")
|
|
Append(s2,"John") Append(s2,"Bob")
|
|
|
|
PrintSet(s1) PrintSet(s2)
|
|
PutE()
|
|
|
|
TestSymmetricDifference(s1,s2,s3)
|
|
TestDifference(s1,s2,s3)
|
|
TestDifference(s2,s1,s3)
|
|
|
|
Clear(s1)
|
|
Clear(s2)
|
|
Clear(s3)
|
|
RETURN
|