您的位置:首页 > 其它

图的广度优先搜索(BFS)

2017-04-28 21:14 204 查看
把以前写过的图的广度优先搜索分享给大家(C语言版)

1 #include<stdio.h>
2 #include<stdlib.h>
3 #define MAX_VERTEX_NUM 20
4 #define MAXQSIZE 100
5 #define OK 1
6 typedef char VertexType;
7 typedef int QElemType;
8
9 typedef struct ArcNode//边结点
10 {
11     int adjvex;
12     struct ArcNode *nextarc;
13 }ArcNode;
14
15 typedef struct VNode//定义头数组
16 {
17     VertexType data;
18     ArcNode *firstarc;
19 }VNode,AdjList[MAX_VERTEX_NUM];
20
21 typedef struct ALGraph//定义图
22 {
23     AdjList vertices;
24     int vernum,arcnum;
25 }ALGraph;
26
27 typedef struct SqQueue
28 {
29     QElemType *base;
30     int front;
31     int rear;
32 }SqQueue;
33
34 int CreateDG(ALGraph &G)
35 {
36     int i,j,k,v1,v2;
37     ArcNode *p;
38     printf("请输入图的节点数:");
39     scanf("%d",&G.vernum );
40     printf("请输入图的边的个数:");
41     scanf("%d",&G.arcnum);
42     for(i=0;i<G.vernum;i++)
43     {
44         printf("请输入第%d个顶点数据:",i+1);
45         getchar();
46         scanf("%c",&G.vertices[i].data);
47         //G.vertices[i].data=i;
48         G.vertices[i].firstarc=NULL;
49     }
50     printf("请输入节点的边关系,如:结点1和结点2有边就输入1和2(每条边就输入一次):\n");
51     for(k=0;k<G.arcnum;k++)
52     {
53         printf("请输入第%d条边的一个结点:",k+1);
54         scanf("%d",&v1);
55         printf("请输入第%d条边的另一个结点:",k+1);
56         scanf("%d",&v2);
57         printf("\n");
58         i=v1;
59         j=v2;
60         while(i<1||i>G.vernum||j<1||j>G.vernum)
61         {
62             printf("请输入第%d条边的一个结点:",k+1);
63             scanf("%d",&v1);
64             printf("请输入第%d条边的一个结点:",k+1);
65             scanf("%d",&v2);
66             printf("\n");
67             i=v1;
68             j=v2;
69         }
70         p=(ArcNode *)malloc(sizeof(ArcNode));
71         if(!p)
72         {
73             printf("分配内存失败!\n");
74             return 0;
75         }
76         p->adjvex=j-1;
77         p->nextarc=G.vertices[i-1].firstarc;
78         G.vertices[i-1].firstarc=p;
79     }
80     return OK;
81 }
82 int InitQueue(SqQueue &Q)
83 {
84     Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
85     if(!Q.base)
86     {
87         printf("队列内存失败!\n");
88         return 0;
89     }
90     Q.front=Q.rear=0;
91     return (OK);
92 }
93
94 int EnQueue(SqQueue &Q,QElemType e)
95 {
96     if((Q.rear+1)%MAXQSIZE==Q.front)
97     {
98         printf("队列已满!\n");
99         return 0;
100     }
101     Q.base[Q.rear]=e;
102     Q.rear=(Q.rear+1)%MAXQSIZE;
103     return (OK);
104 }
105 int QueueEmpty(SqQueue Q)
106 {
107     if(Q.front==Q.rear)
108         return (OK);
109     else
110         return 0;
111 }
112
113 int DeQueue(SqQueue &Q,QElemType &e)
114 {
115     if(Q.front==Q.rear)
116     {
117         printf("队列为空!无法删除!\n");
118         return 0;
119     }
120     e=Q.base[Q.front];
121     Q.front=(Q.front+1)%MAXQSIZE;
122     return (e);
123 }
124 void BFSTraverse(ALGraph G)
125 {
126     int i,j,k;
127     int visited[MAX_VERTEX_NUM];
128     ArcNode *p;
129     SqQueue Q;
130     for(i=0;i<G.vernum;i++)
131         visited[i]=0;
132     InitQueue(Q);
133     for(i=0;i<G.vernum;i++)
134     {
135         if(visited[i]==0)
136         {
137             visited[i]=1;
138             printf("%c-->",G.vertices[i].data);
139             EnQueue(Q,i);
140             while(!QueueEmpty(Q))
141             {
142                 DeQueue(Q,j);
143                 for(k=j,p=G.vertices[j].firstarc;p!=NULL;k=p->adjvex,p=p->nextarc)
144                 {
145                     if(visited[k]==0)
146                     {
147                         visited[k]=1;
148                         printf("%c-->",G.vertices[k].data);
149                         EnQueue(Q,k);
150                     }
151                 }
152             }
153         }
154     }
155 }
156 int main()
157 {
158     ALGraph G;
159     CreateDG(G);
160
161     printf("广度优先搜索结果为\n开始-->");
162     BFSTraverse(G);
163     printf("结束!\n");
164     return 0;
165 }


运行结果截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: