Пример #1
0
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;
}
Пример #2
0
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 );
    }
}