bintree_findlast.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*********************** -*- Mode: C -*- ***********************
  2. * File : bintree_findlast.c
  3. *---------------------------------------------------------------
  4. * Description
  5. * ===========
  6. * This operation returns the last "clientnode" present in the
  7. * specified "tree"
  8. *
  9. * tree - the "tree" instance to invoke this operation upon
  10. *
  11. * RETURNS
  12. * "clientnode" instance or NULL if no nodes are present in this view.
  13. *
  14. *---------------------------------------------------------------
  15. * Author : Graeme McKerrell
  16. * Created On : Wed Jan 28 10:17:17 2004
  17. * Status : TESTED
  18. *---------------------------------------------------------------
  19. * HISTORY
  20. * 7-Dec-2004 Graeme McKerrell
  21. * Renamed to the "lub_" namespace
  22. * 5-May-2004 Graeme McKerrell
  23. * updates following review
  24. * 2-Mar-2004 Graeme McKerrell
  25. * fixed comparison logic
  26. * 9-Feb-2004 Graeme McKerrell
  27. * update to use new getkey prototype, removed the now spurious
  28. * nullgetkey() function
  29. * 28-Jan-2004 Graeme McKerrell
  30. * Initial version
  31. *---------------------------------------------------------------
  32. * Copyright (C) 2004 3Com Corporation. All Rights Reserved.
  33. **************************************************************** */
  34. #include "private.h"
  35. /* forward declare these functions */
  36. static lub_bintree_compare_fn compareright;
  37. /*--------------------------------------------------------- */
  38. void *lub_bintree_findlast(lub_bintree_t * this)
  39. {
  40. lub_bintree_compare_fn *client_compare = this->compareFn;
  41. /*
  42. * put dummy functions in place
  43. * This will make the search faster and direct it to the right most
  44. * node
  45. */
  46. this->compareFn = compareright;
  47. /*
  48. * the key doesn't matter here cos we've cobbled the compare function
  49. */
  50. this->root = lub_bintree_splay(this, this->root, NULL);
  51. /* restore the client functions */
  52. this->compareFn = client_compare;
  53. if (NULL == this->root)
  54. return NULL;
  55. else
  56. return lub_bintree_getclientnode(this, this->root);
  57. }
  58. /*--------------------------------------------------------- */
  59. /*
  60. * This comparison operation always returns -1 hence will force a
  61. * search to the left most node.
  62. *
  63. * key1 - first node to compare (not used)
  64. * key2 - second node to compare (not used)
  65. */
  66. static int compareright(const void *clientnode, const void *clientkey)
  67. {
  68. clientnode = clientnode;
  69. clientkey = clientkey;
  70. return -1;
  71. }
  72. /*--------------------------------------------------------- */