您的位置:首页 > 理论基础 > 数据结构算法

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

2016-08-24 17:33 357 查看
 我是参照《严蔚敏数据结构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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c数据结构
相关文章推荐