Пример #1
0
GEdge *GNode< Point >::Search( Long n, Long i ) const {
   GEdge *p;
   for (p=adjacents; p != NULL; p=p->Next())
      if (( p->Item() == i) && (p->Node() == n))
	 break;
   return p;
}
Пример #2
0
GEdge *GNode< Point >::Del( Long n, Long i ) {
   GEdge *p = Neighbours();
   GEdge *q;
   
   if (!p) return NULL;
   
   if ((p->Node()==n)&&(p->Item()==i)) {
      q=p->Next();
      etrash.push_back(p);
      // delete(p); // Problem when using Neighbours() list: cannot delete
      adjacents=q;
   } else {
      for (q=p->Next();q != NULL; p=q,q=q->Next())
	 if (q && (q->Node() ==n) && (q->Item() == i)) {
	    p->Next(q->Next());
	    etrash.push_back(q);
	    break;
	    // delete(q); // Problem when using Neighbours() list: cannot delete
	 }
   }
   return adjacents;
}
Пример #3
0
/*
 * Merges 2 nodes in 1 ->n1
 * Updates the adjacent list of all node (n2 ->n1).
 * and delete n2.
 */
Errc Graph2d::Merge( Long n1, Long n2 ) {
   GEdge *ptr;
   
   if (_directed) {
      // std::cerr << "Error: Merge is not implemented for directed graphs." << std::endl;
      // return FAILURE;
      
      if ((n1==n2) || (!tnode[n1]) || (!tnode[n2])) return FAILURE;

      // Remove links
      Unlink(n1,n2);
      Unlink(n2,n1);

      while((ptr=tnode[n2]->Neighbours())){
	 if ( n2 != ptr->Node() )
	    Link(n1,ptr->Node(),ptr->Item(),ptr->weight,true);
	 else
	    Link(n1,n1,ptr->Item(),ptr->weight,true);
	 Unlink(n2,ptr->Node(),ptr->Item());
      }

      // Cross the graph in order to replace n2 by n1
      for ( int i = 0; i < this->Size(); ++i ) {
	 const GNode<Point2d> * noeud = (*this)[i];
	 if ( noeud != NULL ) {
	    for ( ptr = noeud->Neighbours() ; ptr != NULL; ptr = ptr->Next() )
	       if ( ptr->Node() == n2 ) {
		  Link(i,n1,ptr->Item(),ptr->weight,true);
		  Unlink(i,n2,ptr->Item());
	       }
	 }
      }
      Del(n2);
   } else {
      if ((n1==n2) || (!tnode[n1]) || (!tnode[n2])) return FAILURE;
      
      Unlink(n1,n2);
      
      while((ptr=tnode[n2]->Neighbours())){
	 if ( n2 != ptr->Node() )
	    Link(n1,ptr->Node(),ptr->Item(),ptr->weight,true);
	 else
	    Link(n1,n1,ptr->Item(),ptr->weight,true);
	 Unlink(n2,ptr->Node(),ptr->Item());
      }
      Del(n2);
   }
   return SUCCESS;
}
Пример #4
0
/*
 * Creates a copy of graph g.
 */
Graph3d &Graph3d::operator=( const Graph3d &g ) {
   Long	i;
   GEdge *l;

   New(g.size,g.ndep,g.nrow,g.ncol);
   for (i=0; i<size; i++){
      if (g[i] != NULL){
	 Add(i,g[i]->Item(),g[i]->seed);
	 tnode[i]->value=g[i]->value;
	 for (l=g[i]->Neighbours(); l!=NULL; l=l->Next()){
	    if (i>l->Node())
	       Link(i,l->Node(),l->Item(),l->weight);
	 }
      }
   }
   return *this;
}