利用邻接矩阵存储无向图,并实现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