This is something I wrote yesterday. What I really appreciate is that the circular queue is implemented in the same place. It is very clear and has a good idea.
/* 12-34-11-04-05-19.32.c -- Chapter 12th, question 1 */<br/> # include "pairingheap. H "</P> <p> static node * combinesiblings_p (node * firstsibling) <br/>{< br/> static node * treearray [maxsiblings]; <br/> static node * First, * Second; <br/> int numsiblings; <br/> int front, rear; </P> <p>/* if only one tree, return it. */<br/> If (firstsibling-> nextsibling = nullnode) <br/> return firstsibling; <br/>/* place each sub Tree in treearray. */<br/> for (numsiblings = 0; firstsibling! = Nullnode; numsiblings ++) <br/>{< br/> treearray [numsiblings] = firstsibling; <br/>/* break links. */<br/> firstsibling-> previous-> nextsibling = nullnode; <br/> firstsibling = firstsibling-> nextsibling; <br/>}< br/>/* The COOD what appears later is so wonderful! */<Br/> front = rear = 0; <br/> DO <br/> {<br/> first = treearray [Front ++ % numsiblings]; <br/> second = treearray [Front ++ % numsiblings]; <br/> treearray [rear ++ % numsiblings] = compareandlink_p (first, second ); <br/>}< br/> while (front + 1) % numsiblings! = Rear % numsiblings) <br/>; </P> <p> return treearray [Front % numsiblings]; <br/>}