2-D tree implementation file C Language

Source: Internet
Author: User

/* 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/>}

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.