数据结构 图邻接矩阵的深度优先遍历 C语言

 一、图的结构体定义

1、顶点数量

2、边的数量

3、邻接矩阵(数组表示)

4、顶点数组

5、图的类型(有向图或无向图)

typedef struct GNode
{
    int nv;
    int ne;
    char v[MAX_VNUM];
    int G[MAX_VNUM][MAX_VNUM];
    int GraphType;
}

二、判断是无向图还是有向图

       输入0或者1,在主体函数判别即可。

三、图的创建

1、分别初始化顶点数量、边的数量-----输入

2、顶点集合,定义,输入每个顶点名称

3、邻接矩阵——先初始化为全为0,即没有边与任何顶点相连

4、输入邻接矩阵具体数据,有多少条边则输入几次:分别输入边的两个顶点和权重(这里不是带权邻接矩阵,输入边数,即1)

        无向图:对应G[v1][v2]=G[v2][v1]=1;

        有向图:对应G[V1][V2]=1;

void GreatGraph(GNode *G)
{
    printf("请输入顶点数和边数:");
    scanf("%d%d",&G->nv,&G->ne);//顶点数量、边的数量

    int i,j,w;

    for(i=0;i<G->nv;i++)//顶点集合
    {
        printf("第%d个顶点为:",i);
        scanf("%c",&G->v[i]);
        getchar();
    }

    for(i=0;i<G->nv;i++)
        for(j=0;j<G->nv;j++)
            G->G[i][j]==0;//初始化矩阵每一项为0

    int v1,v2,w1;
    for(w=0;w<G->ne;w++)//for循环,输入数据
    {
        printf("请输入两顶点及边数");
        scanf("%d%d%d",v1,v2,w1);
        if(G->GraphType==0)
        {  
            G->G[v1][v2]=w1;  
            G->G[v2][v1]=w1;
        }
        else
        {
             G->G[v1][v2]=w1;
        }
    }
    
}

四、邻接矩阵的输出

void out(GNode G)
{
	
	int i,j;
	for(i=0;i<G.nv;i++)
	{
		for(j=0;j<G.nv;j++)
		{
			printf("%d	",G.G[i][j]);
			if((j+1)%(G.nv)==0)
				printf("\n");
 		}
	}
}

五、深度优先遍历

1、定义一个visit数组,没有遍历的为0,已经遍历的为1,以确保遍历不重复,定义在开头

int visit[MAX_VNUM];

2、设置所有顶点为0

3、从第0个开始,到第“边数最大数”,横向依次“遍历”邻接矩阵,如下:

              0:  ——————————————————————————>

              1:  ——————————————————————————>

              3:  ——————————————————————————>

              ......

如果矩阵数据为1,下一个输出的就是这个列数:1说明这两个顶点相连,这个顶点就是深度的下一个所指;

        此时,这个顶点所在的行,再次横向遍历,递归循环

此板块分成两个部分:

第一个部分为初始化为0,然后从第0个顶点开始看,如果为0则进行深度遍历,再第二个、第三个......

第二个部分就是深度遍历的主要板块:先把已经遍历了的改为1,输出这个顶点,再看这个顶点与哪一个顶点相连而且之前没有遍历过,递归循环。

void DFS(GNode G,int v)
{
    visit[v]=1;
    printf("%c->",G.v[v];
    for(int j=0;j<G.nv;j++)
    {
        if(!visit[j]&&G.G[v][j]==1)
        DFS(G,j);
    }
}



void TDFS(GNode G)
{
    for(int i=0;i<G.nv;i++)
    {
        visit[i]=0;
    }
    for(int v=0;v<G.nv;v++)
    {
        if(visit[v]=0)
            GFS(G,v);
    }
}

        

源代码完整版:

#define MAX_VNUM 100
#include<stdio.h> 
#include<stdlib.h> 

int visit[MAX_VNUM];

typedef struct GNode
{
	char v[MAX_VNUM];
	int nv;//顶点数 
	int ne;//边数
	int G[MAX_VNUM][MAX_VNUM] ;
	int GraphType;
}GNode;

void GreatGraph(GNode *G)
{
	printf("请输入顶点数和边数:");
	scanf("%d",&G->nv);
	scanf("%d",&G->ne);//注意%d后面不要加\n,会出bug(>^ < )
	fflush(stdin);
	for(int i=0;i<G->nv;i++)
	{
		printf("请输入第%d个顶点:",i);
		scanf("%c",&G->v[i]);
		getchar();
	}
	for(int v=0;v<G->nv;v++)
		for(int w=0;w<G->nv;w++)
			G->G[v][w]=0;
		
	
	int v1,v2,w1;
	for(int i=0;i<G->ne;i++)
	{
		if(G->GraphType==1)//有向图 
		{
			printf("请输入V1和V2和边数:"); 
			scanf("%d%d%d",&v1,&v2,&w1);
			G->G[v1][v2]=w1;
		}
		else
		{
			printf("请输入V1和V2和边数:"); 
			scanf("%d%d%d",&v1,&v2,&w1);
			G->G[v1][v2]=w1;
			G->G[v2][v1]=w1;
		}
	}
	
}

//用邻接矩阵实现DFS

void out(GNode G)
{
	
	int i,j;
	for(i=0;i<G.nv;i++)
	{
		for(j=0;j<G.nv;j++)
		{
			printf("%d	",G.G[i][j]);
			if((j+1)%(G.nv)==0)
				printf("\n");
 		}
	}
}

void DFS(GNode G,int i)//深度遍历 
{
	int j;
	visit[i]=1;//遍历了,变为1 
	printf("%c-> ",G.v[i]);
	for(j=0;j<G.nv;j++)
	{
		if(!visit[i]&&G.G[i][i]==1)
		DFS(G,j);//递归调用 
	}
}

void TraverseGraph(GNode G)
{
	int v;
	for(v=0;v<G.nv;v++)
	{
		visit[v]=0;//设置初始值都为0 
	}
	for(v=0;v<G.nv;v++)
	{
		if(!visit[v]) 
		DFS(G,v);
	}
}


int main()
{
	GNode G;
	printf("请输入图的类型,有向为1,无向为0:");
	scanf("%d",&G.GraphType) ;
	GreatGraph(&G);
	printf("所以邻接矩阵为:\n");
	out(G);
	printf("深度遍历结果为:"); 
	TraverseGraph(G); 
	return 0;
}

  • 19
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值