00001
00002 #ifndef DIGRAPH_H
00003 #define DIGRAPH_H
00004
00005 #ifndef DLIST_H
00006 #include "dlist.h"
00007 #endif
00008
00009 struct diGraph
00010
00011 {
00012 struct dgNode *nodeList;
00013 struct hash *nodeHash;
00014 struct dlList *edgeList;
00015 };
00016
00017 struct dgNode
00018
00019 {
00020 struct dgNode *next;
00021 char *name;
00022 void *val;
00023 struct dgConnection *nextList;
00024 struct dgConnection *prevList;
00025 int topoOrder;
00026 int component;
00027 int priority;
00028 struct dgNode *tempEntry;
00029 bool visited;
00030 bool conn;
00031 bool flagA;
00032 bool flagB;
00033 };
00034
00035 struct dgEdge
00036
00037 {
00038 void *val;
00039 struct dgNode *a;
00040 struct dgNode *b;
00041 };
00042
00043 struct dgConnection
00044
00045 {
00046 struct dgConnection *next;
00047 struct dgNode *node;
00048 struct dlNode *edgeOnList;
00049 };
00050
00051 struct dgNodeRef
00052
00053 {
00054 struct dgNodeRef *next;
00055 struct dgNode *node;
00056 };
00057
00058 struct dgEdgeRef
00059
00060 {
00061 struct dgEdgeRef *next;
00062 struct dgEdge *edge;
00063 };
00064
00065 struct diGraph *dgNew();
00066
00067
00068 void dgFree(struct diGraph **pGraph);
00069
00070
00071 struct dgNode *dgAddNode(struct diGraph *dg, char *name, void *val);
00072
00073
00074 struct dgNode *dgAddNumberedNode(struct diGraph *dg, int id, void *val);
00075
00076
00077 struct dgNode *dgFindNode(struct diGraph *dg, char *name);
00078
00079
00080 struct dgNode *dgFindNumberedNode(struct diGraph *dg, int id);
00081
00082
00083 void *dgNodeVal(struct dgNode *node);
00084
00085
00086 void *dgNodeName(struct dgNode *node);
00087
00088
00089 int dgNodeNumber(struct dgNode *node);
00090
00091
00092
00093 struct dgEdge *dgConnect(struct diGraph *dg, struct dgNode *a, struct dgNode *b);
00094
00095
00096 struct dgEdge *dgConnectWithVal(struct diGraph *dg, struct dgNode *a, struct dgNode *b, void *val);
00097
00098
00099 void dgDisconnect(struct diGraph *dg, struct dgNode *a, struct dgNode *b);
00100
00101
00102 struct dgEdge *dgDirectlyFollows(struct diGraph *dg, struct dgNode *a, struct dgNode *b);
00103
00104
00105 boolean dgPathExists(struct diGraph *dg, struct dgNode *a, struct dgNode *b);
00106
00107
00108 struct dgNodeRef *dgFindPath(struct diGraph *dg, struct dgNode *a, struct dgNode *b);
00109
00110
00111 struct dgNodeRef *dgFindConnectedToNode(struct diGraph *dg, struct dgNode *a);
00112
00113
00114
00115 struct dgNodeRef *dgFindNewConnected(struct diGraph *dg, struct dgNode *a);
00116
00117
00118
00119 struct dgNodeRef *dgFindNewConnectedWithVals(struct diGraph *dg, struct dgNode *a);
00120
00121
00122
00123 struct dgNodeRef *dgFindNextConnected(struct diGraph *dg);
00124
00125
00126
00127
00128
00129
00130
00131 struct dgNodeRef *dgFindNextConnectedWithVals(struct diGraph *dg);
00132
00133
00134
00135 int dgConnectedComponents(struct diGraph *dg);
00136
00137
00138
00139 int dgConnectedComponentsWithVals(struct diGraph *dg);
00140
00141
00142
00143
00144 void dgTopoSort(struct diGraph *dg);
00145
00146
00147 boolean dgHasCycles(struct diGraph *dg);
00148
00149
00150 boolean dgParentsAllVisited(struct dgNode *node);
00151
00152
00153 struct dgNodeRef *dgConstrainedPriorityOrder(struct diGraph *dg);
00154
00155
00156
00157
00158
00159 boolean dgRangesConsistent(struct diGraph *rangeGraph,
00160 boolean (*findEdgeRange)(struct dgEdge *edge, int *retMin, int *retMax) );
00161
00162
00163
00164 boolean dgAddedRangeConsistent(struct diGraph *rangeGraph,
00165 struct dgNode *a, struct dgNode *b, int abMin, int abMax,
00166 boolean (*findEdgeRange)(struct dgEdge *edge, int *retMin, int *retMax) );
00167
00168
00169
00170
00171 struct dgEdgeRef *dgFindSubEdges(struct diGraph *dg, struct dgNodeRef *subGraph);
00172
00173
00174 void dgSwapEdges(struct diGraph *dg, struct dgEdgeRef *erList);
00175
00176
00177
00178 void dgClearConnFlags(struct diGraph *dg);
00179
00180
00181 void dgClearVisitFlags(struct diGraph *dg);
00182
00183
00184 struct dgNodeRef *dgFindNodeInRefList(struct dgNodeRef *refList, struct dgNode *node);
00185
00186
00187 struct dgConnection *dgFindNodeInConList(struct dgConnection *conList, struct dgNode *node);
00188
00189
00190 struct dgConnection *dgNextList(struct dgNode *node);
00191
00192
00193
00194 struct dgConnection *dgPrevList(struct dgNode *node);
00195
00196
00197
00198 void dgDumpGraph(struct diGraph *dg, FILE *out, boolean hideIsolated);
00199
00200
00201 #endif
00202