数据结构之深度优先搜索
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; }
相关文章推荐
- 【数据结构_图_DFS_1068】深度优先搜索
- 数据结构4-深度优先搜索和广度优先搜索
- 【数据结构】图的遍历--深度优先搜索
- 数据结构之 图论---基于邻接矩阵的广度优先搜索遍历(输出bfs遍历序列)
- 树的存储结构和图的存储结构以及图的深度优先DFS搜索和BFS广度优先搜索
- SDUT 2142 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构之 栈与队列--- 走迷宫(深度搜索dfs)
- 数据结构实践——迷宫问题之图深度优先遍历解法
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- 数据结构图的运算(深度优先)
- 数据结构——图的遍历——邻接矩阵 深度优先遍历《递归》和《非递归》
- 【数据结构】图的广度优先搜索
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- 数据结构之深度优先,广度优先遍历
- 数据结构上机实验--有向图邻接表的建立,深度广度搜索及拓扑排序
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历