利用邻接矩阵存储无向图,并实现BFS(非递归) DFS(递归+非递归)两种遍历
来源:互联网 发布:蓝牙耳机推荐 知乎2016 编辑:程序博客网 时间:2024/06/05 23:08
代码如下:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>using namespace std;//------------邻接矩阵----------- #define MAX 20typedef char Dtype;typedef int mapmax[MAX][MAX];int visited[MAX];typedef struct{int dian,hu;Dtype d[MAX];mapmax map;}M;//-----------------栈------------------typedef struct{int *base;int top;int size;}Stack;int Gettop(Stack S,int &e);void Pop(Stack &S,int &e);void Push(Stack &S,int e);int Isempty(Stack S);void InitStack(Stack &S); int locate(M G,Dtype a);void creat_map(M &G);//------------队列----------------------typedef struct {//队列 int *base;int front;int rear;int tag;}Sq;void InitSq(Sq &QQ);int Getlen(Sq QQ);int Isempty(Sq QQ);void InSq(Sq &QQ,int e);void OutSq(Sq &QQ,int &e);void GetHead(Sq QQ,int &e); //-----------------DFS-digui--------------------int first(M G,int i);int next(M G,int i,int w);void DFS1(M G,int i);//-----------------DFS-fei-digui------------------void DFS(M G,int v);//-----------------BFS--------------------void BFS(M G){Sq q;InitSq(q);int v,e;for(int i=1;i<=G.dian;i++){if(!visited[i]){cout<<G.d[i]<<" ";visited[i]=1;InSq(q,i);}GetHead(q,v);for(int j=2;j<=G.dian;j++){if(G.map[v][j]==1 && !visited[j]){cout<<G.d[j]<<" ";visited[j]=1;InSq(q,j);}}OutSq(q,e);}}int main(){M G;memset(visited,0,sizeof(visited));memset(G.map,0,sizeof(G.map));creat_map(G);//BFS(G);for(int i=1;i<=G.dian;i++){if(!visited[i])DFS1(G,i);}return 0;}//--------------------------DFS fei digui------------------void DFS(M G,int v){Stack S;InitStack(S);visited[v]=1;cout<<G.d[v]<<" ";Push(S,v);int e;while(!Isempty(S)){Gettop(S,v);for(int i=1;i<=G.dian;i++){if(G.map[v][i]==1 && !visited[i]){cout<<G.d[i]<<" ";Push(S,i);visited[i]=1;v=i;i=1; }}if(!Isempty(S))Pop(S,e);}}//-----------------DFS---digui------------------int next(M G,int i,int w){for(int j=w+1;j<=G.dian;j++){if(G.map[i][j]==1){G.map[i][j]==0;return j;}}return 0;}void DFS1(M G,int i){int w=1;visited[i]=1;cout<<G.d[i];for(w=next(G,i,w);w>0;w=next(G,i,w))//利用next函数不断寻找节点指向的下一个元素 {if(!visited[w]){DFS1(G,w);}}}//-----------------邻接矩阵------------------------------ int locate(M G,Dtype a){for(int i=1;i<=G.dian;i++){if(a==G.d[i])return i;}return 0;}void creat_map(M &G){//输入无向图的顶点数及弧数,建立G无向图 Dtype x,y;printf("请输入点数和弧数\n"); cin>>G.dian>>G.hu;getchar();printf("请输入%d个点\n",G.dian);for(int i=1;i<=G.dian;i++)cin>>G.d[i];memset(G.map,0,sizeof(G.map));printf("请输入%d条弧\n",G.hu);getchar();for(int k=0;k<G.hu;k++){int i,j;cin>>x>>y;//printf("x=%c y=%c ",x,y);getchar();i=locate(G,x);j=locate(G,y);G.map[i][j]=G.map[j][i]=1;}}//---------------------栈-----------------//初始化 void InitStack(Stack &S){S.base=(int *)malloc(MAX*sizeof(int));if(!S.base)return ;S.top=0;S.size=MAX;}//判空操作,返回 1 表示栈为空 int Isempty(Stack S){if(S.top==0)return 1;return 0;}//入栈操作void Push(Stack &S,int e){if(S.top>=S.size){printf("该栈已满\n");return ;}S.base[S.top++]=e;}//出栈操作void Pop(Stack &S,int &e){if (Isempty(S)) return; //栈为空 e = S.base[--S.top];}//Gettop 取栈顶元素int Gettop(Stack S,int &e){ //若栈不空则用e返回S的栈顶元素 if (S.top == 0) return 0; //栈为空 e = S.base[S.top-1]; return e;}//----------------队列---------------- void InitSq(Sq &QQ){QQ.base=(int*)malloc(MAX * sizeof(int));//S.base=(BiTree*)malloc(MAX*sizeof(BiTree)); if(!QQ.base)return ;QQ.front=QQ.rear=QQ.tag=0;}int Getlen(Sq QQ){if(!QQ.tag)//分情况讨论tag为 0,长度肯定为 0; return 0;else{if(QQ.rear==QQ.front)return MAX;return (QQ.rear-QQ.front+MAX)%MAX;}}int Isempty(Sq QQ){if(QQ.front==QQ.rear && QQ.tag==0)return 1;return 0;}void InSq(Sq &QQ,int e){if (QQ.front == QQ.rear && QQ.tag==1)//tag与队头队尾必须同时满足 {printf("%d\n",QQ.tag);printf("队列已满\n");return ;}QQ.tag=1; QQ.base[QQ.rear] = e; QQ.rear =(QQ.rear+1)%MAX;}void OutSq(Sq &QQ,int &e){if(QQ.front == QQ.rear && QQ.tag==0){printf("队列已空\n");return;}e=QQ.base[QQ.front];QQ.front=(QQ.front+1)%MAX;if(QQ.front == QQ.rear)QQ.tag=0;}void GetHead(Sq QQ,int &e){ if(QQ.front == QQ.rear && QQ.tag==0) return; e = QQ.base[QQ.front];}
0 0
- 利用邻接矩阵存储无向图,并实现BFS(非递归) DFS(递归+非递归)两种遍历
- 用邻接表存储有向图并实现DFS(递归+非递归)BFS(非递归)两种遍历
- 图的邻接表的遍历(DFS(递归,非递归),BFS,拓扑排序)
- 数据结构基础 图的遍历(三) 之 BFS+DFS(非递归实现)
- 无向图的邻接矩阵,深度优先遍历和广度优先遍历的递归与非递归算法
- 无向图的邻接矩阵,深度优先遍历广度优先遍历的递归与非递归算法
- DFS非递归实现图的遍历
- 用邻接矩阵存储的有向图的非递归遍历
- 邻接矩阵遍历(无向图,邻接矩阵,DFS,BFS)
- 图的深度优先遍历(递归、非递归;邻接表,邻接矩阵)
- 数据结构_图的邻接矩阵存储递归及非递归
- 图的dfs递归(非递归)遍历和bfs遍历(邻接表)
- DFS(深度优先搜索树) 递归非递归实现
- 有向图的邻接表存储,递归和非递归的深度、广度遍历(codeblocks+gcc)
- 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS
- 二叉树的遍历(递归实现+非递归实现)
- 邻接矩阵的深度优先遍历(递归以及非递归),广度优先遍历
- 二叉树遍历(递归,非递归)
- Map -2 取出所有的元素key和value 使用Keyset 和enrtySet方法 (map没有迭代器)
- Android推流帧率的设定与实际情况的影响
- {题解}[jzoj4778]【NOIP2016提高A组模拟9.14】数列编辑器
- App开发思路
- JavaScript promise 链,并行promise
- 利用邻接矩阵存储无向图,并实现BFS(非递归) DFS(递归+非递归)两种遍历
- Android ADB调试基本知识汇总
- JS版设计模式
- 微信小程序开发之拖拽 image 触摸事件监听
- 轻轻敲开nodeJs的大门--第一个nodeJs入门小程序
- Maven常用命令
- loadRunner11.0安装与使用
- KEIL下mdk提示停止工作的问题
- 【OpenCV自学笔记】Day2 摄像头的打开和测试