假设我想从图形结构中打印路径。 我想打印从B到G的路径:它是B A E G但是当我运行我的程序时它也会打印D.我首先使用遍历广度
void traverseBreadFirst(VERTEX_t* pVertex,void (*vfunction)(VERTEX_T))
{
VERTEX_T * pCurrent = NULL;
VERTEX_T * pAdjacent = NULL;
queueClear();
colorAll(WHITE);
pVertex->color = GRAY;
enqueue(pVertex);
while(queueSize()>0)
{
pCurrent = (VERTEX_T*)dequeue();
if(pCurrent->color != BLACK)
{
(*vFunction)(pCurrent);
pCurrent->color = BLACK;
ADJACENT_T *pRef = pCurrent->adjacentHead;
while(pRef != NULL)
{
pAdjacent = (VERTEX_T*) pRef->pVertex;
if(pAdjacent->color != BLACK)
{
pAdjacent->color = GRAY;
enqueue(pAdjacent);
}
pRef = pRef->next;
}
}
} //end while queue has data
}
这是我的打印路径功能(它没有正常工作且是递归的)
void printVertexPath(VERTEX_T *pVertex)
{
if(pVertex->next!=NULL)
printf("%s to %s",pVertex->name,pVertex->data);
}
void printPath(char *key1,char *key2)
{
VERTEX_T *pCheck = NULL;
VERTEX_T *pStart = findVertexByKey(key1,&pCheck);
VERTEX_T *pVertex= findVertexByKey(key2,&pCheck);
if(pStart == NULL || pEnd == NULL)
{printf("Either of vertex is not found");}
else
{traverseBreadthFirst(pStart,&printVertexPath);}
}
你们有什么建议如何正确地做到这一点?我会很感激。这是我的第一个问题,对我糟糕的语法表示抱歉。
答案 0 :(得分:0)
当您访问traverseBreadFirst
函数中的每个节点时:您有以下这些行:
if(pAdjacent->color != BLACK)
{
pAdjacent->color = GRAY;
enqueue(pAdjacent);
}
您需要在其中添加内容以将pAdjacent
链接回pCurrent
。例如:改变它:
if(pAdjacent->color != BLACK)
{
pAdjacent->color = GRAY;
pAdjacent->backwards = pCurrent;
enqueue(pAdjacent);
}
当然,如果您使用此确切代码,则需要将VERTEX_T *backwards
添加到VERTEX_T
结构中。但是你可以采用不同的方式(例如:使用hashmap),只要最后你可以在函数的这一部分运行时找出每个节点的backwards
。
然后打印:从最后开始,然后按照后面的构建列表,然后当你到达开始时,你可以向前打印。