图的邻接矩阵算法以及广度和深度遍历

果然,长期不碰数据结构后手都生了,写个小程序鼓捣了半天。其间一个幼稚的错误居然缠了很久,就是我设了MAX_VEXS_NUM为4时,我居然运行时考虑节点数为5和9的情况,而C++又不报数组越界的错误,所以对着莫名其妙的结果愣了半天。实在是太粗心了,以后要谨慎。

代码贴上来,每天看一下数据结构和算法。学再多框架都是虚的(当然,为了找工作,学框架是必要的,在J2EE如火如荼的今天),因为保不定哪天又有新的语言和框架出来。良好的数据结构和算法知识才是在编程武侠中笑傲江湖的内功心法。一定要注意!

代码:

#include<iostream> #define MAX_VEXS_NUM 20 using namespace std; //我真是吐血,当时杨薇薇的《数据结构》把所有图的算法写得清清楚楚,没有人说经典; //而被称为“经典”的严老的数据结构,图这一章的遍历算法,您也未免太伪代码了点吧? //太不顾及读者的感受!!!后悔把杨的数据结构卖了。 //用邻接表的形式来表示图 typedef struct Graph { int vexs[MAX_VEXS_NUM]; int edgs[MAX_VEXS_NUM][MAX_VEXS_NUM]; int n; int e; }MyGraphm,*MyGraph; //用邻接表的形式来创建图 void createGraph(MyGraph &g) { int i=0,j=0,k=0,w=0,vexnum,arcnum; g=new MyGraphm(); cout<<“请输入图的节点数和边数:/n”; cin>>g->n; cin>>g->e; vexnum=g->n; arcnum=g->e; cout<<“请输入各个节点:”<<endl; for(i=0;i<vexnum;i++) cin>>g->vexs[i]; for(i=0;i<vexnum;i++) for(j=0;j<vexnum;j++) { g->edgs[i][j]=0; } cout<<“请输入无向图的各个边:”<<endl; for(i=0;i<arcnum;i++) { scanf(“%d”,&j); scanf(“%d”,&k); scanf(“%d”,&w); g->edgs[j][k]=w; g->edgs[k][j]=w; } cout<<“无向图建立完毕”<<endl; } //标识节点是否被访问过的数组 bool visit[MAX_VEXS_NUM]; //定义了队列,方便广度优先遍历时使用 typedef struct Queue { int data[300]; int front; int rear; }MyQ,*MyQueue; void initQueue(MyQueue &my) { MyQ *q=new MyQ(); my=q; my->front=-1; my->rear=-1; cout<<“队列建立完毕/n”; } void EnQueue(MyQueue &myQ,int i) { myQ->data[++(myQ->front)]=i; } bool IsEmpty(MyQueue &myQ) { if(myQ->front==myQ->rear) { return true; } else return false; } int DeQueue(MyQueue &myQ) { int i=-1; if(!IsEmpty(myQ)) { i=myQ->data[++(myQ->rear)]; } return i; } //返回某个节点的邻接节点 int nextVext(MyGraph &g,int k) { for(int i=0;i<g->n;i++) { if(g->edgs[k][i]!=0&&k!=i&&visit[i]==false) { return i; } } return -1; } //深度遍历算法 void DFS(MyGraph &g,int i) { cout<<i<<” “; visit[i]=true; int w; for(w=nextVext(g,i);w>0;w=nextVext(g,i)) { //cout<<“w=”<<w<<endl; DFS(g,w); } } void DFSTraverse(MyGraph &g) { for(int i=0;i<g->n;i++) { visit[i]=false; } for(int i2=0;i2<g->n;i2++) { if(visit[i2]==false) DFS(g,i2); } } //广度遍历算法 void BFSTraverse(MyGraph &g) { for(int i=0;i<MAX_VEXS_NUM;i++) { visit[i]=false; } MyQueue myQ; initQueue(myQ); for(int i=0;i<g->n;i++) { if(visit[i]==false) { cout<<i<<” “; visit[i]=true; EnQueue(myQ,i); while(IsEmpty(myQ)==false) { int k=DeQueue(myQ); for(int w=nextVext(g,k);w>0;w=nextVext(g,k)) { cout<<w<<” “; visit[w]=true; EnQueue(myQ,w); } } } } } int main() { MyGraph my; createGraph(my); int i,j; cout<<“此图的邻接矩阵表示法为:”<<endl; for(i=0;i<my->n;i++) { for(j=0;j<my->n;j++) { cout<<my->edgs[i][j]<<” “; } cout<<endl; } cout<<“深度遍历的结果为:/n”; DFSTraverse(my); cout<<endl; cout<<“广度遍历的结果为:/n”; BFSTraverse(my); system(“pause”); return 1; }

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/rongyongfeikai2/article/details/5957392
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞