-- filename: listn.adb 11:40AM 9/7/95 with gnat.io; use gnat.IO; package body listn is function cons(x:in element; toList : in pointer) return pointer is L: pointer; begin L := new listnode; L.data := x; L.next := toList; return L; end cons; function first(ofList: in pointer) return element is begin return ofList.data; end first; function rest(ofList: in pointer) return pointer is norest : exception; begin if ofList = null then raise norest; else return ofList.next; end if; exception when norest => put_line("tried to take rest of empty list"); return null; end rest; function Empty return pointer is begin return null; end Empty; function isEmpty(L: in pointer) return boolean is begin return L=null; end isEmpty; function IsEqual(L1,L2: in pointer) return boolean is begin if L1=null then return L2=null; elsif L1.data=L2.data then return IsEqual(L1.next, L2.next); else return FALSE; end if; end IsEqual; procedure insert(value:in element; afterX, inList: in out pointer) is t: pointer; begin t := new listnode; t.data := value; if inList = null then inList := t; -- inserting into the empty list t.next := null; else t.next := afterX.next; -- insert after afterX afterX.next := t; end if; end insert; procedure setFirst(L: in out pointer; NewV: in Element) is begin L.data := NewV; end setFirst; procedure setRest(L: in out pointer; NewR: in pointer) is begin L.next := NewR; end setRest; procedure delete(x, precededByY, inList: in out pointer) is begin if precededByY = null then inList := inList.next; -- deleting first element else precededByY.next := x.next; end if; -- dispose(x); or free(x); if you choose to define it and do so end delete; end listn;