【原理】
【数据源】
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;
}