QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 894|回复: 9

关于图的遍历问题,谢谢

[复制链接]
发表于 2004-6-8 14:25:58 | 显示全部楼层 |阅读模式
深度遍历。该程序无法遍历完,为什么?
[code:1]
#include <stdio.h>
#define vnum 20

typedef struct arcnode
{
  int adjvex;
  struct arcnode *nextarc;
} ArcNodeTp;

typedef struct vexnode
{
  int vertex;
  ArcNodeTp *firstarc;
} AdjList[vnum];

typedef struct linkgraph
{
  AdjList adjs;
  int vexnum, arcnum;
} LGraphTp;

LGraphTp* Create_LNvGraph (LGraphTp *ga);

int main (void)
{
  LGraphTp *ga;
  int input;
  ga = (LGraphTp *) malloc (sizeof(LGraphTp));
  ga = Create_LNvGraph(ga);
  Print_LinkList(ga);
  printf("\n%s\n%s", "###深度优先搜索###", "请问要搜索的结点号:");
  scanf("%d", &input);
  DFS(ga, input);
  printf("\n\n");
}

LGraphTp* Create_LNvGraph (LGraphTp *ga)
{
  ArcNodeTp *p;
  int vex, arc, vexs, arcnum;
  int i, j, k;

  printf("\n无向图邻接表\n");
  printf("请输入顶点个数:");
  scanf("%d", &vex);
  printf("请输入边数个数:");
  scanf("%d", &arc);
  ga -> vexnum = vex;
  ga -> arcnum = arc;

  for (i = 0; i < ga -> vexnum; i++)
    {
      ga -> adjs[i].vertex = i + 1;
      ga -> adjs[i].firstarc = NULL;
    }

  for (k = 0; k < arc; k++)
    {
      printf("请输入第%d条边两个顶点的编号:", k + 1);
      scanf("%d %d", &i, &j);
      p = (ArcNodeTp *) malloc (sizeof(ArcNodeTp));
      p -> adjvex = j;
      p -> nextarc = ga -> adjs[i - 1].firstarc;
      ga -> adjs[i - 1].firstarc = p;
      p = (ArcNodeTp *) malloc (sizeof(ArcNodeTp));
      p -> adjvex = i;
      p -> nextarc = ga -> adjs[j - 1].firstarc;
      ga -> adjs[j - 1].firstarc = p;
    }
  return (ga);
}

int Print_LinkList (LGraphTp *ga)
{
  ArcNodeTp *p;
  int k;
  printf("\n目前输入的邻接表为:\n\n");
  
  for (k = 0; k < ga -> vexnum; k++)
    {
      printf("V%d:%d |", k + 1, ga -> adjs[k].vertex);
      p = ga -> adjs[k].firstarc;
      while (p != NULL)
        {
          printf(" -> %d", p -> adjvex);
          p = p -> nextarc;
        }
      printf("\n");
    }
}

int DFS (LGraphTp *ga, int v)
{
  ArcNodeTp *p;
  int j;
  static int visited[vnum];

  for (j = 0; j < vnum; j++)
    visited[vnum] = 0;

  printf(" -> %d ", v);
  visited[v] = 1;
  p = ga -> adjs[v].firstarc;
  while (p != NULL)
    {
      if (! visited[p -> adjvex])
        DFS(ga, p -> adjvex);
      p = p -> nextarc;
    }
}
[/code:1]
发表于 2004-6-8 16:43:13 | 显示全部楼层
在函数DFS()里边,你这个语句写错了
[code:1]p = ga -> adjs[v].firstarc; [/code:1]
应该是
[code:1]p = ga -> adjs[v-1].firstarc; [/code:1]
回复

使用道具 举报

 楼主| 发表于 2004-6-8 17:26:28 | 显示全部楼层
[quote:1ec11f6698="quarkonics"]在函数DFS()里边,你这个语句写错了
[code:1]p = ga -> adjs[v].firstarc; [/code:1]
应该是
[code:1]p = ga -> adjs[v-1].firstarc; [/code:1][/quote]
不行,改了以后程序无限循环。
回复

使用道具 举报

发表于 2004-6-8 20:00:12 | 显示全部楼层
你把你无限循环的例子发出来
回复

使用道具 举报

发表于 2004-6-8 20:01:55 | 显示全部楼层
还有就是你这句话放那里没用,我把他去掉了
for (j = 0; j < vnum; j++)
    visited[vnum] = 0;
回复

使用道具 举报

发表于 2004-6-8 20:03:37 | 显示全部楼层
我这里可以运行
[quark@server dfs]$ ./a.out

ÎÞÏòͼÁÚ½Ó±í
ÇëÊäÈ붥µã¸öÊý:5
ÇëÊäÈë±ßÊý¸öÊý:6
ÇëÊäÈëµÚ1Ìõ±ßÁ½¸ö¶¥µãµÄ±àºÅ:1 2
ÇëÊäÈëµÚ2Ìõ±ßÁ½¸ö¶¥µãµÄ±àºÅ:1 4
ÇëÊäÈëµÚ3Ìõ±ßÁ½¸ö¶¥µãµÄ±àºÅ:2 3
ÇëÊäÈëµÚ4Ìõ±ßÁ½¸ö¶¥µãµÄ±àºÅ:2 5
ÇëÊäÈëµÚ5Ìõ±ßÁ½¸ö¶¥µãµÄ±àºÅ:3 4
ÇëÊäÈëµÚ6Ìõ±ßÁ½¸ö¶¥µãµÄ±àºÅ:3 5

Ä¿Ç°ÊäÈëµÄÁÚ½Ó±íΪ:

V1:1 | -> 4 -> 2
V2:2 | -> 5 -> 3 -> 1
V3:3 | -> 5 -> 4 -> 2
V4:4 | -> 3 -> 1
V5:5 | -> 3 -> 2

###Éî¶ÈÓÅÏÈËÑË÷###
ÇëÎÊÒªËÑË÷µÄ½áµãºÅ:2
-> 2  -> 5  -> 3  -> 4  -> 1
回复

使用道具 举报

 楼主| 发表于 2004-6-8 20:31:25 | 显示全部楼层
[quote:6882d815c0="quarkonics"]我这里可以运行
[quark@server dfs]$ ./a.out

ÎÞÏòͼÁÚ½Ó±í
ÇëÊäÈ붥µã¸öÊý:5
ÇëÊäÈë±ßÊý¸öÊý:6
ÇëÊäÈëµÚ1Ìõ±ßÁ½¸ö¶¥µãµÄ±àºÅ:1 2
ÇëÊäÈëµÚ2Ìõ±ßÁ½¸ö¶¥µãµÄ±àºÅ:1 4
ÇëÊäÈëµÚ3Ìõ±ßÁ½¸ö¶¥µãµÄ±àºÅ:2 3
ÇëÊäÈëµÚ4Ìõ±ßÁ½¸ö¶¥µãµÄ±àºÅ:2 5
ÇëÊäÈëµÚ5Ìõ±ßÁ½¸ö¶¥µãµÄ±àºÅ:3 4
ÇëÊäÈëµÚ6Ìõ±ßÁ½¸ö¶¥µãµÄ±àºÅ:3 5

Ä¿Ç°ÊäÈëµÄÁÚ½Ó±íΪ:

V1:1 | -> 4 -> 2
V2:2 | -> 5 -> 3 -> 1
V3:3 | -> 5 -> 4 -> 2
V4:4 | -> 3 -> 1
V5:5 | -> 3 -> 2

###Éî¶ÈÓÅÏÈËÑË÷###
ÇëÎÊÒªËÑË÷µÄ½áµãºÅ:2
-> 2  -> 5  -> 3  -> 4  -> 1[/quote]

   中间一堆&***是什么阿
回复

使用道具 举报

发表于 2004-6-8 20:38:16 | 显示全部楼层
哦,我从SecureCRT上拷下来得,就成这样了,不过大概看的出来就行了
回复

使用道具 举报

 楼主| 发表于 2004-6-8 20:49:57 | 显示全部楼层
奇怪。前面出现循环。现在又没有了。真是奇怪。不过谢谢楼上各位了。   
回复

使用道具 举报

发表于 2004-6-8 20:52:42 | 显示全部楼层
呵呵,你程序写得不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 04:47 , Processed in 0.036513 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表