图的创建函数错误,在第二个循环输入的时候异常终止
程序代码:
/* 邻接矩阵,带权值,无向图 */ #include<stdio.h> #define Max_Vertex_Num 100 #define Infinity 32767 typedef int AdjType; typedef char VertexData; typedef int OtherInfo; typedef struct ArcNode { AdjType adj; //弧的权值大小 OtherInfo info; }ArcNode; typedef struct { VertexData vexs[Max_Vertex_Num]; ArcNode arcs[Max_Vertex_Num][Max_Vertex_Num]; int vexnum,arcnum; }AdjMatrix; int LocateVex_M(AdjMatrix G,VertexData v) //找出节点在图的数组的那个位置,即节点数组 { int j = 0,k; for(k=0; k<G.vexnum; k++) if(G.vexs[k]==v) { j = k; break; } return j; } void Visit(VertexData v) { printf("%3c",v); } int CreatGraph(AdjMatrix *G) // 图的创建函数 { int i,j,k,weight; VertexData v1,v2; puts("please input the G's vertex and arc nums"); scanf("%d%d",&G->vexnum,&G->arcnum); // 图的节点数 for(i=0; i<G->vexnum; i++) for(j=0; j<G->arcnum; j++) // 图的弧数 G->arcs[i][j].adj = Infinity; puts("Please input the vertex's content"); for(i=0; i<G->vexnum; i++) //节点内容 scanf("%c",&G->vexs[i]); puts("input the two vertex and their weights\n"); for(k=1; k<G->arcnum; k++) { scanf("%c%c%d",&v1,&v2,&weight); //定为节点的下标,然后赋权值 i = LocateVex_M(*G,v1); j = LocateVex_M(*G,v2); G->arcs[i][j].adj = weight; } return 1; } int visited[Max_Vertex_Num]; //访问标志数组 int FirstAdjVertex(AdjMatrix G,int pos) { int j; for(j = 0; j<G.vexnum; j++) // 查看这个节点的出度情况,以找到第一个出度 if( G.arcs[pos][j].adj!=Infinity ) // 如果找到第一个出度, return j; return -1; } int NextAdjVertex(AdjMatrix G,int pos,int w) { int j; for(j = w+1; j<G.vexnum; j++) if( G.arcs[pos][j].adj!=Infinity ) return j; return -1; } void DepthFirstSearch(AdjMatrix G,VertexData v) //图的深度优先搜索 { int pos,w; Visit(v); // 先进性图节点的访问 pos = LocateVex_M(G,v); //根据传进来的字符定位好节点的位置 visited[pos] = 1; //记录下此节点的访问属性 已经被访问/还未被访问 w = FirstAdjVertex(G,pos); // 由于图中的节点是有弧串起来的,因此求邻接点就要根据弧来操作 while( w!=-1 ) // 邻节点存在 { if(!visited[w]) DepthFirstSearch(G,G.vexs[w]); w = NextAdjVertex(G,pos,w); // 与上边同理 } } void TraverseGraph(AdjMatrix G) //图的遍历 { int i; for(i=0; i<G.vexnum; i++) //全被标记为未访问 visited[i] = 0; for(i=0; i<G.vexnum; i++) //一个一个判断访问属性,如果未被访问,则对其深度优先访问 if(!visited[i]) DepthFirstSearch(G,G.vexs[i]); } void main() { AdjMatrix G; if(!CreatGraph(&G)) //由于返回值不一定是0,所以这句还有待商讨; { puts("Failed to creat a graph!"); exit(0); } TraverseGraph(G); getch(); } 请各位大侠帮忙看看,为什么我的图创建函数再输入的时候会异常终止,谢谢啦