| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 553 人关注过本帖
标题:图的创建函数错误,在第二个循环输入的时候异常终止
只看楼主 加入收藏
chuanglan
Rank: 2
等 级:论坛游民
威 望:2
帖 子:91
专家分:29
注 册:2012-8-14
结帖率:84.62%
收藏
已结贴  问题点数:20 回复次数:8 
图的创建函数错误,在第二个循环输入的时候异常终止
程序代码:
/* 邻接矩阵,带权值,无向图 */
#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();
}
请各位大侠帮忙看看,为什么我的图创建函数再输入的时候会异常终止,谢谢啦
搜索更多相关主题的帖子: 异常 
2012-12-04 10:03
凌云飞翔
Rank: 5Rank: 5
来 自:河北
等 级:职业侠客
威 望:6
帖 子:98
专家分:388
注 册:2012-4-7
收藏
得分:20 
程序代码:
/* 邻接矩阵,带权值,无向图 */
#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->vexnum; j++)                       //   图的弧数
       G->arcs[i][j].adj = Infinity;
   puts("Please input the vertex's content");
   getchar () ;
   for (i=0; i<G->vexnum ; ++i )
    scanf ("%c", &G->vexs[i]) ;
    puts("input the two vertex and their weights:");
    getchar () ;
   for(k=0; 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>=0 )      //   邻节点存在
    {
       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!");
   
    }
   TraverseGraph(G);

 printf ("\n") ;
}
2012-12-06 23:12
凌云飞翔
Rank: 5Rank: 5
来 自:河北
等 级:职业侠客
威 望:6
帖 子:98
专家分:388
注 册:2012-4-7
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
2012-12-06 23:14
chuanglan
Rank: 2
等 级:论坛游民
威 望:2
帖 子:91
专家分:29
注 册:2012-8-14
收藏
得分:0 
我把你的代码复制,然后按照你的输入测试程序,还是异常终止,我同学创建的是邻接表,也遇到了类似的问题,而不得解,请详解,谢谢!
2012-12-08 23:25
凌云飞翔
Rank: 5Rank: 5
来 自:河北
等 级:职业侠客
威 望:6
帖 子:98
专家分:388
注 册:2012-4-7
收藏
得分:0 
你用的编程软件是什么?我的是vc++的
例,当输入abcd是紧挨着的不要空格
2012-12-08 23:55
chuanglan
Rank: 2
等 级:论坛游民
威 望:2
帖 子:91
专家分:29
注 册:2012-8-14
收藏
得分:0 
输入的时候我注意了,我用winTC,我同学编邻接表的时候也遇到了这种情况,代码与我的稍微不同,她用的是VC++,谢谢你的帮忙,
2012-12-09 16:40
凌云飞翔
Rank: 5Rank: 5
来 自:河北
等 级:职业侠客
威 望:6
帖 子:98
专家分:388
注 册:2012-4-7
收藏
得分:0 
不客气,简单的咱们一起讨论,难题我也顶不住。。。相互帮助,共同进步吧。
2012-12-09 18:13
chuanglan
Rank: 2
等 级:论坛游民
威 望:2
帖 子:91
专家分:29
注 册:2012-8-14
收藏
得分:0 
可能是编译器的问题,因为我在虚拟机中的VC++中可以得到你给的结果,不过怎么在网页上粘贴图片?我想粘粘不了...
2012-12-10 12:39
凌云飞翔
Rank: 5Rank: 5
来 自:河北
等 级:职业侠客
威 望:6
帖 子:98
专家分:388
注 册:2012-4-7
收藏
得分:0 
添加附件!试试
2012-12-10 12:44
快速回复:图的创建函数错误,在第二个循环输入的时候异常终止
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018428 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved