graph* graph_tree_link(graph* root, graph* child) { if(child == NULL) return root; if(root == NULL) return child; //printf("%p %p %p\n", child, child->data, child->edges); root->edges = dlist_pushback(root->edges, (Object*)child, FALSE); //verify tree size_t root_visited = 0; graph_tree_iterator_pre *iter = graph_tree_iterator_pre_new(root, &(graph_tree_iterator_pre) {}); graph *g; for(g = graph_tree_iterator_pre_next(iter); g; g = graph_tree_iterator_pre_next(iter)) { if(g == root) { root_visited++; } if(root_visited > 1) { break; } } graph_tree_iterator_pre_destroy(iter); if(root_visited > 1) { root->edges = dlist_popback(root->edges, NULL, FALSE); } return root; }
void dlist_trim_to_limit( struct dlistnode** list, int limit, dlist_visitor_func_type f ) { int sz = dlist_size( list ); while( sz >= limit ) { struct dlistnode* node = dlist_popback( list ); f(node); freenode(node); sz = dlist_size( list ); } }