C DFS找到所有可能的路径-我哪里出错了?

C DFS找到所有可能的路径-我哪里出错了?,c,graph-traversal,C,Graph Traversal,我需要实现DFS以从一个顶点找到所有可能的路径,比如“item” 到目前为止,我有以下几点,我不明白我哪里出了问题 void dfs() { int i; for(i=1;i<=nodecount;i++) { visited[i]=0; } push(item); while(top!=0) { pop(); visited[item]=1; for(i=1;i<

我需要实现DFS以从一个顶点找到所有可能的路径,比如“item”
到目前为止,我有以下几点,我不明白我哪里出了问题

void dfs()
{
    int i;
    for(i=1;i<=nodecount;i++)
    {
        visited[i]=0;
    }
    push(item);
    while(top!=0)
    {
        pop();
        visited[item]=1;
        for(i=1;i<nodecount;i++)
        {
            if(topo[item][i]==1)
            {
                if(visited[i]==0)
                {
                    item=i;
                    visited[i]=1;
                    push(item);
                }
            }
        }
    }
}
void dfs()
{
int i;

对于(i=1;i我认为您不应该在
访问[i]==0
时覆盖(中断)

此外,范围在初始化和DFS方面有所不同

还有一些修正

void dfs()
{
    int i;
    for(i=1;i<=nodecount;i++)
    {
        visited[i]=0;
    }
    visited[item]=1; /* add this to mark the start point as visited */
    push(item);
    while(top!=0)
    {
        pop();
        /* delete visited[item]=1; here */
        for(i=1;i<=nodecount;i++) /* changed < to <= */
        {
            if(topo[item][i]==1)
            {
                if(visited[i]==0)
                {
                    visited[i]=1; /* item is unchanged unless push change it */
                    push(i);
                }
            }
        }
    }
}

那么递归函数呢

void dfs(int item) {
  int i;
  push(item);
  visited[item] = 1;
  pstack();

  for(i=1; i<nodecount; i++) {
    if ((nodes[item][i] == 1) && (visited[i] == 0)) {
      dfs(i);
      visited[i] = 0;
    }
  }
  pop();
}

我将'item'作为函数的一个参数。注意:从1开始计数并不是真正的C-aware:)

您认为哪里不对?如果item为“1”,我得到的不是像“1 2 4 5”这样的路径,而是“2 3 2 4”或者类似的东西。首先,节点在重复,即使我跟踪访问了哪些节点。其次,源(项)不在路径中的节点列表中。
while(top!=0){…}
您没有更改
top
的值,是吗?但是,您需要提供更多信息。您需要创建一个。我正在使用top=0作为空堆栈感谢@user24603抱歉,应该使用
I
而不是
。已编辑。我尝试了您建议的新编辑。它仍然无法按我想要的方式工作。仍然获得与原始代码相同的输出。
void dfs(int item) {
  int i;
  push(item);
  visited[item] = 1;
  pstack();

  for(i=1; i<nodecount; i++) {
    if ((nodes[item][i] == 1) && (visited[i] == 0)) {
      dfs(i);
      visited[i] = 0;
    }
  }
  pop();
}
. 2 
. 2 1 
. 2 1 4 
. 2 1 4 5 
. 2 1 4 5 3 
. 2 3 
. 2 3 5 
. 2 3 5 4 
. 2 3 5 4 1 
. 2 4 
. 2 4 1 
. 2 4 5 
. 2 4 5 3