深度优先遍历

图的邻接表的建立和深度优先遍历,递归与非递归

下边代码块是邻接表的建立

typedef enum{DG,UDG}GraphKind;

typedef struct ArcNode
{
	int adjvex; //结点的数值
	struct ArcNode *next;  //指向邻接结点的指针
}ArcNode; 

typedef struct VertexNode
{
	char vexdata; //结点的值
	ArcNode *head;//头指针
}VertexNode;

typedef struct
{
	VertexNode vertex[MAX_VER_NUM];//存放所有结点的数组
	int vexnum,arcnum;//结点数,边数
	GraphKind Type;//图类型
}LGraph;

int index(char vex,LGraph *lg)//索引vex结点对应的位置值
{
	int i;
	for(i=1;i<=lg->vexnum;i++)
	{
		if(lg->vertex[i].vexdata == vex) 
		{
			return i;
		}
	}
	return 0;
}

void Creat_LG(LGraph *lg)
{
	int i,j,v1_index,v2_index,type;
	char v1,v2;
	ArcNode *p1,*p2;
	printf("please input graph type 0.DG 1.UDG. input nums:");
	scanf("%d",&type);//输入图的类型
	if(type == 0)
	{
		lg->Type = DG;
	}
	else if(type == 1)
	{
		lg->Type = UDG;
	}
	else
	{
		printf("please input 0 or 1!!!");
		return;
	}
	printf("Please input vexnum:");
	scanf("%d",&lg->vexnum);//输入结点数
	printf("Please input arcnum:");
	scanf("%d",&lg->arcnum);//输入边数
	getchar();
	for (i=1;i<=lg->vexnum;i++)
	{
		lg->vertex[i].head = NULL;
		printf("Please input %d vex:",i);
		scanf("%c",&lg->vertex[i].vexdata);	//遍历存放所有结点
		getchar();
	}
	for (j=1;j<=lg->arcnum;j++)
	{
		printf("Please input %d arc(vex1 vex2):",j);
		scanf("%c %c",&v1,&v2);
		getchar();
		v1_index = index(v1,lg);//索引结点对应的位置值
		v2_index = index(v2,lg);
		if (lg->Type == 1)
		{
			p1 = (ArcNode *)malloc(sizeof(ArcNode));//不会解释了能力有限
			p1->adjvex = v2_index;                  //自己看吧
			p1->next = lg->vertex[v1_index].head;
			lg->vertex[v1_index].head = p1;

			p2 = (ArcNode *)malloc(sizeof(ArcNode));
			p2->adjvex = v1_index;
			p2->next = lg->vertex[v2_index].head;
			lg->vertex[v2_index].head = p2;
		}
		else
		{
			p1 = (ArcNode *)malloc(sizeof(ArcNode));
			p1->adjvex = v2_index;
			p1->next = lg->vertex[v1_index].head;
			lg->vertex[v1_index].head = p1;
		}

	}
}

void Print_LG(LGraph *lg)
{
	int i;
	ArcNode *p;
	if(lg->Type == 0)
		printf("Is Direct Graph\n");
	else
		printf("Is UNDirect Graph\n");
	for(i=1;i<=lg->vexnum;i++)
	{
		printf("%c",lg->vertex[i].vexdata);
		p=lg->vertex[i].head;
		while(p)
		{
			printf("->%c",lg->vertex[p->adjvex].vexdata);
			p = p->next;
		}
		printf("\n");
	}
}

深度优先遍历递归


int visit1[MAX_VER_NUM];//建立全局变量的数组,判断是否访问过

void visit(LGraph *lg,int v)//输出对应值的结点
{
    printf("%c",lg->vertex[v].vexdata);
}

void DFS1(LGraph *lg,int v0)//遍历v0看开始的连通子图
{
	ArcNode *p;
	visit1[v0] = 1;
	visit(lg,v0);
	p = lg->vertex[v0].head;
	while(p)
	{
		if(!visit1[p->adjvex])
			DFS1(lg,p->adjvex);
		p = p->next;
	}
}

void DFS1Traverse(LGraph *lg)//遍历整个图
{
	int v;
	for(v=1;v<=lg->vexnum;v++)
		visit1[v]=0;
	for(v=1;v<=lg->vexnum;v++)
	{
		if(!visit1[v])
			DFS1(lg,v);
	}
}

图的深度优先遍历非递归

用的是数组栈比较低级但是代码更简单
void DFS2(LGraph *lg,int v0)
{
	int stack[MAX_VER_NUM];
	ArcNode *p;
	int visit[MAX_VER_NUM]={0},top=-1,v;
	p = lg->vertex[v0].head;
	stack[++top]=v0;
	while(top!=-1)
	{
		v = stack[top--];
		if(!visit[v])
		{
			printf("%c",lg->vertex[v].vexdata);
			visit[v] = 1;
		}
		p = lg->vertex[v].head;
		while(p)
		{
			if(!visit[p->adjvex])
			{
				stack[++top] = p->adjvex;
			}
			p = p->next;
		}	
	}
}

完整代码

#include<stdio.h>
#include<stdlib.h>
#define MAX_VER_NUM 20
typedef enum{DG,UDG}GraphKind;

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

typedef struct VertexNode
{
	char vexdata;
	ArcNode *head;
}VertexNode;

typedef struct
{
	VertexNode vertex[MAX_VER_NUM];
	int vexnum,arcnum;
	GraphKind Type;
}LGraph;

int index(char vex,LGraph *lg)
{
	int i;
	for(i=1;i<=lg->vexnum;i++)
	{
		if(lg->vertex[i].vexdata == vex)
		{
			return i;
		}
	}
	return 0;
}

void Creat_LG(LGraph *lg)
{
	int i,j,v1_index,v2_index,type;
	char v1,v2;
	ArcNode *p1,*p2;
	printf("please input graph type 0.DG 1.UDG. input nums:");
	scanf("%d",&type);
	if(type == 0)
	{
		lg->Type = DG;
	}
	else if(type == 1)
	{
		lg->Type = UDG;
	}
	else
	{
		printf("please input 0 or 1!!!");
		return;
	}
	printf("Please input vexnum:");
	scanf("%d",&lg->vexnum);
	printf("Please input arcnum:");
	scanf("%d",&lg->arcnum);
	getchar();
	for (i=1;i<=lg->vexnum;i++)
	{
		lg->vertex[i].head = NULL;
		printf("Please input %d vex:",i);
		scanf("%c",&lg->vertex[i].vexdata);	
		getchar();
	}
	for (j=1;j<=lg->arcnum;j++)
	{
		printf("Please input %d arc(vex1 vex2):",j);
		scanf("%c %c",&v1,&v2);
		getchar();
		v1_index = index(v1,lg);
		v2_index = index(v2,lg);
		if (lg->Type == 1)
		{
			p1 = (ArcNode *)malloc(sizeof(ArcNode));
			p1->adjvex = v2_index;
			p1->next = lg->vertex[v1_index].head;
			lg->vertex[v1_index].head = p1;

			p2 = (ArcNode *)malloc(sizeof(ArcNode));
			p2->adjvex = v1_index;
			p2->next = lg->vertex[v2_index].head;
			lg->vertex[v2_index].head = p2;
		}
		else
		{
			p1 = (ArcNode *)malloc(sizeof(ArcNode));
			p1->adjvex = v2_index;
			p1->next = lg->vertex[v1_index].head;
			lg->vertex[v1_index].head = p1;
		}

	}
}

void Print_LG(LGraph *lg)
{
	int i;
	ArcNode *p;
	if(lg->Type == 0)
		printf("Is Direct Graph\n");
	else
		printf("Is UNDirect Graph\n");
	for(i=1;i<=lg->vexnum;i++)
	{
		printf("%c",lg->vertex[i].vexdata);
		p=lg->vertex[i].head;
		while(p)
		{
			printf("->%c",lg->vertex[p->adjvex].vexdata);
			p = p->next;
		}
		printf("\n");
	}
}

int visit1[MAX_VER_NUM];

void visit(LGraph *lg,int v)
{
    printf("%c",lg->vertex[v].vexdata);
}

void DFS1(LGraph *lg,int v0)
{
	ArcNode *p;
	visit1[v0] = 1;
	visit(lg,v0);
	p = lg->vertex[v0].head;
	while(p)
	{
		if(!visit1[p->adjvex])
			DFS1(lg,p->adjvex);
		p = p->next;
	}
}

void DFS1Traverse(LGraph *lg)
{
	int v;
	for(v=1;v<=lg->vexnum;v++)
		visit1[v]=0;
	for(v=1;v<=lg->vexnum;v++)
	{
		if(!visit1[v])
			DFS1(lg,v);
	}
}

void DFS2(LGraph *lg,int v0)
{
	int stack[MAX_VER_NUM];
	ArcNode *p;
	int visit[MAX_VER_NUM]={0},top=-1,v;
	p = lg->vertex[v0].head;
	stack[++top]=v0;
	while(top!=-1)
	{
		v = stack[top--];
		if(!visit[v])
		{
			printf("%c",lg->vertex[v].vexdata);
			visit[v] = 1;
		}
		p = lg->vertex[v].head;
		while(p)
		{
			if(!visit[p->adjvex])
			{
				stack[++top] = p->adjvex;
			}
			p = p->next;
		}	
	}
}
void main()
{
	LGraph LG;
	Creat_LG(&LG);
	Print_LG(&LG);
	printf("DFS1:");
	DFS1Traverse(&LG);
    printf("\n");
	printf("DFS2:");
	DFS2(&LG,1);
	printf("\n");
	return;
}

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值