DFS非递归算法

【原理】

【数据源】

T188

【核心代码】

//非递归DFS遍历算法
void NonRecurDFS(AGraph* g, int v0)
{
	int stack[maxSize], top = -1;
	ArcNode* p = NULL;
	int j;

	Initialize(g->n);//初始化访问数组

	//将起始点入栈并访问
	stack[++top] = v0;
	visited[v0] = 1;
	Visit(g, v0);

	while (top != -1)
	{
		j = stack[top];//取栈顶元素。注意不是出栈,因为其邻接顶点还没访问完
		p = g->adjlist[j].firstarc;

		//找到下一个没有访问过的邻接顶点
		while (p != NULL && visited[p->adjvex] != 0)
		{
			p = p->nextarc;
		}

		//如果没有找到,则退栈
		if (p == NULL)
		{
			top--;
		}
		else
		{
			//否则将邻接顶点入栈访问并准备进入下一层
			stack[++top] = p->adjvex;
			visited[p->adjvex] = 1;
			Visit(g, p->adjvex);
		}
	}
}

【验证代码】

#include <stdio.h>
#include <stdlib.h>
#define maxSize 100
#define TRUE 1
#define FALSE 0

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

typedef struct
{
	char data;
	ArcNode* firstarc;
}VNode;

typedef struct
{
	VNode adjlist[maxSize];
	int n, e;//顶点个数和边数
}AGraph;

typedef struct CSNode
{
	char data;
	struct CSNode* child, *sibling;
}CSNode;

void InsertEdge(AGraph* G, int v1, int v2)
{
	ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));
	p->adjvex = v2;
	p->nextarc = G->adjlist[v1].firstarc;
	G->adjlist[v1].firstarc = p;

	/*无向图再加入下面一段代码*/
	p = (ArcNode*)malloc(sizeof(ArcNode));//不可将p置空,因为要再新插入一个结点,必须给这个结点开辟一个空间
	p->adjvex = v1;
	p->nextarc = G->adjlist[v2].firstarc;
	G->adjlist[v2].firstarc = p;

}


void CreateGraph(AGraph* G)
{
	FILE* fp;
	fp = fopen("Graph.dat", "r");
	int nv, ne, i, v1, v2;
	fscanf(fp, "%d%d", &nv, &ne);

	for (i = 0; i < nv; i++)
	{
		G->adjlist[i].firstarc = NULL;
		fscanf(fp, "%c", &G->adjlist[i].data);
	}

	for (i = 0; i < ne; ++i)
	{
		fscanf(fp, "%d%d", &v1, &v2);
		InsertEdge(G, v1, v2);
	}
	G->e = ne;
	G->n = nv;
}

int visited[maxSize];

void Visit(AGraph* g, int i)
{
	printf("%c", g->adjlist[i].data);
}


void Initialize(int N)
{
	int i;
	for (i = 0; i < N; ++i)
	{
		visited[i] = 0;
	}
}

//非递归DFS遍历算法
void NonRecurDFS(AGraph* g, int v0)
{
	int stack[maxSize], top = -1;
	ArcNode* p = NULL;
	int j;

	Initialize(g->n);//初始化访问数组

	//将起始点入栈并访问
	stack[++top] = v0;
	visited[v0] = 1;
	Visit(g, v0);

	while (top != -1)
	{
		j = stack[top];//取栈顶元素。注意不是出栈,因为其邻接顶点还没访问完
		p = g->adjlist[j].firstarc;

		//找到下一个没有访问过的邻接顶点
		while (p != NULL && visited[p->adjvex] != 0)
		{
			p = p->nextarc;
		}

		//如果没有找到,则退栈
		if (p == NULL)
		{
			top--;
		}
		else
		{
			//否则将邻接顶点入栈访问并准备进入下一层
			stack[++top] = p->adjvex;
			visited[p->adjvex] = 1;
			Visit(g, p->adjvex);
		}
	}
}


int main()
{
	AGraph G;
	CreateGraph(&G);
	NonRecurDFS(&G,0);

	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值