图的创建,深度优先遍历,广度优先遍历。
2016-06-01 00:00
651 查看
摘要: 常用的储存结构有,邻接表,邻接多重表,十字链表。
图的储存结构:
由于广度优先需要用到队列关于队列部分:队列的链式储存以及循环队列
图的常用函数:
测试函数:
结果截图:
参考书:数据结构
#include #include #include #define INFINITY INT_MAX //最大值 #define MAX_VERTEX_NUM 20 //最大顶点数 #define MAX 5 typedef int VRType; typedef int InfoType; typedef int VertexType; typedef int GraphKind; typedef int Status; typedef int QElemType;
图的储存结构:
typedef struct ArcCell{ VRType adj;//定点关系类型。对无权图用1或0 //表示相邻否,对带权图则为权值类型。 InfoType *info;//该弧相关信息的指针 } ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct{ VertexType vexs[MAX_VERTEX_NUM];//顶点向量 AdjMatrix arcs; //邻接矩阵 int vexnum,arcnum; //图的当前顶点数和弧数 GraphKind kind; //图的种类标志 }MGraph;
由于广度优先需要用到队列关于队列部分:队列的链式储存以及循环队列
图的常用函数:
Status CreateGraph(MGraph *G){ int IncInfo; //采用数组邻接矩阵法,构造无向网G。 printf("请输入顶点数,弧数,和其他信息"); scanf("%d,%d,%d",&G->vexnum,&G->arcnum,&IncInfo);//incinfo为0则各弧不含其它信息 int i;int j;int k; for(i=0;ivexnum;++i) { printf("请输入顶点向量"); scanf("%d",&G->vexs[i]);//构造顶点向量 } for(i=0;ivexnum;++i) // 初始化邻接矩阵 { for(j=0;jvexnum;++j) { G->arcs[i][j].adj=INFINITY; } } int LocateVex(int v)//输出v所在的位置 { int z; for(z=0;zvexnum;++z) { if(G->vexs[z]==v){return z;} } } for(k=0;karcnum;++k)//构造邻接矩阵 { int v1,v2,w; printf("\n输入第%d条边依附的顶点和权值\n",k+1); scanf("%d,%d,%d",&v1,&v2,&w);//输入一条边依附的顶点和权值 int i=LocateVex(v1);int j=LocateVex(v2); G->arcs[i][j].adj=w; //此处出现数组越界异常 /已解决异常 if(IncInfo){printf("请输入其它信息");} G->arcs[j][i]=G->arcs[i][j]; } return 1; } //为了简化使用全局变量,不使用指针 int visited[MAX]; Status VisitFunc(int v) { printf("%d\t",v); } Status FirstAdjVex(MGraph g, int i) //用来找出第一个节点 { int k; if(i>=1 && i<=g.vexnum) for(k=1; k<=g.vexnum; k++) if(g.arcs[i][k].adj!=INFINITY) return k; return -1; } Status NextAdjVex(MGraph g, int i, int j) //用来找出下一个节点 { int k; if(i>=1 && i<=g.vexnum && j>=1 && j<=g.vexnum) for(k=j+1; k<=g.vexnum; k++) if(g.arcs[i][k].adj!=INFINITY) return k; return -1; } void DFS_(MGraph G,int v) {//从第v个顶点出发递归的深度优先遍历图G。 int w; visited[v]=1; VisitFunc(v);//访问第v个顶点 for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)) if(!visited[w])DFS_(G,w); } void DFSTraverse(MGraph G) { int v; for(v=0;v=0;w=NextAdjVex(G,u,w)) if(!visited[w]){ //w为v尚未访问的临界点 visited[w]=1; VisitFunc(w); EnQueue(&Q,w); } } } }
测试函数:
main() { MGraph G; CreateGraph(&G); printf("\n深度优先遍历图G:"); DFSTraverse(G); printf("\n"); printf("\n广度优先遍历图G:"); BFSTraverse(G); printf("\n"); }
结果截图:
参考书:数据结构
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- 渗透技术一瞥(图)
- 图片引发的溢出危机(图)
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构