dfs
2016-02-21 15:35
471 查看
#include <stdio.h> #include<stdlib.h> #define MAXV 100 typedef char InfoType; typedef char Vertex; typedef struct ANode { int adjvex;//该边终点编号 struct ANode * nextarc;//指向下一条边的指针 InfoType info;//该边的相关信息 }ArcNode;//边节点类型 typedef struct Vnode { Vertex data;//顶点信息 ArcNode * firstarc;//指向第一条边 }VNode;//邻接 表头节点类型 typedef VNode AdjList[MAXV]; //邻接表类型 typedef struct { AdjList adjlist;//邻接表 int n,e;//图中顶点数 n和 边数 e }ALGraph;//完整的图邻接表类型 int visited[MAXV]={0};//标志数组 ALGraph *createGraph(int n)//建立邻接表 { ALGraph *G=(ALGraph *)malloc(sizeof(ALGraph)); int i,j; for(i=0;i<n;i++) G->adjlist[i].firstarc=NULL; for(i=0;i<n;i++) { int m; printf("输入表头%d的边节点个数:",i); scanf("%d",&m); printf("输入表头%d的此边节点数据:",i); for(j=0;j<m;j++) { ArcNode *p=(ArcNode *)malloc(sizeof(ArcNode)); scanf("%d",&p->adjvex); p->nextarc=G->adjlist[i].firstarc;//采用头插法插入 *p 输入数据时要反过来输 G->adjlist[i].firstarc=p; } } return G; } void DFS(ALGraph *G,int v) { ArcNode *p; visited[v]=1; printf("%d",v); p=G->adjlist[v].firstarc; while(p) { if(!visited[p->adjvex])//若 p->dajvex顶点未访问,递归访问它 DFS(G,p->adjvex); p=p->nextarc;//p指向顶点 v 的下一个邻接点 } } int main(int argc, char *argv[]) { ALGraph*G; int i,j,n; printf("input n:"); scanf("%d",&n); G=createGraph(n); for(i=0;i<n;i++) { printf("从顶点%d开始遍历的优先访问序列:",i); DFS(G,i); for(j=0;j<n;j++) visited[j]=0; printf("\n"); } return 0; }
下面是一个无向图的邻接表表示图
下面是结果:
相关文章推荐
- 不要再坑人啦!NSOperation才是苹果推荐使用的多线程技术!
- HDU 2571 命运
- 125. Valid Palindrome
- 下拉刷新
- 国际化与全球化的区别
- <LeetCode OJ> 235. Lowest Common Ancestor of a Binary Search Tree
- Struts2标签库(四)之非表单标签
- 计算9宫格
- python学习笔记一--字符串
- Java 集合系列18之 Iterator和Enumeration比较
- HEVC Analyser and HM
- Main方法格式讲解
- android中使用RecyclerView
- Struts2 简单数据验证
- MySQL单表查询
- HDU2058
- 运行停止一个线程
- [POJ2318]TOYS (计算几何 行列式(叉乘)+二分)
- Reactor Cooling
- c++ 程序