如何打印图形路径(c编程)

时间:2015-03-10 18:36:51

标签: c data-structures

假设我想从图形结构中打印路径。 我想打印从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);}
}

你们有什么建议如何正确地做到这一点?我会很感激。这是我的第一个问题,对我糟糕的语法表示抱歉。

1 个答案:

答案 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

然后打印:从最后开始,然后按照后面的构建列表,然后当你到达开始时,你可以向前打印。