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
- C数据结构学习历程(5) 图之数组表示法的BFS
- C数据结构学习历程(5) 图之数组表示法
- C数据结构学习历程(7) 图之十字链表 表示法
- 数据结构之图的数组表示法
- 图的数组表示法-数据结构(18)
- 数据结构之---C语言实现图的数组(邻接矩阵)存储表示
- C数据结构学习历程(6) 图之邻接表表示法
- 数据结构学习笔记 --- 图(数组表示法)
- 数据结构学习笔记 --- 图(数组表示法)
- C数据结构学习历程(4) 链栈之 括号匹配
- 数据结构之---C语言实现数组的顺序存储表示(可运行)
- 数据结构---图(数组表示法)
- C语言 数组的顺序表示与实现 数据结构
- 数据结构 学习笔记(七):图(上):图的表示方法(邻接表,邻接矩阵),遍历(DFS,BFS)
- 《数据结构与算法》学习笔记4 存储对象的数组和大O表示法
- C数据结构学习历程(1) 顺序表
- C数据结构学习历程(2) 链表
- 我的Ruby学习历程之初识数组
- 关于ext前端Date传到后台变成String形式的解决办法
- python 下执行wget传入参数
- UNITY之CharacterController
- redis 五种数据类型的使用场景
- linux_文件类型
- C数据结构学习历程(5) 图之数组表示法的BFS
- MySQL查看和修改字符集的方法
- 排列问题算法-next_permutation,康托编码
- python模块datetime的使用2
- js倒计时时间不准 && css选择器优先级 && promise详解
- Vijos P1218 数字游戏(动态规划,环形DP)
- 使用EmBitz 编译mbed提示required from 'void WIZnet_Chip::reg_wr(uint16_t, T) [with T = short unsigned int;
- JSP显示服务器路径下的图片
- 欢迎使用CSDN-markdown编辑器