// java example of do-list

public class do_list {

    // storage = array 1000
    // free = 1
    // end = 1000

    static int[] storage = new int[1000];
    static int free = 1;
    static int end = 1000;

    // access functions

    // to setnum a b = storage[a] = b
    // to setlink a b = storage[a+1] = b
    // to getnum a = storage[a]
    // to getlink a = storage[a+1]
    // to notnull p = p != 0
    // to isnull p = p == 0

    public static void setnum(int a, int b) {
        storage[a] = b;
    }

    public static void setlink(int a, int b) {
        storage[a + 1] = b;
    }

    public static int getnum(int a) {
        return storage[a];
    }

    public static int getlink(int a) {
        return storage[a + 1];
    }

    public static boolean notnull(int p) {
        return (p != 0);
    }

    public static boolean isnull(int p) {
        return (p == 0);
    }

    public static void error(String m) {
        System.out.println(m);
    }

    // create a new data item stored a number n

    // to newitem n | a =
    //   if free >= end
    //     error "no more memory"
    //   a = free
    //   free = free + 2
    //   setnum a n
    //   setlink a 0
    //   a                   // return a new data item

    public static int newitem(int n) {
        if (free >= end) {
            error("no more memory");
        }
        int a = free;
        free = free + 2;
        setnum(a, n);
        setlink(a, 0);
        return a;
    }

    // to newlist = newitem 0 // create an empty list, return a handle to its
    //                        //header

    public static int newlist() {
        return newitem(0);
    }

    // to insert a k =        // insert an item "a" into the list "k"
    //   setlink a (getlink k)
    //   setlink k a

    public static void insert(int a, int k) {
        setlink(a, getlink(k));
        setlink(k, a);
    }

    // to makelist | k a =
    //   k = newlist          // make an empty list
    //   a = newitem 2        // make a new node storing 2
    //   insert a k
    //   insert (newitem 3) k
    //   insert (newitem 5) k
    //   insert (newitem 7) k
    //   k                    // return the list

    public static int makelist() {
        int k = newlist();
        int a = newitem(2);
        insert(a, k);
        insert(newitem(3), k);
        insert(newitem(5), k);
        insert(newitem(7), k);
        return k;
    }

    // to printlist k | p =
    //   p = getlink k      // get the list
    //   while notnull p
    //     print (getnum p) space
    //     p = getlink p    // get to the next item
    //   nl

    public static void printlist(int k) {
        int p = getlink(k);
        while (notnull(p)) {
            System.out.print(getnum(p) + " ");
            p = getlink(p);
        }
        System.out.println();
    }

    // to testlist | k =
    //   k = makelist
    //   printlist k

    public static void main(String[] args) {
        int k = makelist();
        printlist(k);
    }
}
