数据结构——图的遍历(BFS广度优先)

Dear 丶 2022-04-12 07:20 344阅读 0赞

//无向图
//邻接矩阵
//有权值
//广度优先遍历
//使用了队列

准备工作:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #define MAX_VERTEX_NUM 20
  5. #define MAX 20
  6. #define INF -1
  7. const int error=-1;
  8. #define ok 1
  9. typedef struct ArcCell
  10. {
  11. int adj;
  12. }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
  13. typedef struct
  14. {
  15. char vexs[MAX][MAX];
  16. AdjMatrix arcs;
  17. int vexnum,arcnum;
  18. }MGraph;
  19. typedef struct QNode
  20. {
  21. int data;
  22. struct QNode *next;
  23. }QNode,*QueuePtr;
  24. typedef struct
  25. {
  26. QueuePtr front;
  27. QueuePtr rear;
  28. }LinkQueue;
  29. //函数原型
  30. void CreateUDN(MGraph &G);
  31. int LocatVex(MGraph G,char v[MAX]);
  32. void show(MGraph G);
  33. int firstAdjVex(MGraph G,int &v);
  34. int NextAdjVex(MGraph G,int &v,int &w);
  35. void BFS(MGraph G);
  36. void InitQueue(LinkQueue &Q);
  37. void EnQueue(LinkQueue &Q,int x);
  38. void DeQueue(LinkQueue &Q,int &w);
  39. //全局变量:
  40. int visited[MAX];

主函数:

  1. int main()
  2. {
  3. MGraph G;
  4. CreateUDN(G);
  5. show(G);
  6. BFS(G);
  7. return 0;
  8. }

BFS代码:

  1. void BFS(MGraph G)
  2. {
  3. int i,w,v;
  4. LinkQueue Q;
  5. InitQueue(Q);
  6. for(i=0;i<G.vexnum;i++)
  7. {
  8. visited[i]=error;
  9. }
  10. for(i=0;i<G.vexnum;i++)
  11. {
  12. if(visited[i]==error)
  13. {
  14. printf("%s -> ",G.vexs[i]);
  15. visited[i]=ok;
  16. EnQueue(Q,i);
  17. while(Q.rear!=Q.front)
  18. {
  19. DeQueue(Q,v);
  20. for(w=firstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
  21. {
  22. if(visited[w]==error)
  23. {
  24. visited[w]=ok;
  25. printf(" %s -> ",G.vexs[w]);
  26. EnQueue(Q,w);
  27. }
  28. }
  29. }
  30. }
  31. }
  32. }

求邻接点的代码:

  1. int firstAdjVex(MGraph G,int &v)
  2. {
  3. int i;
  4. for(i=0;i<G.vexnum;i++)
  5. {
  6. if(G.arcs[v][i].adj!=error)
  7. {
  8. return i;
  9. }
  10. }
  11. return error;
  12. }
  13. int NextAdjVex(MGraph G,int &v,int &w)
  14. {
  15. int i;
  16. for(i=w+1;i<G.vexnum;i++)
  17. {
  18. if(G.arcs[v][i].adj!=error)
  19. {
  20. return i;
  21. }
  22. }
  23. return error;
  24. }

使用到关于队列的代码:

  1. void EnQueue(LinkQueue &Q,int x)
  2. {
  3. QNode *p;
  4. p=(QueuePtr)malloc(sizeof(QNode));
  5. if(!p) exit(0);
  6. p->data=x;
  7. p->next=NULL;
  8. Q.rear->next=p;
  9. Q.rear=p;
  10. return ;
  11. }
  12. void InitQueue(LinkQueue &Q)
  13. {
  14. Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
  15. if(Q.front==NULL) exit(0);
  16. Q.front->next=NULL;
  17. Q.rear->next=NULL;
  18. }
  19. void EnQueue(LinkQueue &Q,int x)
  20. {
  21. QNode *p;
  22. p=(QueuePtr)malloc(sizeof(QNode));
  23. if(!p) exit(0);
  24. p->data=x;
  25. p->next=NULL;
  26. Q.rear->next=p;
  27. Q.rear=p;
  28. return ;
  29. }

创建邻接矩阵的代码:

  1. void CreateUDN(MGraph &G)
  2. {
  3. int i,j,v,w;
  4. char v1[MAX],v2[MAX];
  5. printf("请输入顶点的个数: ");
  6. scanf("%d",&G.vexnum);
  7. printf("请输入边的个数: ");
  8. scanf("%d",&G.arcnum);
  9. for(i=0;i<G.vexnum;i++)
  10. {
  11. printf("请输入第%d个顶点的名称:",i+1);
  12. scanf("%s",G.vexs[i]);
  13. }
  14. for(i=0;i<G.vexnum;i++)
  15. {
  16. for(j=0;j<G.vexnum;j++)
  17. {
  18. G.arcs[i][j].adj=INF;
  19. }
  20. }
  21. for(v=0;v<G.arcnum;v++)
  22. {
  23. printf("请输入第一个顶点:");
  24. scanf("%s",&v1);
  25. printf("请输入第二个顶点:");
  26. scanf("%s",&v2);
  27. i=LocatVex(G,v1);
  28. j=LocatVex(G,v2);
  29. printf("请输入两顶点之间的权值:");
  30. scanf("%d",&w);
  31. G.arcs[i][j].adj=w;
  32. G.arcs[j][i]=G.arcs[i][j];
  33. }
  34. }
  35. int LocatVex(MGraph G,char v[MAX])
  36. {
  37. int i;
  38. for(i=0;i<G.vexnum;i++)
  39. {
  40. if(strcmp(G.vexs[i],v)==0)
  41. {
  42. return i;
  43. }
  44. }
  45. return error;
  46. }
  47. //打印邻接矩阵
  48. void show(MGraph G)
  49. {
  50. int i,j;
  51. for(i=0;i<G.vexnum;i++)
  52. {
  53. for(j=0;j<G.vexnum;j++)
  54. {
  55. if(G.arcs[i][j].adj!=error) printf(" %d",G.arcs[i][j].adj);
  56. else printf(" ");
  57. }
  58. printf("\n");
  59. }
  60. }

发表评论

表情:
评论列表 (有 0 条评论,344人围观)

还没有评论,来说两句吧...

相关阅读