数据结构--图的遍历(深度优先遍历)
数据结构–图的遍历(深度优先遍历)
深度优先遍历是从图中某个顶点出发,访问此顶点,然后从它未被访问到的邻接点出发深度优先遍历图,直到图中所有和它有路径相通的顶点都被访问到.
邻接矩阵:
#include <stdio.h>
#define MAXVEX 20 //最⼤顶点数
#define FINITY 100 //代表 ∞
typedef char VertexType; //顶点类型
int visit[MAXVEX]; 标志数组
//邻接矩阵存储结构
typedef struct{
VertexType vexs[MAXVEX]; //顶点数组
int arc[MAXVEX][MAXVEX]; //边的权值
int numVertexes,numEdges; //实际顶点数和边数
}MGraph;
//创建邻接矩阵
void Create(MGraph *G){
int i,j;
printf("输⼊顶点数和边数:\n");
scanf("%d%d",&G->numVertexes,&G->numEdges);
//输⼊顶点信息,创建顶点表
printf("输⼊顶点信息:\n");
for(i=0;i<G->numVertexes;i++){
getchar();
scanf("%c",&G->vexs[i]);
}
//输⼊邻接矩阵
printf("输⼊邻接矩阵:\n");
for(i=0;i<G->numVertexes;i++){
for(j=0;j<G->numVertexes;j++){
scanf("%d",&G->arc[i][j]);
if(G->arc[i][j]==0)
G->arc[i][j]=FINITY;
}
}
//输出邻接矩阵
printf("邻接矩阵为:\n");
for(i=0;i<G->numVertexes;i++){
for(j=0;j<G->numVertexes;j++)
printf("%3d ",G->arc[i][j]);
printf("\n");
}
}
//邻接矩阵的深度遍历操作
韶华怎么读
void DFSTraver(MGraph G){
int i;
for(i=0;i<G.numVertexes;i++)
visit[i]=0;
for(i=0;i<G.numVertexes;i++)
运⾏结果: 邻接表:
wifi display
for (i=0;i<G.numVertexes;i++)
if (visit[i]==0)
DFS(G,i);
barked
}
//邻接矩阵的深度优先递归算法
void DFS(MGraph G,int i){
int j;
visit[i]=1;
printf("%c ",G.vexs[i]);
for (j=0;j<G.numVertexes;j++)
if (G.arc[i][j]!=FINITY&&visit[j]==0)
DFS(G,j);
}
int main(){
MGraph G;
Create(&G);
DFSTraver(G);}
#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 20
typedef char VertexType;
int visit[MAXVEX];
//边表结点
typedef struct EdgeNode{
int adjvex;
struct EdgeNode *next;
}EdgeNode;
//顶点表结点
typedef struct VertexNode{
VertexType data;
EdgeNode *firstedge;
dean
EdgeNode *firstedge;
广州成人高考学校}VertexNode,AdjList[MAXVEX];
typedef struct{
AdjList adjlist;
int numVertexes,numEdges;
}GraphAdjList;
//创建邻接表
void Create(GraphAdjList *G){
int i,j,k;
EdgeNode *p;
printf("输⼊顶点数和边数:\n");
scanf("%d%d",&G->numVertexes,&G->numEdges);
/
/输⼊顶点信息
printf("输⼊顶点信息:\n");
for(i=0;i<G->numVertexes;i++){
getchar();
scanf("%c",&G->adjlist[i].data);
G->adjlist[i].firstedge=NULL; //将指向边表的指针初始化 }
//建⽴边表
printf("输⼊边(Vi,Vj)中的下标i,j:\n");
for(k=0;k<G->numEdges;k++){
scanf("%d%d",&i,&j);
p=(EdgeNode *)malloc(sizeof(EdgeNode));
2017年4月29日
p->adjvex=j; //存储弧头
p->next=G->adjlist[i].firstedge; //头插法插⼊边结点
G->adjlist[i].firstedge=p;
//下⾯代码有向图⽆,⽆向图有
among的用法
p=(EdgeNode *)malloc(sizeof(EdgeNode));
p->adjvex=i; //存储弧头
p->next=G->adjlist[j].firstedge; //头插法插⼊边结点
G->adjlist[j].firstedge=p;
}
//打印邻接表
printf("邻接表为:\n");
for(i=0;i<G->numVertexes;i++){
p=G->adjlist[i].firstedge;
while(p){
natural是什么意思
printf("(%c,%c)",G->adjlist[i].data,G->adjlist[p->adjvex].data); p=p->next;
}
printf("\n");
}
}
//邻接表深度遍历操作
void DFSTraver(GraphAdjList G){
int i;
for(i=0;i<G.numVertexes;i++)
visit[i]=0;
for(i=0;i<G.numVertexes;i++)
if(visit[i]==0)
DFS(G,i);
}
//邻接表深度优先递归算法
void DFS(GraphAdjList G,int i){
winter is coming
EdgeNode *p;
EdgeNode *p;
visit[i]=1;
printf("%c ",G.adjlist[i].data);
p=G.adjlist[i].firstedge;
while(p){
if(visit[p->adjvex]==0)
DFS(G,p->adjvex);
p=p->next;
}
}
int main(){
GraphAdjList G;英汉汉英词典
Create(&G);
DFSTraver(G);
}
运⾏结果: