HTBTree.c
上传用户:zlh9724
上传日期:2007-01-04
资源大小:1991k
文件大小:26k
源码类别:

浏览器

开发平台:

Unix_Linux

  1. /*       HTBTree.c
  2. ** BINARY TREE FOR SORTING THINGS
  3. **
  4. ** (c) COPYRIGHT MIT 1995.
  5. ** Please first read the full copyright statement in the file COPYRIGH.
  6. **
  7. ** Authors:
  8. ** Arthur Secret
  9. **
  10. ** 4 March 94: Bug fixed in the balancing procedure
  11. **
  12. */
  13. /* Library include files */
  14. #include "tcp.h"
  15. #include "HTUtils.h"
  16. #include "HTBTree.h"
  17. #define MAXIMUM(a,b) ((a)>(b)?(a):(b))
  18. struct _HTBTree_element {
  19.     void *object; /* User object */
  20.     struct _HTBTree_element *up;
  21.     struct _HTBTree_element *left;
  22.     int left_depth;
  23.     struct _HTBTree_element *right;
  24.     int right_depth;
  25. };
  26. struct _HTBTree {
  27.     HTComparer * compare;
  28.     struct _HTBTree_element * top;   
  29. };
  30. PUBLIC void * HTBTree_object (HTBTElement * element)
  31. {
  32.     return element ? element->object : NULL;
  33. }
  34. PUBLIC HTBTree * HTBTree_new (HTComparer * comp)
  35.     /*********************************************************
  36.     ** This function returns an HTBTree with memory allocated 
  37.     ** for it when given a mean to compare things
  38.     */
  39. {
  40.     HTBTree * tree;
  41.     if ((tree = (HTBTree  *) HT_CALLOC(1, sizeof(HTBTree))) == NULL)
  42.         HT_OUTOFMEM("HTBTree_new");
  43.     tree->compare = comp;
  44.     tree->top = NULL;
  45.     return tree;
  46. }
  47. PRIVATE void HTBTElement_free (HTBTElement*  element)
  48.     /**********************************************************
  49.     ** This void will free the memory allocated for one element
  50.     */
  51. {
  52.     if (element) {
  53.         if (element->left != NULL)    HTBTElement_free(element->left);
  54. if (element->right != NULL)    HTBTElement_free(element->right);
  55. HT_FREE(element);
  56.     }
  57. }
  58. PUBLIC void HTBTree_free (HTBTree*  tree)
  59.     /**************************************************************
  60.     ** This void will free the memory allocated for the whole tree
  61.     */
  62. {
  63.     HTBTElement_free(tree->top);
  64.     HT_FREE(tree);
  65. }
  66. PRIVATE void HTBTElementAndObject_free (HTBTElement*  element)
  67.     /**********************************************************
  68.     ** This void will free the memory allocated for one element
  69.     */
  70. {
  71.     if (element) {     /* Just in case nothing was in the tree anyway */
  72.         if (element->left != NULL)    HTBTElementAndObject_free(element->left);
  73. if (element->right != NULL)    
  74.     HTBTElementAndObject_free(element->right);
  75. HT_FREE(element->object);
  76. HT_FREE(element);
  77.     }
  78. }
  79. PUBLIC void HTBTreeAndObject_free (HTBTree*  tree)
  80.     /**************************************************************
  81.     ** This void will free the memory allocated for the whole tree
  82.     */
  83. {
  84.     HTBTElementAndObject_free(tree->top);
  85.     HT_FREE(tree);
  86. }
  87. /*
  88. ** This void is the core of HTBTree.c . It will
  89. **       1/ add a new element to the tree at the right place
  90. **          so that the tree remains sorted
  91. **       2/ balance the tree to be as fast as possible when reading it
  92. */
  93. PUBLIC void HTBTree_add (HTBTree * tree, void * object)
  94. {
  95.     HTBTElement * father_of_element;
  96.     HTBTElement * added_element;
  97.     HTBTElement * forefather_of_element;
  98.     HTBTElement * father_of_forefather;
  99.     BOOL father_found,top_found;
  100.     int depth,depth2,corrections;
  101.         /* father_of_element is a pointer to the structure that is the father of the
  102.         ** new object "object".
  103.         ** added_element is a pointer to the structure that contains or will contain 
  104.         ** the new object "object".
  105.         ** father_of_forefather and forefather_of_element are pointers that are used
  106.         ** to modify the depths of upper elements, when needed.
  107.         **
  108.         ** father_found indicates by a value NO when the future father of "object" 
  109.         ** is found.
  110.         ** top_found indicates by a value NO when, in case of a difference of depths
  111.         **  < 2, the top of the tree is encountered and forbids any further try to
  112.         ** balance the tree.
  113.         ** corrections is an integer used to avoid infinite loops in cases
  114.         ** such as:
  115.         **
  116.         **             3                        3
  117.         **          4                              4
  118.         **           5                            5
  119.         **
  120.         ** 3 is used here to show that it need not be the top of the tree.
  121.         */
  122.     /*
  123.     ** 1/ Adding of the element to the binary tree
  124.     */
  125.     if (tree->top == NULL)
  126.     {
  127.         if ((tree->top = (HTBTElement  *) HT_MALLOC(sizeof(HTBTElement))) == NULL)
  128.             HT_OUTOFMEM("HTBTree_add");
  129.         tree->top->up = NULL;
  130.         tree->top->object = object;
  131.         tree->top->left = NULL;
  132.         tree->top->left_depth = 0;
  133.         tree->top->right = NULL;
  134.         tree->top->right_depth = 0;
  135.     }
  136.     else
  137.     {   
  138.         father_found = YES;
  139.         father_of_element = tree->top;
  140.         added_element = NULL;
  141.         father_of_forefather = NULL;
  142.         forefather_of_element = NULL;      
  143.         while (father_found)
  144.         {
  145.             if (tree->compare(object,father_of_element->object)<0)
  146.     {
  147.                 if (father_of_element->left != NULL)
  148.                     father_of_element = father_of_element->left;
  149.                 else 
  150.         {
  151.                     father_found = NO;
  152.                     if ((father_of_element->left = (HTBTElement  *) HT_MALLOC(sizeof(HTBTElement))) == NULL)
  153.                         HT_OUTOFMEM("HTBTree_add");
  154.                     added_element = father_of_element->left;
  155.                     added_element->up = father_of_element;
  156.                     added_element->object = object;
  157.                     added_element->left = NULL;
  158.                     added_element->left_depth = 0;
  159.                     added_element->right = NULL;
  160.                     added_element->right_depth = 0;
  161.                 }
  162.         }
  163.             if (tree->compare(object,father_of_element->object)>=0)
  164.             {
  165.                 if (father_of_element->right != NULL) 
  166.                     father_of_element = father_of_element->right;
  167.                 else 
  168.                 {  
  169.                     father_found = NO;
  170.                     if ((father_of_element->right = (HTBTElement  *) HT_MALLOC(sizeof(HTBTElement))) == NULL)
  171.                         HT_OUTOFMEM("father_of_element->right ");
  172.                     added_element = father_of_element->right;
  173.                     added_element->up = father_of_element;
  174.                     added_element->object = object;
  175.                     added_element->left = NULL;
  176.                     added_element->left_depth = 0;
  177.                     added_element->right = NULL;
  178.                     added_element->right_depth = 0;       
  179.              }
  180.             }
  181. }
  182.             /*
  183.             ** Changing of all depths that need to be changed
  184.             */
  185.         father_of_forefather = father_of_element;
  186.         forefather_of_element = added_element;
  187.         do
  188.         {
  189.             if (father_of_forefather->left == forefather_of_element)
  190.             {
  191.                 depth = father_of_forefather->left_depth;
  192.                 father_of_forefather->left_depth = 1 
  193.                             + MAXIMUM(forefather_of_element->right_depth,
  194.                                   forefather_of_element->left_depth);
  195.                 depth2 = father_of_forefather->left_depth;
  196.             }
  197.             else
  198.     {
  199.                 depth = father_of_forefather->right_depth;
  200.                 father_of_forefather->right_depth = 1
  201.                             + MAXIMUM(forefather_of_element->right_depth,
  202.                                   forefather_of_element->left_depth);
  203.                 depth2 = father_of_forefather->right_depth;
  204.             }
  205.             forefather_of_element = father_of_forefather;
  206.             father_of_forefather = father_of_forefather->up;
  207.         } while ((depth != depth2) && (father_of_forefather != NULL));
  208.         
  209.             /*
  210.             ** 2/ Balancing the binary tree, if necessary
  211.     ** Bugs in this part have been fixed in March 94  -  AS
  212.             */
  213.         top_found = YES;
  214.         corrections = 0;
  215.         while ((top_found) && (corrections < 7))
  216.         {
  217.             if ((abs(father_of_element->left_depth
  218.                       - father_of_element->right_depth)) < 2)
  219.     {
  220.                 if (father_of_element->up != NULL) 
  221.                     father_of_element = father_of_element->up;
  222.                 else top_found = NO;
  223.     }
  224.             else
  225.       {                /* We start the process of balancing */
  226.                 corrections = corrections + 1;
  227.                     /* 
  228.                     ** corrections is an integer used to avoid infinite 
  229.                     ** loops in cases such as:
  230.                     **
  231.                     **             3                        3
  232.                     **          4                              4
  233.                     **           5                            5
  234.                     **
  235.                     ** 3 is used to show that it need not be the top of the tree
  236.     ** But let's avoid these two exceptions anyhow 
  237.     ** with the two following conditions (March 94 - AS)
  238.                     */
  239. if ((father_of_element->left == NULL) 
  240.     && (father_of_element->right->right == NULL) 
  241.     && (father_of_element->right->left->left == NULL) 
  242.     && (father_of_element->right->left->right == NULL)) 
  243.     corrections = 7;
  244. if ((father_of_element->right == NULL) 
  245.     && (father_of_element->left->left == NULL) 
  246.     && (father_of_element->left->right->right == NULL) 
  247.     && (father_of_element->left->right->left == NULL))
  248.     corrections = 7;
  249.  
  250.                 if (father_of_element->left_depth > father_of_element->right_depth)
  251.         {
  252.                     added_element = father_of_element->left;
  253.                     father_of_element->left_depth = added_element->right_depth;
  254.                     added_element->right_depth = 1
  255.                                     + MAXIMUM(father_of_element->right_depth,
  256.                                           father_of_element->left_depth);
  257.                     if (father_of_element->up != NULL)
  258.     {
  259. /* Bug fixed in March 94  */
  260. BOOL first_time;
  261.                         father_of_forefather = father_of_element->up;
  262.                         forefather_of_element = added_element;
  263. first_time = YES;
  264.                         do 
  265.                         {
  266.                             if (father_of_forefather->left
  267.                                  == forefather_of_element->up)
  268.                               {
  269.   depth = father_of_forefather->left_depth;
  270.   if (first_time)
  271.   {
  272.       father_of_forefather->left_depth = 1
  273.   + MAXIMUM(forefather_of_element->left_depth,
  274.   forefather_of_element->right_depth);
  275. first_time = NO;
  276.    }
  277.    else
  278.        father_of_forefather->left_depth = 1
  279.    + MAXIMUM(forefather_of_element->up->left_depth,
  280.       forefather_of_element->up->right_depth);
  281.                                 depth2 = father_of_forefather->left_depth;
  282.     }
  283.                             else
  284.     {
  285.                                 depth = father_of_forefather->right_depth;
  286. if (first_time)
  287. {
  288.     father_of_forefather->right_depth = 1
  289.       + MAXIMUM(forefather_of_element->left_depth,
  290.        forefather_of_element->right_depth);
  291.     first_time = NO;
  292. }
  293. else
  294.     father_of_forefather->right_depth = 1
  295.       + MAXIMUM(forefather_of_element->up->left_depth,
  296.    forefather_of_element->up->right_depth);
  297.                                 depth2 = father_of_forefather->right_depth;
  298.     }
  299.                             forefather_of_element = forefather_of_element->up;
  300.                             father_of_forefather = father_of_forefather->up;
  301. } while ((depth != depth2) && 
  302.  (father_of_forefather != NULL));
  303.                         father_of_forefather = father_of_element->up;
  304.                         if (father_of_forefather->left == father_of_element)
  305.                 {
  306.                             /*
  307.                             **                   3                       3
  308.                             **               4                       5
  309.                             ** When tree   5   6        becomes    7    4
  310.                             **            7 8                          8 6
  311.                             **
  312.                             ** 3 is used to show that it may not be the top of the
  313.                             ** tree.
  314.                             */ 
  315.                             father_of_forefather->left = added_element;
  316.                             father_of_element->left = added_element->right;
  317.                             added_element->right = father_of_element;
  318.                         }
  319.                         if (father_of_forefather->right == father_of_element)
  320.         {
  321.                             /*
  322.                             **          3                       3
  323.                             **               4                       5
  324.                             ** When tree   5   6        becomes    7    4
  325.                             **            7 8                          8 6
  326.                             **
  327.                             ** 3 is used to show that it may not be the top of the
  328.                             ** tree
  329.                             */
  330.                             father_of_forefather->right = added_element;
  331.                             father_of_element->left = added_element->right;
  332.                             added_element->right = father_of_element;
  333.                         }
  334.                         added_element->up = father_of_forefather;
  335.     }
  336.                     else
  337.     {
  338.                         /*
  339.                         **
  340.                         **               1                       2
  341.                         ** When tree   2   3        becomes    4    1
  342.                         **            4 5                          5 3
  343.                         **
  344.                         ** 1 is used to show that it is the top of the tree    
  345.                         */
  346.                         added_element->up = NULL;
  347.                         father_of_element->left = added_element->right;
  348.                         added_element->right = father_of_element;
  349.     }
  350.                     father_of_element->up = added_element;
  351.                     if (father_of_element->left != NULL)
  352.                         father_of_element->left->up = father_of_element;
  353.         }
  354.                 else
  355.         {
  356.                     added_element = father_of_element->right;
  357.                     father_of_element->right_depth = added_element->left_depth;
  358.                     added_element->left_depth = 1 + 
  359.                             MAXIMUM(father_of_element->right_depth,
  360.                                 father_of_element->left_depth);
  361.                     if (father_of_element->up != NULL)
  362. /* Bug fixed in March 94  */
  363.     {
  364. BOOL first_time;
  365.                         father_of_forefather = father_of_element->up;
  366.                         forefather_of_element = added_element;
  367. first_time = YES;
  368.                         do 
  369.                         {
  370.                             if (father_of_forefather->left 
  371. == forefather_of_element->up)
  372.                             {
  373.                                 depth = father_of_forefather->left_depth;
  374.                                 if (first_time)
  375. {
  376.     father_of_forefather->left_depth = 1
  377.        + MAXIMUM(forefather_of_element->left_depth,
  378.        forefather_of_element->right_depth);
  379.     first_time = NO;
  380. }
  381.                                 else
  382.     father_of_forefather->left_depth = 1
  383.       + MAXIMUM(forefather_of_element->up->left_depth,
  384.           forefather_of_element->up->right_depth);
  385. depth2 = father_of_forefather->left_depth;
  386.     }
  387.                             else
  388.     {
  389.                                 depth = father_of_forefather->right_depth;
  390. if (first_time)
  391. {
  392.     father_of_forefather->right_depth = 1
  393.        + MAXIMUM(forefather_of_element->left_depth,
  394.        forefather_of_element->right_depth);
  395.     first_time = NO;
  396. }
  397. else
  398.     father_of_forefather->right_depth = 1
  399.       + MAXIMUM(forefather_of_element->up->left_depth,
  400.    forefather_of_element->up->right_depth);
  401.                                 depth2 = father_of_forefather->right_depth;
  402.     }
  403.                             father_of_forefather = father_of_forefather->up;
  404.                             forefather_of_element = forefather_of_element->up;
  405. } while ((depth != depth2) && 
  406.  (father_of_forefather != NULL));
  407.                         father_of_forefather = father_of_element->up;
  408.                         if (father_of_forefather->left == father_of_element)
  409.         {
  410.                             /*
  411.                             **                    3                       3
  412.                             **               4                       6
  413.                             ** When tree   5   6        becomes    4    8
  414.                             **                7 8                 5 7
  415.                             **
  416.                             ** 3 is used to show that it may not be the top of the
  417.                             ** tree.
  418.                             */
  419.                             father_of_forefather->left = added_element;
  420.                             father_of_element->right = added_element->left;
  421.                             added_element->left = father_of_element;
  422.                         }
  423.                         if (father_of_forefather->right == father_of_element)
  424.         {
  425.                             /*
  426.                             **           3                      3
  427.                             **               4                       6
  428.                             ** When tree   5   6        becomes    4    8
  429.                             **                7 8                 5 7
  430.                             **
  431.                             ** 3 is used to show that it may not be the top of the
  432.                             ** tree
  433.                             */
  434.                             father_of_forefather->right = added_element;
  435.                             father_of_element->right = added_element->left;
  436.                             added_element->left = father_of_element;
  437.                         }
  438.                         added_element->up = father_of_forefather;
  439.     }
  440.                     else
  441.                     {
  442.                         /*
  443.                         **
  444.                         **               1                       3
  445.                         ** When tree   2   3        becomes    1    5
  446.                         **                4 5                 2 4
  447.                         **
  448.                         ** 1 is used to show that it is the top of the tree.
  449.                         */
  450.                         added_element->up = NULL;
  451.                         father_of_element->right = added_element->left;
  452.                         added_element->left = father_of_element;
  453.     }
  454.                     father_of_element->up = added_element;
  455.                     if (father_of_element->right != NULL)
  456.         father_of_element->right->up = father_of_element;
  457. }
  458.     }
  459.         }
  460.         while (father_of_element->up != NULL)
  461. {
  462.             father_of_element = father_of_element->up;
  463.         }
  464.         tree->top = father_of_element;
  465.     }
  466. }
  467. /*
  468. ** this function returns a pointer to the leftmost element if ele is NULL,
  469. ** and to the next object to the right otherways.
  470. ** If no elements left, returns a pointer to NULL.
  471. */
  472. PUBLIC HTBTElement * HTBTree_next(HTBTree * tree, HTBTElement * element)
  473. {
  474.     HTBTElement * father_of_element;
  475.     HTBTElement * father_of_forefather;
  476.     if (!element) {
  477.         father_of_element = tree->top;
  478.         if (father_of_element != NULL)
  479.             while (father_of_element->left != NULL)
  480.                 father_of_element = father_of_element->left;
  481.     }
  482.     else
  483.     {
  484.         father_of_element = element;
  485.         if (father_of_element->right != NULL)
  486. {
  487.             father_of_element = father_of_element->right;
  488.             while (father_of_element->left != NULL)
  489.                 father_of_element = father_of_element->left;
  490. }
  491.         else
  492. {
  493.             father_of_forefather = father_of_element->up;
  494.         while (father_of_forefather && 
  495.        (father_of_forefather->right == father_of_element))
  496.                {
  497.                     father_of_element = father_of_forefather;
  498.     father_of_forefather = father_of_element->up;
  499. }
  500.             father_of_element = father_of_forefather;
  501. }
  502.     }
  503. #ifdef BTREE_TRACE
  504.     /* The option -DBTREE_TRACE will give much more information
  505.     ** about the way the process is running, for debugging matters
  506.     */
  507.     if (father_of_element != NULL)
  508.     {
  509.         TTYPrint(TDEST, "nObject = %st",(char *)father_of_element->object);
  510.         if (father_of_element->up != NULL)
  511.             TTYPrint(TDEST, "Objet du pere = %sn",
  512.    (char *)father_of_element->up->object);
  513.         else TTYPrint(TDEST, "Pas de Peren");
  514.         if (father_of_element->left != NULL)
  515.             TTYPrint(TDEST, "Objet du fils gauche = %st",
  516.    (char *)father_of_element->left->object); 
  517.         else TTYPrint(TDEST, "Pas de fils gauchet");
  518.         if (father_of_element->right != NULL)
  519.             TTYPrint(TDEST, "Objet du fils droit = %sn",
  520.    (char *)father_of_element->right->object);
  521.         else TTYPrint(TDEST, "Pas de fils droitn");
  522.         TTYPrint(TDEST, "Profondeur gauche = %it",father_of_element->left_depth);
  523.         TTYPrint(TDEST, "Profondeur droite = %in",father_of_element->right_depth);
  524.         TTYPrint(TDEST, "      **************n");
  525.     }
  526. #endif
  527.     return father_of_element;
  528. }
  529. #ifdef TEST
  530. main ()
  531.     /******************************************************
  532.     ** This is just a test to show how to handle HTBTree.c
  533.     */
  534. {
  535.     HTBTree * tree;
  536.     HTBTElement * next_element;
  537.     
  538.     tree = HTBTree_new((HTComparer)strcasecmp);
  539.     HTBTree_add(tree,"hypertext");
  540.     HTBTree_add(tree,"Addressing");
  541.     HTBTree_add(tree,"X11");
  542.     HTBTree_add(tree,"Tools");
  543.     HTBTree_add(tree,"Proposal.wn");
  544.     HTBTree_add(tree,"Protocols");
  545.     HTBTree_add(tree,"NeXT");
  546.     HTBTree_add(tree,"Daemon");
  547.     HTBTree_add(tree,"Test");
  548.     HTBTree_add(tree,"Administration");
  549.     HTBTree_add(tree,"LineMode");
  550.     HTBTree_add(tree,"DesignIssues");
  551.     HTBTree_add(tree,"MarkUp");
  552.     HTBTree_add(tree,"Macintosh");
  553.     HTBTree_add(tree,"Proposal.rtf.wn");
  554.     HTBTree_add(tree,"FIND");
  555.     HTBTree_add(tree,"Paper");
  556.     HTBTree_add(tree,"Tcl");
  557.     HTBTree_add(tree,"Talks");
  558.     HTBTree_add(tree,"Architecture");
  559.     HTBTree_add(tree,"VMSHelp");
  560.     HTBTree_add(tree,"Provider");
  561.     HTBTree_add(tree,"Archive");
  562.     HTBTree_add(tree,"SLAC");
  563.     HTBTree_add(tree,"Project");
  564.     HTBTree_add(tree,"News");
  565.     HTBTree_add(tree,"Viola");
  566.     HTBTree_add(tree,"Users");
  567.     HTBTree_add(tree,"FAQ");
  568.     HTBTree_add(tree,"WorkingNotes");
  569.     HTBTree_add(tree,"Windows");
  570.     HTBTree_add(tree,"FineWWW");
  571.     HTBTree_add(tree,"Frame");
  572.     HTBTree_add(tree,"XMosaic");
  573.     HTBTree_add(tree,"People");
  574.     HTBTree_add(tree,"All");
  575.     HTBTree_add(tree,"Curses");
  576.     HTBTree_add(tree,"Erwise");
  577.     HTBTree_add(tree,"Carl");
  578.     HTBTree_add(tree,"MidasWWW");
  579.     HTBTree_add(tree,"XPM");
  580.     HTBTree_add(tree,"MailRobot");
  581.     HTBTree_add(tree,"Illustrations");
  582.     HTBTree_add(tree,"VMClient");
  583.     HTBTree_add(tree,"XPA");
  584.     HTBTree_add(tree,"Clients.html");
  585.     HTBTree_add(tree,"Library");
  586.     HTBTree_add(tree,"CERNLIB_Distribution");
  587.     HTBTree_add(tree,"libHTML");
  588.     HTBTree_add(tree,"WindowsPC");
  589.     HTBTree_add(tree,"tkWWW");
  590.     HTBTree_add(tree,"tk2.3");
  591.     HTBTree_add(tree,"CVS-RCS");
  592.     HTBTree_add(tree,"DecnetSockets");
  593.     HTBTree_add(tree,"SGMLStream");
  594.     HTBTree_add(tree,"NextStep");
  595.     HTBTree_add(tree,"CVSRepository_old");
  596.     HTBTree_add(tree,"ArthurSecret");
  597.     HTBTree_add(tree,"CVSROOT");
  598.     HTBTree_add(tree,"HytelnetGate");
  599.     HTBTree_add(tree,"cern.www.new.src");
  600.     HTBTree_add(tree,"Conditions");
  601.     HTBTree_add(tree,"HTMLGate");
  602.     HTBTree_add(tree,"Makefile");
  603.     HTBTree_add(tree,"Newsgroups.html");
  604.     HTBTree_add(tree,"People.html");
  605.     HTBTree_add(tree,"Bugs.html");
  606.     HTBTree_add(tree,"Summary.html");
  607.     HTBTree_add(tree,"zDesignIssues.wn");
  608.     HTBTree_add(tree,"HT.draw");
  609.     HTBTree_add(tree,"HTandCERN.wn");
  610.     HTBTree_add(tree,"Ideas.wn");
  611.     HTBTree_add(tree,"MarkUp.wn");
  612.     HTBTree_add(tree,"Proposal.html");
  613.     HTBTree_add(tree,"SearchPanel.draw");
  614.     HTBTree_add(tree,"Comments.wn");
  615.     HTBTree_add(tree,"Xanadu.html");
  616.     HTBTree_add(tree,"Storinglinks.html");
  617.     HTBTree_add(tree,"TheW3Book.html");
  618.     HTBTree_add(tree,"Talk_Feb-91.html");
  619.     HTBTree_add(tree,"JFosterEntry.txt");
  620.     HTBTree_add(tree,"Summary.txt");
  621.     HTBTree_add(tree,"Bibliography.html");
  622.     HTBTree_add(tree,"HTandCern.txt");
  623.     HTBTree_add(tree,"Talk.draw");
  624.     HTBTree_add(tree,"zDesignNotes.html");
  625.     HTBTree_add(tree,"Link.html");
  626.     HTBTree_add(tree,"Status.html");
  627.     HTBTree_add(tree,"http.txt");
  628.     HTBTree_add(tree,"People.html~");
  629.     HTBTree_add(tree,"TAGS");
  630.     HTBTree_add(tree,"summary.txt");
  631.     HTBTree_add(tree,"Technical.html");
  632.     HTBTree_add(tree,"Terms.html");
  633.     HTBTree_add(tree,"JANETAccess.html");
  634.     HTBTree_add(tree,"People.txt");
  635.     HTBTree_add(tree,"README.txt");
  636.     HTBTree_add(tree,"CodingStandards.html");
  637.     HTBTree_add(tree,"Copyright.txt");
  638.     HTBTree_add(tree,"Status_old.html");
  639.     HTBTree_add(tree,"patches~");
  640.     HTBTree_add(tree,"RelatedProducts.html");
  641.     HTBTree_add(tree,"Implementation");
  642.     HTBTree_add(tree,"History.html");
  643.     HTBTree_add(tree,"Makefile.bak");
  644.     HTBTree_add(tree,"Makefile.old");
  645.     HTBTree_add(tree,"Policy.html");
  646.     HTBTree_add(tree,"WhatIs.html");
  647.     HTBTree_add(tree,"TheProject.html");
  648.     HTBTree_add(tree,"Notation.html");
  649.     HTBTree_add(tree,"Helping.html");
  650.     HTBTree_add(tree,"Cyber-WWW.sit.Hqx");
  651.     HTBTree_add(tree,"Glossary.html");
  652.     HTBTree_add(tree,"maketags.html");
  653.     HTBTree_add(tree,"IntroCS.html");
  654.     HTBTree_add(tree,"Contrib");
  655.     HTBTree_add(tree,"Help.html");
  656.     HTBTree_add(tree,"CodeManagExec");
  657.     HTBTree_add(tree,"HT-0.1draz");
  658.     HTBTree_add(tree,"Cello");
  659.     HTBTree_add(tree,"TOPUB");
  660.     HTBTree_add(tree,"BUILD");
  661.     HTBTree_add(tree,"BUILDALL");
  662.     HTBTree_add(tree,"Lynx");
  663.     HTBTree_add(tree,"ArthurLibrary");
  664.     HTBTree_add(tree,"RashtyClient");
  665.     HTBTree_add(tree,"#History.html#");
  666.     HTBTree_add(tree,"PerlServers");
  667.     HTBTree_add(tree,"modules");
  668.     HTBTree_add(tree,"NCSA_httpd");
  669.     HTBTree_add(tree,"MAIL2HTML");
  670.     HTBTree_add(tree,"core");
  671.     HTBTree_add(tree,"EmacsWWW");
  672. #ifdef BTREE_TRACE
  673.     TTYPrint(TDEST, "nTreeTopObject=%snn",tree->top->object);
  674. #endif
  675.     next_element = HTBTree_next(tree,NULL);
  676.     while (next_element != NULL)
  677.     {
  678. #ifndef BTREE_TRACE
  679.         TTYPrint(TDEST, "The next element is %sn",next_element->object);
  680. #endif
  681.         next_element = HTBTree_next(tree,next_element);
  682.     }
  683.     HTBTree_free (tree);
  684. }
  685. #endif