您的位置:首页 > 理论基础 > 数据结构算法

数据结构之深度优先搜索

2014-12-06 19:19 555 查看


#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

typedef char VertexType[4];//顶点最多3个字符
typedef int VRType;
#define MaxSize	50
//边结点的类型定义
typedef struct ArcNode
{
int adjvex;//弧指向顶点的位置
struct  ArcNode *nextarc;//指向下一个相连接的顶点

}ArcNode;
//头结点的类型定义
typedef struct VNode
{
VertexType data;//存储顶点信息
ArcNode*firstarc;//用于指向第一个与该结点相连接的顶点

}Vnode, AdjList[MaxSize];
//图的类型定义
typedef struct
{
AdjList vextex;//顶点的信息
int vexnum, arcnum;//表示图的顶点和边的数目,
}AdjGraph;
void DisplayGraph(AdjGraph G);
void CreateGraph(AdjGraph*G);
int LocateVertex(AdjGraph G, VertexType v);
void Visit(VertexType v);
int DFSTraverse(AdjGraph G, int v);
int main()
{

AdjGraph G;
printf("采用邻接表创建无向图:\n");
CreateGraph(&G);
/*printf("输出图:\n");
DisplayGraph(G);*/
printf("图的深度优先遍历:\n");
DFSTraverse(G, 0);

system("pause");
return 0;
}
void CreateGraph(AdjGraph*G)//采用邻接表存储结构创建无向图
{

int i, j, k;
VertexType v1, v2;//定义2个顶点
ArcNode*p;
printf("请输入图的顶点数,边数(空格分隔):");
scanf("%d%d", &(G->vexnum), &(G->arcnum));
printf("请输入%d个顶点的值\n", G->vexnum);
for (i = 0; i < G->vexnum; i++)//将顶点存储在头结点中
{
scanf("%s", G->vextex[i].data);
G->vextex[i].firstarc = NULL;//将相关联的顶点值设为空
}
printf("请输入弧尾和弧头用空格来间隔:\n");
for (k = 0; k < G->arcnum; k++)//建立边链表
{
scanf("%s%s", v1, v2);
i = LocateVertex(*G, v1);
j = LocateVertex(*G, v2);
//以j为弧头,i为弧尾创建邻接表
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->nextarc = G->vextex[i].firstarc;
G->vextex[i].firstarc = p;
//以i为弧头,j为弧尾创建邻接表
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = i;
p->nextarc = G->vextex[j].firstarc;
G->vextex[j].firstarc = p;

}
}
int LocateVertex(AdjGraph G, VertexType v)//定位图中顶点的位置
{
int i;
for (i = 0; i < G.vexnum; i++)
if (strcmp(G.vextex[i].data, v) == 0)
return i;

return -1;

}
void DisplayGraph(AdjGraph G)//输出图的邻接表
{

int i, j;
ArcNode *p;
printf("%d个顶点:\n	", G.vexnum);
for (i = 0; i < G.vexnum; i++)
printf("%s ", G.vextex[i].data);
printf("\n");
printf("邻接表:\n");
for (i = 0; i < G.vexnum; i++)
{
p = G.vextex[i].firstarc;
j = 0;
while (p != NULL)
{
if (j == 0)
printf("%s->%s", G.vextex[i].data, G.vextex[p->adjvex].data);
else
printf("->%s ", G.vextex[p->adjvex].data);
j++;
p = p->nextarc;

}
printf("\n");
}

}
void Visit(VertexType v)
{
printf("%s", v);
}
int DFSTraverse(AdjGraph G, int v)//图的非递归深度优先遍历,v代表顶点编号
{
int i, visited[MaxSize], top;
ArcNode *stack[MaxSize], *p;
for (i = 0; i < G.vexnum; i++)//将所有顶点都添加未访问标志0
{
visited[i] = 0;

}
Visit(G.vextex[v].data);//最开始访问顶点v并将访问标志置为1
visited[v] = 1;
top =- 1;//初始化栈
p = G.vextex[v].firstarc;//是指向顶点v的第一个邻接点
while (top>-1||p!=NULL)
{
while (p != NULL)

if (visited[p->adjvex] == 1)//如果p指向的顶点已经访问过,则pp
{
p = p->nextarc;
}
else
{
Visit(G.vextex[p->adjvex].data);//访问p指向的顶点
visited[p->adjvex] = 1;
stack[++top] = p;//加入堆栈,保存p指向的顶点
p = G.vextex[p->adjvex].firstarc;//p指向当前顶点的第一个邻接点
}
if (top > -1)
{
p = stack[top--];//如果当前顶点已经被访问则出栈
p = p->nextarc;//p指向下一个邻接点
}

}

return 0;

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: