/* 2dtree. C -- 2-D tree implementation file */<br/> # include "2dtree. H "</P> <p>/* local function declaration */</P> <p>/* queue part */<br/> static queuenode * makenode_q (node * const Pn, const int index); </P> <p>/* 2-D tree part */<br/> static node * makenode_t (const item * const PI ); <br/> static void release_t (node * const PN ); </P> <p>/* interface function definition */</P> <p>/* queue part */<br/> bool initialize_q (queue * const PQ) <br/> {<br/> * PQ = (struct queue *) malloc (sizeof (St Ruct Queue); <br/> If (null = * PQ) <br/> return false; <br/> (* PQ)-> front = (* PQ) -> rear = NULL; <br/> (* PQ)-> current = 0; </P> <p> return true; <br/>}</P> <p> bool isempty_q (const queue * const PQ) <br/>{< br/> switch (* PQ)-> current) <br/>{< br/> case 0: Return true; <br/> default: Return false; <br/>}</P> <p> bool enqueue_q (const queue * const PQ, node * const Pn, const int index) <br/ >{< Br/> queuenode * newqnode; </P> <p> newqnode = makenode_q (Pn, index); <br/> If (null = newqnode) <br/> return false; <br/> If (isempty_q (PQ) <br/> (* PQ)-> front = (* PQ)-> rear = newqnode; <br/> else <br/> {<br/> (* PQ)-> rear-> next = newqnode; <br/> (* PQ) -> rear = newqnode; <br/>}< br/> (* PQ)-> current ++; </P> <p> return true; <br/>}</P> <p> bool dequeue_q (const queue * const PQ, queuenode * Const pqn) <br/>{< br/> queuenode * record; </P> <p> If (isempty_q (PQ) <br/> return false; <br/> record = (* PQ)-> front; <br/> * pqn = * record; <br/> (* PQ) -> front = record-> next; <br/> If (null = (* PQ)-> front) <br/> (* PQ)-> rear = NULL; <br/> free (record); <br/> (* PQ)-> current --; </P> <p> return true; <br/>}</P> <p> void release_q (const queue * const PQ) <br/>{< br/> queuenode * record, * SC An; </P> <p> scan = (* PQ)-> front; <br/> while (scan! = NULL) <br/>{< br/> record = scan; <br/> scan = scan-> next; <br/> free (record ); <br/>}< br/> free (* PQ ); <br/>}</P> <p>/* 2-D tree part */</P> <p> bool initialize_t (twodtree * const pt) <br/>{< br/> * PT = (struct twodtree *) malloc (sizeof (struct twodtree); <br/> If (null = * PT) <br/> return false; <br/> (* PT)-> root = NULL; <br/> (* PT)-> current = 0; </P> <p> return true; <br/>}</P> <p> bool isempty_t (C Onst twodtree * const pt) <br/>{< br/> switch (* PT)-> current) <br/>{< br/> case 0: Return true; <br/> default: Return false; <br/>}</P> <p> bool insert_t (const twodtree * const PT, const item * const PI) <br/>{< br/> node * newnode, * parent, * scan; <br/> int index; </P> <p> newnode = makenode_t (PI); <br/> If (null = newnode) <br/> return false; <br/> If (isempty_t (PT) <br/> (* PT)-> root = Newnode; <br/> else <br/> {<br/> scan = (* PT)-> root; <br/>/* item [0] is odd number level. */<br/> Index = 0; <br/> while (scan! = NULL) <br/>{< br/> parent = scan; <br/> If (PI [Index] <scan-> item [Index]) <br/> scan = scan-> left; <br/>/* duplicate will be added to right subtree. */<br/> else <br/> scan = scan-> right; <br/> index ^ = mask; <br/>}< br/>/* duplicate will be added to right subtree. */<br/> index ^ = mask; <br/> If (PI [Index] <parent-> item [Index]) <br/> parent-> left = newnode; <br/> else <br/> parent-> right = Newnode; <br/>}< br/> (* PT)-> current ++; </P> <p> return true; <br/>}</P> <p> int find_t (const twodtree * const PT, const item * const low, const item * const high, void (* pfun) (const node * const PN) <br/>{< br/> queue; <br/> queuenode * qnode; <br/> node * scan; <br/> int count, index; </P> <p> If (isempty_t (PT) <br/> return 0; <br/> initialize_q (& Queue ); <br/> If (false = initialize_q (& Queue) <br/>{< br/> puts ("out of space. "); <br/> return 0; <br/>}< br/> qnode = (queuenode *) malloc (sizeof (queuenode )); <br/> If (null = qnode) <br/>{< br/> release_q (& Queue); <br/> puts ("out of space. "); <br/> return 0; <br/>}< br/> COUNT = 0; <br/> enqueue_q (& queue, (* PT)-> root, 0); <br/> while (! Isempty_q (& Queue) <br/>{< br/> dequeue_q (& queue, qnode); <br/> scan = qnode-> node; <br/> Index = qnode-> index; <br/> If (low [0] <= scan-> item [0] & scan-> item [0] <= high [0] & <br/> low [1] <= scan-> item [1] & scan-> item [1] <= high [1] & <br/> false = scan-> deleted) <br/>{< br/> (* pfun) (SCAN); <br/> count ++; <br/>}< br/> If (low [Index] <= scan-> item [Index] & scan-> left! = NULL) <br/> enqueue_q (& queue, scan-> left, index ^ mask ); <br/> If (scan-> item [Index] <= high [Index] & scan-> right! = NULL) <br/> enqueue_q (& queue, scan-> right, index ^ mask); <br/>}< br/> release_q (& Queue ); <br/> free (qnode); </P> <p> return count; <br/>}</P> <p> int delete_t (const twodtree * const PT, const item * const PI) <br/>{< br/> node * scan; <br/> int count, index; </P> <p> scan = (* PT)-> root; <br/> COUNT = 0; <br/> Index = 0; <br/> while (scan! = NULL) <br/>{< br/> If (PI [Index] <scan-> item [Index]) <br/> scan = scan-> left; <br/> else if (scan-> item [Index] <PI [Index]) <br/> scan = scan-> right; <br/> else <br/> {<br/> If (PI [index ^ mask] = scan-> item [index ^ mask] & <br/> false = scan-> deleted) <br/>{< br/> scan-> deleted = true; <br/> count ++; <br/>}< br/>/* Because duplicate has been added to right subtree. */<br/> scan = Scan -> Right; <br/>}< br/> index ^ = mask; <br/>}< br/> (* PT)-> current-= count; </P> <p> return count; <br/>}</P> <p> void release_t (const twodtree * const pt) <br/> {<br/> release_t (* PT)-> root); <br/> free (* PT ); <br/>}</P> <p>/* local function definition */</P> <p>/* queue part */<br/> static queuenode * makenode_q (node * const Pn, const int index) <br/>{< br/> queuenode * newqnode; </P> <p> newqnode = (struct queuenode *) MAL LOC (sizeof (struct queuenode); <br/> If (null = newqnode) <br/> return NULL; <br/> newqnode-> node = pN; <br/> newqnode-> next = NULL; <br/> newqnode-> Index = index; </P> <p> return newqnode; <br/>}</P> <p>/* 2-D tree part */<br/> static node * makenode_t (const item * const PI) <br/> {<br/> node * newnode; </P> <p> newnode = (node *) malloc (sizeof (node )); <br/> If (null = newnode) <br/> return NULL; <B R/> newnode-> item [0] = PI [0]; <br/> newnode-> item [1] = PI [1]; <br/> newnode-> deleted = false; <br/> newnode-> left = newnode-> right = NULL; </P> <p> return newnode; <br/>}</P> <p> static void release_t (node * const PN) <br/>{< br/> If (PN! = NULL) <br/>{< br/> release_t (PN-> left); <br/> release_t (PN-> right ); <br/> free (PN); <br/>}< br/>}