都说现今内存不值钱了,哈,也就不考虑空间复杂度的问题了,弄了俩辅助数组,觉得解这题还是挺容易的,就是不知道有没有BUG。
问题描述:
假设图G采用邻接表存储,编写一个实现连通图G的深度优先遍历(从顶点v出发)的非递归算法。
算法思路:
就是深度优先的思路。同样是一个visited[]数组,标记已访问过的顶点。又用了一个_vertex[]数组,用于存放顶点。
算法实现:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef char InfoType;
typedef char vertex;
typedef struct ANode //定义弧类型
{
int adjvex;
struct ANode *nextarc;
InfoType Info;
}ArcNode;
typedef struct //定义顶点类型
{
vertex data;
ArcNode *fistarc;
}VertexNode;
typedef struct //定义图类型
{
VertexNode adjlist[MAXSIZE]; //邻接表
int n,e;
}ALGraph;
void CreateALGraph(ALGraph *&g,int array[][MAXSIZE],int k) //传递一个邻接矩阵创建图
{
g=(ALGraph *)malloc(sizeof(ALGraph));
for(int i=0;i<k;i++)
g->adjlist[i].fistarc=NULL;
int cnt=0;
ArcNode *p;
for(i=0;i<k;i++)
for(int j=0;j<k;j++)
if(array[i][j]!=0)
{
cnt++;
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=g->adjlist[i].fistarc;
g->adjlist[i].fistarc=p;
}
g->n=k;g->e=cnt;
}
void dfs(ALGraph *g,int v,int visited[],int _vertex[]) //dfs()
{
int _v,i=0; //_v为初始顶点v的邻接点
ArcNode *p;
_vertex[0]=v; //保存顶点的数组
visited[v]=1; //标记顶点是否已访问的数组
p=g->adjlist[v].fistarc; //p为顶点v的第一条边
while(p!=NULL)
{
_v=p->adjvex;
if(visited[_v]==0) //如果该顶点未访问过
{
i++;
_vertex[i]=_v;
visited[_v]=1;
p=g->adjlist[_v].fistarc; //从下一个未访问过的顶点开始深度优先遍历
}
else //否则找下一个相邻顶点
p=p->nextarc;
}
for(int j=0;j<=i;j++) //打印出_vertex数组中的内容,即连通图的所有顶点
printf("%d ",_vertex[j]);
printf("/n");
}
int main() //主函数调用
{
int graph_array[ ][MAXSIZE]={
{0,1,0,1,1},
{1,0,1,1,0},
{0,1,0,1,1},
{1,1,1,0,1},
{1,0,1,1,0}
};
ALGraph *g;
CreateALGraph(g,graph_array,5);
int visited[MAXSIZE]={0};
int _vertex[MAXSIZE]={0};
dfs(g,2,visited,_vertex);
return 0;
}
输出:
2 4 3 1 0