您的位置:首页 > 其它

dfs

2016-02-21 15:35 471 查看
#include <stdio.h>
#include<stdlib.h>
#define MAXV 100
typedef  char InfoType;
typedef  char Vertex;
typedef struct ANode
{
int adjvex;//该边终点编号
struct ANode * nextarc;//指向下一条边的指针
InfoType info;//该边的相关信息
}ArcNode;//边节点类型
typedef struct Vnode
{
Vertex data;//顶点信息
ArcNode * firstarc;//指向第一条边
}VNode;//邻接 表头节点类型
typedef VNode AdjList[MAXV];  //邻接表类型
typedef struct
{
AdjList adjlist;//邻接表
int n,e;//图中顶点数  n和 边数  e
}ALGraph;//完整的图邻接表类型

int visited[MAXV]={0};//标志数组

ALGraph *createGraph(int n)//建立邻接表
{
ALGraph *G=(ALGraph *)malloc(sizeof(ALGraph));
int i,j;
for(i=0;i<n;i++)
G->adjlist[i].firstarc=NULL;
for(i=0;i<n;i++)
{
int m;
printf("输入表头%d的边节点个数:",i);
scanf("%d",&m);
printf("输入表头%d的此边节点数据:",i);
for(j=0;j<m;j++)
{
ArcNode *p=(ArcNode *)malloc(sizeof(ArcNode));
scanf("%d",&p->adjvex);
p->nextarc=G->adjlist[i].firstarc;//采用头插法插入 *p 输入数据时要反过来输
G->adjlist[i].firstarc=p;
}
}
return G;
}
void DFS(ALGraph *G,int v)
{
ArcNode *p;
visited[v]=1;
printf("%d",v);
p=G->adjlist[v].firstarc;
while(p)
{
if(!visited[p->adjvex])//若  p->dajvex顶点未访问,递归访问它
DFS(G,p->adjvex);
p=p->nextarc;//p指向顶点 v 的下一个邻接点
}
}
int main(int argc, char *argv[]) {
ALGraph*G;
int i,j,n;
printf("input n:");
scanf("%d",&n);
G=createGraph(n);
for(i=0;i<n;i++)
{
printf("从顶点%d开始遍历的优先访问序列:",i);
DFS(G,i);
for(j=0;j<n;j++)
visited[j]=0;
printf("\n");
}

return 0;
}

下面是一个无向图的邻接表表示图



下面是结果:




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: