第十一周项目三

/*
Copyright (c++) 2017,烟台大学计算机与控制工程学院
文件名称:jcy
作 者:贾存钰
完成日期:2017年11月11日
问题描述:实现图遍历算法,分别输出如下图结构的深度优先(DFS)遍历序列和广度优先遍历(BFS)序列。 

利用项目一得算法库


*/

[cpp]  view plain  copy
  1. //深度优先遍历——DFS  
  2. #include <stdio.h>  
  3. #include <malloc.h>  
  4. #include "graph.h"  
  5. int visited[MAXV];  
  6. void DFS(ALGraph *G, int v)  
  7. {  
  8.     ArcNode *p;  
  9.     int w;  
  10.     visited[v]=1;  
  11.     printf("%d ", v);  
  12.     p=G->adjlist[v].firstarc;  
  13.     while (p!=NULL)  
  14.     {  
  15.         w=p->adjvex;  
  16.         if (visited[w]==0)  
  17.             DFS(G,w);  
  18.         p=p->nextarc;  
  19.     }  
  20. }  
  21.   
  22. int main()  
  23. {  
  24.     int i;  
  25.     ALGraph *G;  
  26.     int A[5][5]=  
  27.     {  
  28.         {0,1,0,1,0},  
  29.         {1,0,1,0,0},  
  30.         {0,1,0,1,1},  
  31.         {1,0,1,0,1},  
  32.         {0,0,1,1,0}  
  33.     };  
  34.     ArrayToList(A[0], 5, G);  
  35.   
  36.     for(i=0; i<MAXV; i++) visited[i]=0;  
  37.     printf(" 由2开始深度遍历:");  
  38.     DFS(G, 2);  
  39.     printf("\n");  
  40.   
  41.     for(i=0; i<MAXV; i++) visited[i]=0;  
  42.     printf(" 由0开始深度遍历:");  
  43.     DFS(G, 0);  
  44.     printf("\n");  
  45.     return 0;  
  46. }  



[cpp]  view plain  copy
  1. //广度优先遍历——BFS  
  2. #include <stdio.h>  
  3. #include <malloc.h>  
  4. #include "graph.h"  
  5.   
  6. void BFS(ALGraph *G, int v)  
  7. {  
  8.     ArcNode *p;  
  9.     int w,i;  
  10.     int queue[MAXV],front=0,rear=0; //定义循环队列  
  11.     int visited[MAXV];     //定义存放节点的访问标志的数组  
  12.     for (i=0; i<G->n; i++) visited[i]=0; //访问标志数组初始化  
  13.     printf("%2d",v);            //输出被访问顶点的编号  
  14.     visited[v]=1;                       //置已访问标记  
  15.     rear=(rear+1)%MAXV;  
  16.     queue[rear]=v;              //v进队  
  17.     while (front!=rear)         //若队列不空时循环  
  18.     {  
  19.         front=(front+1)%MAXV;  
  20.         w=queue[front];             //出队并赋给w  
  21.         p=G->adjlist[w].firstarc;   //找w的第一个的邻接点  
  22.         while (p!=NULL)  
  23.         {  
  24.             if (visited[p->adjvex]==0)  
  25.             {  
  26.                 printf("%2d",p->adjvex); //访问之  
  27.                 visited[p->adjvex]=1;  
  28.                 rear=(rear+1)%MAXV; //该顶点进队  
  29.                 queue[rear]=p->adjvex;  
  30.             }  
  31.             p=p->nextarc;       //找下一个邻接顶点  
  32.         }  
  33.     }  
  34.     printf("\n");  
  35. }  
  36.   
  37.   
  38. int main()  
  39. {  
  40.     ALGraph *G;  
  41.     int A[5][5]=  
  42.     {  
  43.         {0,1,0,1,0},  
  44.         {1,0,1,0,0},  
  45.         {0,1,0,1,1},  
  46.         {1,0,1,0,1},  
  47.         {0,0,1,1,0}  
  48.     };  
  49.     ArrayToList(A[0], 5, G);  
  50.   
  51.     printf(" 由2开始广度遍历:");  
  52.     BFS(G, 2);  
  53.   
  54.     printf(" 由0开始广度遍历:");  
  55.     BFS(G, 0);  
  56.     return 0;  
  57. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值