免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1111 | 回复: 3
打印 上一主题 下一主题

都两天了。大家帮帮我呀~关于图遍历的。谢谢了。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-06-08 15:05 |只看该作者 |倒序浏览
深度遍历没有遍历全,而广度遍历却"跳着"遍历。
  1. #include <stdio.h>;
  2. #define vnum 20
  3. typedef struct arcnode
  4. {
  5.   int adjvex;
  6.   struct arcnode *nextarc;
  7. } ArcNodeTp;
  8. typedef struct vexnode
  9. {
  10.   int vertex;
  11.   ArcNodeTp *firstarc;
  12. } AdjList[vnum];
  13. typedef struct linkgraph
  14. {
  15.   AdjList adjs;
  16.   int vexnum, arcnum;
  17. } LGraphTp;
  18. typedef struct linked_queue
  19. {
  20.   int data;
  21.   struct linked_queue *next;
  22. } LqueueTp;
  23. typedef struct queueptr
  24. {
  25.   LqueueTp *front, *rear;
  26. } QueptrTp;
  27. LGraphTp* Create_LNvGraph (LGraphTp *ga);
  28. int main (void)
  29. {
  30.   LGraphTp *ga;
  31.   int input, choose;
  32.   ga = (LGraphTp *) malloc (sizeof(LGraphTp));
  33.   ga = Create_LNvGraph(ga);
  34.   Print_LinkList(ga);
  35.   printf("\n1:深度优先搜索 2:广度优先搜索 3,返回:");
  36.   scanf("%d", &choose);
  37.   switch (choose)
  38.     {
  39.     case 1:
  40.       printf("\n%s\n%s", "###深度优先搜索###", "请问要搜索的结点号:");
  41.       scanf("%d", &input);
  42.       DFS(ga, input);
  43.       break;
  44.     case 2:
  45.       printf("\n%s\n%s", "###广度优先搜索###", "请问要搜索的结点号:");
  46.       scanf("%d", &input);
  47.       BFS(ga, input);
  48.       break;
  49.     case 3:
  50.       break;
  51.     default:
  52.       printf("\n选择错误!\n");
  53.     }
  54.   printf("\n\n");
  55. }
  56. LGraphTp* Create_LNvGraph (LGraphTp *ga)
  57. {
  58.   ArcNodeTp *p;
  59.   int vex, arc, vexs, arcnum;
  60.   int i, j, k;
  61.   printf("\n无向图邻接表\n");
  62.   printf("请输入顶点个数:");
  63.   scanf("%d", &vex);
  64.   printf("请输入边数个数:");
  65.   scanf("%d", &arc);
  66.   ga ->; vexnum = vex;
  67.   ga ->; arcnum = arc;
  68.   for (i = 0; i < ga ->; vexnum; i++)
  69.     {
  70.       ga ->; adjs[i].vertex = i + 1;
  71.       ga ->; adjs[i].firstarc = NULL;
  72.     }
  73.   for (k = 0; k < arc; k++)
  74.     {
  75.       printf("请输入第%d条边两个顶点的编号:", k + 1);
  76.       scanf("%d %d", &i, &j);
  77.       p = (ArcNodeTp *) malloc (sizeof(ArcNodeTp));
  78.       p ->; adjvex = j;
  79.       p ->; nextarc = ga ->; adjs[i - 1].firstarc;
  80.       ga ->; adjs[i - 1].firstarc = p;
  81.       p = (ArcNodeTp *) malloc (sizeof(ArcNodeTp));
  82.       p ->; adjvex = i;
  83.       p ->; nextarc = ga ->; adjs[j - 1].firstarc;
  84.       ga ->; adjs[j - 1].firstarc = p;
  85.     }
  86.   return (ga);
  87. }
  88. int Print_LinkList (LGraphTp *ga)
  89. {
  90.   ArcNodeTp *p;
  91.   int k;
  92.   printf("\n目前输入的邻接表为:\n\n");
  93.   
  94.   for (k = 0; k < ga ->; vexnum; k++)
  95.     {
  96.       printf("V%d:%d |", k + 1, ga ->; adjs[k].vertex);
  97.       p = ga ->; adjs[k].firstarc;
  98.       while (p != NULL)
  99.         {
  100.           printf(" ->; %d", p ->; adjvex);
  101.           p = p ->; nextarc;
  102.         }
  103.       printf("\n");
  104.     }
  105. }
  106. int DFS (LGraphTp *ga, int v)
  107. {
  108.   ArcNodeTp *p;
  109.   int j;
  110.   static int visited[vnum];
  111.   for (j = 0; j < vnum; j++)
  112.     visited[vnum] = 0;
  113.   printf(" ->; %d ", v);
  114.   visited[v] = 1;
  115.   p = ga ->; adjs[v].firstarc;
  116.   while (p != NULL)
  117.     {
  118.       if (! visited[p ->; adjvex])
  119.         DFS(ga, p ->; adjvex);
  120.       p = p ->; nextarc;
  121.     }
  122. }
  123. int InitQueue (QueptrTp **lq)
  124. {
  125.   LqueueTp *p;
  126.   p = (LqueueTp *) malloc (sizeof(LqueueTp));
  127.   (*lq) ->; front = p;
  128.   (*lq) ->; rear = p;
  129.   ((*lq) ->; front)  ->; next = NULL;
  130. }
  131. int EnQueue (QueptrTp **lq, int x)
  132. {
  133.   LqueueTp *p;
  134.   p = (LqueueTp *) malloc (sizeof(LqueueTp));
  135.   p ->; data = x;
  136.   p ->; next = NULL;
  137.   ((*lq) ->; rear) ->; next = p;
  138.   (*lq) ->; rear = p;
  139. }
  140. int OutQueue (QueptrTp **lq, int *x)
  141. {
  142.   LqueueTp *s;
  143.   if ((*lq) ->; front == (*lq) ->; rear)
  144.     {
  145.       printf("队空!\n");
  146.       return 0;
  147.     }
  148.   else
  149.     {
  150.     s = ((*lq) ->; front) ->; next;
  151.     *x = s ->; data;
  152.     ((*lq) ->; front) ->; next = s ->; next;
  153.     if (s ->; next == NULL)
  154.       (*lq) ->; rear = (*lq) ->; front;
  155.     free(s);
  156.     return 1;
  157.     }
  158. }
  159. int EmptyQueue (QueptrTp **lq)
  160. {
  161.   if (((*lq) ->; rear) == ((*lq) ->; front))
  162.     return 1;
  163.   else
  164.     return 0;
  165. }
  166. int GetHead (QueptrTp **lq, int *x)
  167. {
  168.   LqueueTp *p;
  169.   if ((*lq) ->; rear == (*lq) ->; front)
  170.     return 0;
  171.   else
  172.     {
  173.       p = ((*lq) ->; front ) ->; next;
  174.       *x = p ->; data;
  175.       return 1;
  176.     }
  177. }  
  178. int BFS(LGraphTp *ga, int v)
  179. {
  180.   QueptrTp *Q;
  181.   static int visited[vnum];
  182.   ArcNodeTp *p;
  183.   InitQueue(&Q);
  184.   printf("%d", v);
  185.   visited[v] = 1;
  186.   EnQueue(&Q, v);
  187.   while (! EmptyQueue(&Q))
  188.     {
  189.       OutQueue(&Q, &v);
  190.       p = ga ->; adjs[v].firstarc;
  191.       while (p != NULL)
  192.         {
  193.           if (! visited[p ->; adjvex])
  194.             {
  195.               printf("%d", p ->; adjvex);
  196.               visited[p ->; adjvex] = 1;
  197.               EnQueue(&Q, p ->; adjvex);
  198.             }
  199.           p = p ->; nextarc;
  200.         }
  201.     }
  202. }
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-06-08 19:08 |只看该作者

都两天了。大家帮帮我呀~关于图遍历的。谢谢了。

没时间帮你看。
这程序是你写的还是抄的书上的?
很多数据结构书上都有代码的,
参考一下把。

论坛徽章:
0
3 [报告]
发表于 2004-06-08 19:15 |只看该作者

都两天了。大家帮帮我呀~关于图遍历的。谢谢了。

原帖由 "lenovo" 发表:
没时间帮你看。
这程序是你写的还是抄的书上的?
很多数据结构书上都有代码的,
参考一下把。
书上只给出伪代码。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2004-06-08 19:15 |只看该作者

都两天了。大家帮帮我呀~关于图遍历的。谢谢了。

那就找一本有源代码的,
或者仔细检查你的源码和伪码之间的差别。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP