C数据结构学习历程(5) 图之数组表示法的BFS

来源:互联网 发布:cyberghost for mac 编辑:程序博客网 时间:2024/04/19 02:01

 我是参照《严蔚敏数据结构ppt》http://wenku.baidu.com/view/3ff16fc20242a8956aece41d.html以及《严蔚敏c数据结构视频》来写的,因为ppt上有些错,而视频上的代码不全,自己另写了。ppt上错哪,我就不指出了,大家可以对照着看,就能发现不同之处。其中图这部分主要是《大话数据结构》来的。对于图前面的知识,之前写了但是忘了上传。

#include<iostream>using namespace std;#include<cmath>typedef char VertexType; //顶点类型typedef int EdgeType; //边上的权值类型#define MAXVEX 100#define INFINITY 65535  //用这个值代表无穷typedef struct{VertexType vexs[MAXVEX];      //顶点表EdgeType arc[MAXVEX][MAXVEX]; //邻接矩阵int numVertexes ,numEdges;    //图中当前的顶点数和边数}MGraph;//建立无向图的邻接矩阵void CreateMGraph(MGraph *G){int i,j,k,w;cout<<"输入顶点数和边数:"<<endl;cin>>G->numVertexes >>G->numEdges ;for(i=0;i<G->numVertexes ;i++){cout<<"输入顶点值:"<<endl;cin>>G->vexs [i];}for(i=0;i<G->numVertexes ;i++)for(j=0;j<G->numVertexes ;j++)G->arc [i][j]=INFINITY;           //邻接矩阵初始化for(k=0;k<G->numEdges ;k++){cout<<"输入边(vi,vj)上的下标i,下标j和权值w"<<endl;  //从下标0开始cin>>i>>j>>w;G->arc [i][j]=w;G->arc [j][i]=w;}}//DFS算法,邻接矩阵形式的typedef int Boolean;Boolean visited[MAXVEX];void DFS(MGraph G,int i){visited[i]=true;cout<<G.vexs[i] <<endl;  //打印 出来for(int j=0;j<G.numVertexes ;j++){if(!visited[j]&&G.arc [i][j]==1){DFS(G,j);}}}void DFSTraverse(MGraph G){for(int i=0;i<G.numVertexes ;i++)      //初始化别忘了{visited[i]=false;}for(int i=0;i<G.numVertexes ;i++)    //自己记下来的{if(!visited[i]){DFS(G,i);}}}//用到队列来进行广度优先,typedef struct QNode{int data;     //这个我用了保存入队列的下标值struct QNode * next;}QNode;typedef struct {QNode * front;QNode * rear;}LinkQueue;void InitQueue(LinkQueue &Q){Q.front =Q.rear =(QNode*)malloc(sizeof(QNode));//这样做就是两个指针是可以 对同一个node进行操作,都可以改变node状态Q.front ->next =NULL;}void EnQueue(LinkQueue&Q,int d){QNode *p=(QNode*)malloc(sizeof(QNode));p->data =d;p->next =NULL;Q.rear ->next =p;Q.rear =p;}int DeQueue(LinkQueue&Q)   //一次出一个{if(Q.front ==Q.rear ){cout<<"不能出队 ";return 0;}int d;d=Q.front ->next->data ;QNode*p=Q.front ->next;Q.front ->next =p->next ; //这个差点忘了if(Q.rear ==p) Q.rear =Q.front ;free(p);           //因为这个链表第一个node不是实际的  ,删除的注意点挺多的return d;}//BFSvoid BFSTraverse(MGraph  G){for(int i=0;i<G.numVertexes ;i++){visited[i]=false;}LinkQueue Q;            //初始化visited和队列InitQueue(Q);for(int i=0;i<G.numVertexes ;i++)  //对所有的结点循环{if(!visited[i]){visited[i]=true;EnQueue(Q,i);cout<<G.vexs [i]<<endl;//这里少了一句while(Q.front !=Q.rear ){int t=DeQueue(Q);   //要用到的for(int j=0;j<G.numVertexes ;j++){if(G.arc [t][j]==1&&!visited[j]){visited[j]=true;EnQueue(Q,j);cout<<G.vexs [j]<<endl;}  }//DeQueue(Q);}}}cout<<"a";}int main(){/*LinkQueue Q;InitQueue(Q);EnQueue(Q,1);EnQueue(Q,2);EnQueue(Q,3);int a=DeQueue(Q);int a2=DeQueue(Q);int a3=DeQueue(Q);     //验证队列可行*/MGraph p;CreateMGraph(&p);BFSTraverse(p);   //加上引用就可以不用跳转了 ,我记得之前不用啊//DFSTraverse(p);int i1=0;return 0;}


0 0
原创粉丝点击