|
Graphviz 2.29.20120208.0545
|
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 }
1.7.4