我需要做一个函数来检查是否连接了用邻接表实现的给定无向图。 有两种结构,一种用于定义图形中的节点(具有标识它的标签(字符串),一种指向其邻接列表的指针,一种指向图形中的下一个节点),一种用于定义其邻接关系中的节点。列表(具有标识它们的标签和指向列表中下一个相邻节点的指针):
struct graph::vertexNode {
Label label;
halfEdgeNode *adjList;
vertexNode *next;
}; //typedef'ed as Graph
struct halfEdgeNode {
Label label;
halfEdgeNode* next;
};
我当时正在考虑在其上运行任何BFS / DFS,但是鉴于这些结构,我不知道如何实现这样的功能:是否有可能在不修改结构的情况下实现布尔变量来告知函数是否一个节点是否已经被访问过,是否可以进行遍历? 由于不知道如何将所有节点标记为未访问,因此如何初始化DFS / BFS? 还是有一种方法可以在不使用DFS / BFS的情况下检查图形是否已连接?
以下是我到目前为止所做的可能有用的辅助功能:getVertex返回由该标签标识的节点,isVertexInGraph检查图形中是否存在给定的节点,isEdgeInGraph检查图形中是否存在给定的边(仅当两个节点都存在时被调用),并且numVertices计算给定图中的节点数。
graph::Graph getVertex(Label l, const Graph& g) {
for (graph::Graph v = g; v != NULL; v = v->next) {
if (v->label == l) return v;
}
return NULL;
}
bool isVertexInGraph(Label l, const Graph& g) {
return (getVertex(l, g)!=NULL);
}
bool isEdgeInGraph(Label from, Label to, const Graph& g) {
Graph h = getVertex(from, g);
if (h == NULL) return false;
for (halfEdgeNode* n = h->adjList; n != NULL; n = n->next) {
if (n->label == to ) return true;
}
return false;
}
int numVertices(const Graph& g){
int num = 0;
for (Graph v = g; v != emptyGraph; v = v->next)
num++;
return num;
}
编辑:我不能使用任何STD库。 编辑:在标题中,我有这个:
typedef string Label;
typedef vertexNode* Graph;