home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / diverses / leda / src / graph / _g_updat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  4.0 KB  |  210 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  _g_update.c
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16. #include <LEDA/graph.h>
  17.  
  18.  
  19. list(edge) graph::insert_reverse_edges()
  20. { list(edge) L = E;
  21.   list(edge) result;
  22.   edge e;
  23.   forall(e,L)
  24.   { result.append(new_edge(e->t,e->s,e->contents));
  25.     copy_edge_entry(e->contents);
  26.    }
  27.   return result;
  28. }
  29.  
  30.  
  31.  
  32. void graph::make_undirected()     
  33. { edge e;
  34.   node v;
  35.   forall(v,V) v->adj_edges.init_iterator();
  36.   forall(e,E)
  37.     if (e->adj_loc2==0)  
  38.         e->adj_loc2 = e->t->adj_edges.append(e);
  39.  }
  40.  
  41. void graph::make_directed()     
  42. { edge e;
  43.   node v;
  44.   forall(v,V) v->adj_edges.init_iterator();
  45.   forall(e,E) 
  46.    if (e->adj_loc2)  
  47.     {  e->t->adj_edges.del(e->adj_loc2);
  48.        e->adj_loc2 = 0;
  49.      }
  50.  }
  51.  
  52.  
  53. /*   // entry for subgraphs
  54.  
  55. ent&  graph::entry(node v)     
  56. { graph* g = this;
  57.   while (g->parent)   // v is subgraph node
  58.   { v = node(v->contents);
  59.     g = g->parent; 
  60.    }
  61.   return v->contents; 
  62.  }
  63.  
  64. ent&  graph::entry(edge e)     
  65. { graph* g = this;
  66.   while (g->parent)   // e is subgraph edge 
  67.   { e = edge(e->contents);
  68.     g = g->parent; 
  69.    }
  70.   return e->contents; 
  71.  }
  72.  
  73. */
  74.  
  75.  
  76. void graph::reset()  const   // reset all iterators
  77. { node v;
  78.   forall(v,V) v->adj_edges.init_iterator();
  79.   V.init_iterator();
  80.   E.init_iterator();
  81. }
  82.  
  83. node graph::new_node(ent i)
  84.   node v = new i_node(i); 
  85.   v->g = this;
  86.   v->i_name = ++max_node_index;
  87.   v->loc = V.append(v);
  88.   return v;
  89. }
  90.  
  91. void graph::del_node(node v)
  92. { if (v->g != this) error_handler(4,"del_node: v is not in G");
  93.  
  94.   // delete adjacent edges
  95.   while (!v->adj_edges.empty()) del_edge(v->adj_edges.head());
  96.  
  97.   list_item loc;
  98.   edge e;
  99.   if (v->indegree) 
  100.   { error_handler(0,
  101.     "del_node: indeg >0 , I delete incoming edges (time: O(|E|))");
  102.  
  103.     loc = E.first();
  104.     while (loc) { e = E[loc];
  105.                   loc = E.succ(loc);
  106.                   if (e->t == v) del_edge(e); } 
  107.    } 
  108.  
  109.   V.del(v->loc);
  110.  
  111.   if (parent==0)   // no subgraph
  112.     clear_node_entry(v->contents);
  113.  
  114.   delete v;
  115. }
  116.  
  117. edge graph::new_edge(node v, node w, ent i)
  118. { // add edge (v,w) to G
  119.  
  120.   if ((v->g!=this) || (w->g!=this)) 
  121.   error_handler(6, "G.new_edge(v,w): v or w not in G");
  122.  
  123.  
  124.   edge e = new i_edge(v,w,i);
  125.  
  126.   e->i_name = ++max_edge_index;
  127.   e->loc = E.append(e);
  128.   e->adj_loc=v->adj_edges.append(e);
  129.   e->adj_loc2 = 0;
  130.   w->indegree++;
  131.   return e ; 
  132. }
  133.  
  134. edge graph::new_edge(edge e1, node w, ent i, int dir=0)  
  135. { //add edge (source(e1),w) e after/before e1 
  136.  
  137.   node v  = e1->s;
  138.  
  139.   if ((v->g!=this) || (w->g!=this)) 
  140.      error_handler(9,"G.new_edge(e,w): e or w not in G");
  141.  
  142.  
  143.   edge e = new i_edge(v,w,i);
  144.  
  145.   e->i_name = ++max_edge_index;
  146.   e->loc = E.append(e);
  147.   e->adj_loc=v->adj_edges.insert(e,e1->adj_loc,dir);
  148.   e->adj_loc2 = 0;
  149.   w->indegree++;
  150.   return e ; 
  151. }
  152.  
  153. void graph::del_edge(edge e)
  154. { node v = e->s;
  155.   node w = e->t;
  156.  
  157.   if (v->g != this) error_handler(10,"del_edge: e is not in G");
  158.      
  159.   E.del(e->loc);
  160.  
  161.   v->adj_edges.del(e->adj_loc);
  162.  
  163.   if (e->adj_loc2)                  //undirected edge
  164.   w->adj_edges.del(e->adj_loc2);
  165.  
  166.   w->indegree--;
  167.  
  168.   e->i_name = -1;
  169.  
  170.   if (parent == 0)  // no subgraph
  171.      clear_edge_entry(e->contents);
  172.  
  173.   delete e; 
  174. }
  175.  
  176. edge graph::rev_edge(edge e)
  177. { if (e->adj_loc2) return e;  //undirected edge
  178.   node v = e->s;
  179.   node w = e->t;
  180.   if (v->g != this) error_handler(11,"rev_edge: e is not in G");
  181.   v->adj_edges.del(e->adj_loc);
  182.   e->adj_loc = w->adj_edges.append(e);
  183.   w->indegree--;
  184.   v->indegree++;
  185.   e->s = w;
  186.   e->t = v;
  187.   return(e); 
  188. }
  189.  
  190. graph& graph::rev()              
  191. { edge e;
  192.   forall(e,E) rev_edge(e);
  193.   return *this; 
  194. }
  195.  
  196. void graph::del_all_nodes() { clear(); }
  197.  
  198. void graph::del_all_edges()
  199. { node v;
  200.   forall(v,V)
  201.   { v->adj_edges.clear();
  202.     v->indegree=0;
  203.    }
  204.   while (!E.empty()) delete E.pop();
  205.   max_edge_index = -1;
  206. }
  207.  
  208.