void CAstar::Astar(CAstarNode*& result) { CAstarNode s0(m_hgevStart,0,CalculateH(m_hgevStart),NULL); //open表中插入起点 m_vOpenList.push_back(s0); make_heap(m_vOpenList.begin(),m_vOpenList.end()); // CAstarNode* min; while(!m_vOpenList.empty()) { //pop出堆顶节点 pop_heap(m_vOpenList.begin(),m_vOpenList.end(),cmpAstarNode); result = new CAstarNode(m_vOpenList.back().m_hgevCoordinate,m_vOpenList.back().m_nG, m_vOpenList.back().m_nH, m_vOpenList.back().m_pParent); //若节点是目标节点,则返回 if(result->m_hgevCoordinate == m_hgevGoal) { // memcpy(result,&min,sizeof(CAstarNode)); return ; } m_vOpenList.pop_back(); // make_heap(m_vOpenList.begin(),m_vOpenList.end()); //扩展该节点 ExtendNode(result); // make_heap(m_vOpenList.begin(),m_vOpenList.end()); m_vClosedList.push_back(*result); } result = NULL; }
NODE *create_tree_sub (const char **tree_str, NODE * parent, TREE * tree) { NODE *node,*node_new; char c; int bufflen; double l; char * name; node = CreateNode (); if (parent != NULL) { node->nbran++; node->branch[0] = parent; } else{ (*tree_str)++; } while ( (c = GetTreeElt (tree_str)) != EOF) { if (c == '(') { node->branch[node->nbran] = create_tree_sub (tree_str, node, tree); (node->branch[node->nbran])->bnumber = tree->n_br; tree->branches[tree->n_br++] = node->branch[node->nbran++]; if ( node->nbran >= node->maxbran - 1 ){ ExtendNode(node); } } else if (c == ')') { node->branch[node->nbran] = NULL; return node; } else if (c == ',') { node_new = CreateNode(); node->branch[node->nbran] = node_new; node_new->bnumber = tree->n_br; tree->branches[tree->n_br++] = node->branch[node->nbran]; CHILD (node, node->nbran)->branch[0] = node; CHILD (node, node->nbran)->branch[1] = NULL; CHILD (node, node->nbran)->nbran = 1; name = GetLeafName(tree_str); bufflen = 1+strlen(name); node_new->name = malloc (bufflen*sizeof(char)); strncpy(node_new->name,name,bufflen); if ( insertelt_rbtree(tree->leaves,name,node_new) ){ fprintf(stderr,"Species name %s already used in tree. Please make unique and rerun program.\n",name); exit(EXIT_FAILURE); } tree->n_sp++; node->nbran++; if ( node->nbran >= node->maxbran - 1){ ExtendNode(node); } } else if (c == ':') { l = GetLength (tree_str); node->blength[node->nbran - 1] = l; CHILD (node, node->nbran - 1)->blength[0] = l; } } fprintf (stderr,"Error creating tree.\n"); fprintf (stderr,"Tree string is %s.\n",*tree_str); fprintf (stderr,"This is probably a bug. Please report to [email protected]\n"); print_tree(stderr, parent,parent,tree); exit(EXIT_FAILURE); return node; }