Here is the main program to test your code for PersistentTreeInsert:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "persistent.h"
/* Given a persistent dynamic set t and a new value v to insert, */
/* returns a persistent dynamic set obtained from t by inserting v. */
tree PersistentTreeInsert (tree, int);
tree PersistentTreeInsert (tree t, int v) {
/* Your code goes here. */
}
void InorderTreeWalk (tree);
void InorderTreeWalk (tree x) {
if (! Nil (x)) {
InorderTreeWalk (Left(x));
printf ("%d\n", Key(x)); /* or whatever */
InorderTreeWalk (Right(x));
}
}
void main(void)
{
tree t1, t2, t3;
t1 = PersistentTreeInsert (NIL, 1);
t1 = PersistentTreeInsert (t1, 2);
t1 = PersistentTreeInsert (t1, 3);
t1 = PersistentTreeInsert (t1, 4);
t1 = PersistentTreeInsert (t1, 5);
t1 = PersistentTreeInsert (t1, 6);
t1 = PersistentTreeInsert (t1, 7);
t1 = PersistentTreeInsert (t1, 8);
t1 = PersistentTreeInsert (t1, 9);
t1 = PersistentTreeInsert (t1, 10);
t2 = PersistentTreeInsert (NIL, 4);
t2 = PersistentTreeInsert (t2, 1);
t2 = PersistentTreeInsert (t2, 6);
t2 = PersistentTreeInsert (t2, 5);
t2 = PersistentTreeInsert (t2, 9);
t2 = PersistentTreeInsert (t2, 8);
t2 = PersistentTreeInsert (t2, 10);
t2 = PersistentTreeInsert (t2, 3);
t2 = PersistentTreeInsert (t2, 2);
t2 = PersistentTreeInsert (t2, 7);
t3 = PersistentTreeInsert (NIL, 87);
t3 = PersistentTreeInsert (t3, 91);
t3 = PersistentTreeInsert (t3, 55);
t3 = PersistentTreeInsert (t3, 101);
t3 = PersistentTreeInsert (t3, 44);
/* Print out all three trees in sorted order. */
InorderTreeWalk (t1);
InorderTreeWalk (t2);
InorderTreeWalk (t3);
}
Here is persistent.h:
/****************************************************************************** * * Persistent dynamic sets. * ******************************************************************************/ /****************************************************************************** * * Private. * No client should depend on this part. * ******************************************************************************/ typedef int tree; /****************************************************************************** * * Public. * This is the abstract data type that clients can depend on. * ******************************************************************************/ extern tree NIL; extern tree MakeTree (int, tree, tree); extern int Nil (tree); extern int Key (tree); extern tree Left (tree); extern tree Right (tree);
Here is one particular implementation of persistent dynamic sets. No client should depend on any of this code. It's probably not a good idea even to look at this code until you've completed Problem 14-1.
#include#include #include "persistent.h" /****************************************************************************** * * Implementation of persistent dynamic sets. * Everything in this file is private. * ******************************************************************************/ #define nodesize 3 #define offset_key 1 #define offset_left 2 #define offset_right 0 #define disguise 8421 #define garbage -7 #define heapsize 5000 int heap[heapsize]; int avail = 0; tree NIL = -17; tree MakeTree (int z, tree t1, tree t2) { tree t = avail; avail = avail + nodesize; if (avail > heapsize) { fprintf (stderr, "Dynamic set overflow!\nGoing down in flames!!!\n"); exit(1); } else { heap[t+offset_key] = z; heap[t+offset_left] = t1; heap[t+offset_right] = t2; return t + disguise; } } int Nil (tree t) { return (t == NIL) ? 1 : 0; } int Fetch (tree, int); int Fetch (tree t0, int o) { char reply; tree t = t0 - disguise; if ((0 <= t) && (t < heapsize)) return heap[t + o]; else { fprintf (stderr, "Sorry, you have a bug in your program.\n"); fprintf (stderr, "Garbage in, garbage out.\n"); fprintf (stderr, "Shall I erase your hard disk (y/n)? "); scanf ("%c", &reply); if (reply == 'y') fprintf (stderr, "You can't rely on a buggy program" " to erase your disk!!!\n"); exit(1); } } int Key (tree t) { return Fetch (t, offset_key); } tree Left (tree t) { return Fetch (t, offset_left); } tree Right (tree t) { return Fetch (t, offset_right); }