Graphviz 2.29.20120208.0545
lib/cdt/dttreeset.c
Go to the documentation of this file.
00001 #include        "dthdr.h"
00002 
00003 /* Set attributes of a tree.
00004 **
00005 ** Written by Kiem-Phong Vo (09/17/2001)
00006 */
00007 
00008 #if __STD_C
00009 static Dtlink_t* treebalance(Dtlink_t* list, int size)
00010 #else
00011 static Dtlink_t* treebalance(list, size)
00012 Dtlink_t*       list;
00013 int             size;
00014 #endif
00015 {
00016         int             n;
00017         Dtlink_t        *l, *mid;
00018 
00019         if(size <= 2)
00020                 return list;
00021 
00022         for(l = list, n = size/2 - 1; n > 0; n -= 1)
00023                 l = l->right;
00024 
00025         mid = l->right; l->right = NIL(Dtlink_t*);
00026         mid->left  = treebalance(list, (n = size/2) );
00027         mid->right = treebalance(mid->right, size - (n + 1));
00028         return mid;
00029 }
00030 
00031 #if __STD_C
00032 int dttreeset(Dt_t* dt, int minp, int balance)
00033 #else
00034 int dttreeset(dt, minp, balance)
00035 Dt_t*   dt;
00036 int     minp;
00037 int     balance;
00038 #endif
00039 {
00040         int     size;
00041 
00042         if(dt->meth->type != DT_OSET)
00043                 return -1;
00044 
00045         size = dtsize(dt);
00046 
00047         if(minp < 0)
00048         {       for(minp = 0; minp < DT_MINP; ++minp)
00049                         if((1 << minp) >= size)
00050                                 break;
00051                 if(minp <= DT_MINP-4)   /* use log(size) + 4 */
00052                         minp += 4;
00053         }
00054 
00055         if((dt->data->minp = minp + (minp%2)) > DT_MINP)
00056                 dt->data->minp = DT_MINP;
00057 
00058         if(balance)
00059                 dt->data->here = treebalance(dtflatten(dt), size);
00060 
00061         return 0;
00062 }