深度优先遍历与广度优先遍历

代码一修改就乱了，CSDN这方面还有等提高啊~~~~~~~
//zhangjun03402@163.com
#include <iostream>
#include <cstdlib>

#define MAX_NUM 4

using std::cout;
using std::cin;
using std::endl;

typedef struct ArcNode{
struct ArcNode *next;
}ArcNode;

typedef struct VexNode{
int data;
ArcNode * FirstArc;
}VexNode;

int visited[MAX_NUM];

typedef struct QNode{
int data;
struct QNode *next;
}QNode, *QueuePtr;

typedef struct{
QueuePtr front;
QueuePtr rear;

q->front=q->rear=(QueuePtr)malloc(sizeof(struct QNode));
if(!q->front)
exit(0);
q->front->next=NULL;
}

return q->front==q->rear;
}

QueuePtr node = (QueuePtr)malloc(sizeof(QNode));
if( !node )
exit(0);
node->data = e;
node->next=NULL;
q->rear->next=node;
q->rear = node;
}

QueuePtr node;
if(empty(q))
return;
node = q->front->next;
e = node->data;
q->front->next=node->next;
if( !node->next )   //这个地方要注意，队列空时，尾指针要指向“头结点”
q->rear = q->front;
free(node);
}

void CreatGraph(VexNode G[], int n)
{
int i, e;
ArcNode *p, *q = NULL;
cout<<"Input "<<MAX_NUM<<" vertexs' value:"<<endl;
for(i=0; i<n; i++){
cin>>G[i].data; //用scanf("%d",G[i])居然也可以
G[i].FirstArc = NULL;
}
for(i=0; i<n; i++){
cout<<"Creat the edges for the NO."<<i<<" vertex, input its adjvex..."<<endl;
cin>>e;
while(e != 1111){ //为什么以-1为结束判断标志不行...
p=(ArcNode *)malloc(sizeof(struct ArcNode));
p->next = NULL;
if(G[i].FirstArc == NULL)
G[i].FirstArc = p;
else
q->next = p;
q = p;
cin>>e;
}
}
}

if(G[v].FirstArc != NULL)
return -1;
}

ArcNode *p;
p = G[v].FirstArc;
while( p!= NULL ){
else
p = p->next;
}
return -1;
}

void DFS(VexNode G[], int v){
int w;

visited[v]=1;
cout<<G[v].data<<"->";

{
if( visited[w]==0 )
DFS(G, w);
}
}

void Travel_DFS(VexNode G[], int n)
{
for(int i=0;i<n;i++){
visited[i] = 0;
}
for(int i=0; i<n; i++)
if(visited[i] == 0)
DFS(G,i);
}

void BFS(VexNode G[], int v)
{
int flag, w;

InitQueue(q);
cout<<G[v].data<<"->";
visited[v]=1;
enqueue(q, v);

while(!empty(q)){
dequeue(q, v);
while(w != -1){
if(visited[w]==0){
cout<<G[w].data<<"->";
enqueue(q,w);
visited[w]=1;
}
}
}
}

void Travel_BFS(VexNode G[], int n)
{
for(int i=0;i<n;i++){
visited[i] = 0;
}
for(int i=0; i<n; i++)
if(visited[i] == 0)
BFS(G,i);
}

int main(){
VexNode G[MAX_NUM];
CreatGraph(G, MAX_NUM);
cout<<"DFS:"<<endl;
//DFS(G, 0);
Travel_DFS(G,MAX_NUM);  //深度优先遍历
cout<<"NULL"<<endl;

cout<<"BFS:"<<endl;
//BFS(G, 0);  //此时调用，之前深度遍历时已将visited[]全变为1
Travel_BFS(G,MAX_NUM);  //广度优先遍历

cout<<"NULL"<<endl;

system("PAUSE");
return 0;
}


• 本文已收录于以下专栏：

DFS（深度优先遍历）和 BFS（广度优先遍历）

//用邻接矩阵表示的图的深度优先搜索和广度优先搜索 //以无向图为基础 //DFS(深度优先搜索),采用的方法是递归 //BFS(广度优先搜索),采用的是队列的方案 #include #includ...

图论----深度优先遍历和广度优先遍历

1、广度优先遍历 原理：         广度优先遍历从某个顶点v出发，首先访问这个结点，并将其标记为已访问过；         然后顺序访问结点v的所有...

举报原因： 您举报文章：深度学习：神经网络中的前向传播和反向传播算法推导 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)