00001 #ifndef GRAPH_H 00002 #define GRAPH_H 00003 00004 typedef char *gGeneric; 00005 00006 typedef struct graph_struct { 00007 gGeneric user_data; 00008 } graph_t; 00009 00010 typedef struct vertex_struct { 00011 gGeneric user_data; 00012 } vertex_t; 00013 00014 typedef struct edge_struct { 00015 gGeneric user_data; 00016 } edge_t; 00017 00018 typedef void (*GRAPH_PFV)(gGeneric); 00019 typedef gGeneric (*GRAPH_PFG)(gGeneric); 00020 00021 EXTERN graph_t *g_alloc ARGS((void)); 00022 EXTERN void g_free ARGS((graph_t *, void(*)(gGeneric), void(*)(gGeneric), void(*)(gGeneric))); 00023 EXTERN void g_check ARGS((graph_t *)); 00024 EXTERN graph_t *g_dup ARGS((graph_t *, gGeneric(*)(gGeneric), gGeneric(*)(gGeneric), gGeneric(*)(gGeneric))); 00025 00026 EXTERN lsList g_get_vertices ARGS((graph_t *)); 00027 00028 #define foreach_vertex(g, lgen, v) \ 00029 for (lgen = lsStart(g_get_vertices(g)); \ 00030 lsNext(lgen, &v, LS_NH) == LS_OK \ 00031 || ((void) lsFinish(lgen), 0); ) 00032 00033 #define foreach_edge(g, lgen, e) \ 00034 for (lgen = lsStart(g_get_edges(g)); \ 00035 lsNext(lgen, &e, LS_NH) == LS_OK \ 00036 || ((void) lsFinish(lgen), 0); ) 00037 00038 EXTERN vertex_t *g_add_vertex ARGS((graph_t *)); 00039 EXTERN void g_delete_vertex ARGS((vertex_t *, void (*)(gGeneric), void (*)(gGeneric))); 00040 EXTERN graph_t *g_vertex_graph ARGS((vertex_t *)); 00041 00042 EXTERN lsList g_get_edges ARGS((graph_t *)); 00043 EXTERN lsList g_get_in_edges ARGS((vertex_t *)); 00044 EXTERN lsList g_get_out_edges ARGS((vertex_t *)); 00045 00046 #define foreach_in_edge(v, lgen, e) \ 00047 for (lgen = lsStart(g_get_in_edges(v)); \ 00048 lsNext(lgen, &e, LS_NH) == LS_OK \ 00049 || ((void) lsFinish(lgen), 0); ) 00050 00051 #define foreach_out_edge(v, lgen, e) \ 00052 for (lgen = lsStart(g_get_out_edges(v)); \ 00053 lsNext(lgen, &e, LS_NH) == LS_OK \ 00054 || ((void) lsFinish(lgen), 0); ) 00055 00056 EXTERN edge_t *g_add_edge ARGS((vertex_t *, vertex_t *)); 00057 EXTERN void g_delete_edge ARGS((edge_t *, void (*)(gGeneric))); 00058 EXTERN graph_t *g_edge_graph ARGS((edge_t *)); 00059 EXTERN vertex_t *g_e_source ARGS((edge_t *)); 00060 EXTERN vertex_t *g_e_dest ARGS((edge_t *)); 00061 00062 EXTERN array_t *g_dfs ARGS((graph_t *)); 00063 EXTERN int g_is_acyclic ARGS((graph_t *)); 00064 EXTERN array_t *g_graph_sort ARGS((graph_t *, int (*)(const void *, const void *))); 00065 00066 EXTERN st_table *g_reachable ARGS((graph_t *, st_table *)); 00067 EXTERN st_table *g_EF ARGS((graph_t *, st_table *)); 00068 EXTERN st_table *g_SCC ARGS((graph_t *, st_table *)); 00069 00070 #endif