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

 我是参照《严蔚敏数据结构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;

}

//BFS
void 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;
}



猜你喜欢

转载自blog.csdn.net/snailyww/article/details/52302564