weixin_40703286
wantingtr
采纳率50%
2017-12-06 07:58 阅读 1.1k
已采纳

数据结构 图 邻接矩阵的建立 运行到最后一步会自动退出

void creatematrix(graph *g)//邻接矩阵
{
    int x,t,i,j;
    vertextype e1,e2;
    cout<<"输入顶点和边数"<<endl;
    cin>>g->numnodes>>g->numedges;
    cout<<"输入各个顶点数据"<<endl;
    for(i=0;i<g->numnodes;i++)
        cin>>g->vexs[i];//输入每个节点的字符数据到顶点表 vexs[0]=A
    for(i=0;i<g->numnodes;i++)
    {
        for(int j=0;i<g->numnodes;j++)
            g->arc[i][j]=0;
    }//邻接矩阵初始化
    cout<<"请输入每条边的两个顶点结点"<<endl;
    for(int k=0;k<g->numedges;k++)//输入边数
    {
        cin>>e1>>e2;
        for(i=0;i<g->numnodes;i++)//根据顶点表查找第一个结点
        {
            if(g->vexs[i]==e1)
                break;
        }
        for(j=0;j<g->numnodes;j++)//根据顶点表查找第二个结点
        {
            if(g->vexs[j]==e2)
                break;
        }
        g->arc[i][j]=1;
        g->arc[j][i]=g->arc[i][j];//无向图的邻接矩阵对称
    }
    cout<<"邻接矩阵建立完成"<<endl;

}![图片说明](https://img-ask.csdn.net/upload/201712/06/1512547025_862927.jpg)

只能运行到如图部分,按回车之后程序会自动退出

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • 已采纳
    lyy289065406 小優YoU 2017-12-07 05:16

    图片说明
    图片说明

     for(i=0;i<g->numnodes;i++)
        {
            for(int j=0;i<g->numnodes;j++)
                g->arc[i][j]=0;
        }//邻接矩阵初始化
    
    

    你这个初始化的内部循环写错了, 内层循环的判定条件是j 不是 i

    你写错会导致循环是数组越界,越界后把 numnodes 的值从3设置为0了
    为什么会设置numnodes,这是因为在结构体定的时候,这个arc数组和numnodes是连续的,处于连续存储区
    所以数组越界后直接影响了numnodes的值
    debug看一下就知道了

    numnodes变成0之后,后面的循环条件自然不满足了,所以不打印。

    我修改之后就正常了:
    图片说明

    还有你这代码风格,建议改下,一个是注释不好看,一个是代码太密,专门去学下编码风格吧。

    //邻接矩阵初始化
    for(i = 0; i < g->numnodes; i++) {
            for(int j=0; j < g->numnodes; j++) {
                g->arc[i][j] = 0;
                    }
    }
    

    这样岂不是更舒服,也能更快发现问题

    点赞 1 评论 复制链接分享
  • lyy289065406 小優YoU 2017-12-06 08:07

    退出正常,如果你建完邻接矩阵之后没什么需要跑很久的逻辑,main执行完自动就关闭DOS窗口了。
    你想窗口不关闭,就在main函数的最后加一行代码:

    
     int main(void) {
      // .... 你的代码
      creatematrix(g);  // 构造邻接矩阵
       // .... 你的代码
    
      system("pause");  //保持DOS不关闭
      return 0;
    }
    
    
    点赞 评论 复制链接分享
  • weixin_40703286 wantingtr 2017-12-07 04:55

    图片说明

    点赞 评论 复制链接分享
  • weixin_40703286 wantingtr 2017-12-07 04:57
     #define maxvex 10
    #include <iostream>
    using namespace std;
    int visit[maxvex];
    
    typedef char vertextype;//结点数据
    typedef struct
    {
        vertextype vexs[maxvex];//顶点表
        int arc[maxvex][maxvex];//邻接矩阵
        int numnodes,numedges;
    }graph;
    
    void creatematrix(graph *g)//邻接矩阵
    {
        int i,j;
        vertextype e1,e2;
        cout<<"输入顶点和边数"<<endl;
        cin>>g->numnodes>>g->numedges;
        cout<<"输入各个顶点数据"<<endl;
        for(i=0;i<g->numnodes;i++)
            cin>>g->vexs[i];//输入每个节点的字符数据到顶点表 vexs[0]=A
        for(i=0;i<g->numnodes;i++)
        {
            for(int j=0;i<g->numnodes;j++)
                g->arc[i][j]=0;
        }//邻接矩阵初始化
        cout<<"请输入每条边的两个顶点结点"<<endl;
        for(int k=0;k<g->numedges;k++)//输入边数
        {
            cin>>e1>>e2;
            for(i=0;i<g->numnodes;i++)//根据顶点表查找第一个结点
            {
                if(g->vexs[i]==e1)
                    break;
            }
            for(j=0;j<g->numnodes;j++)//根据顶点表查找第二个结点
            {
                if(g->vexs[j]==e2)
                    break;
            }
            g->arc[i][j]=1;
            g->arc[j][i]=g->arc[i][j];//无向图的邻接矩阵对称
        }
        cout<<"邻接矩阵建立完成"<<endl;
        cout<<"邻接矩阵如下"<<endl;
        for(i=0;i<g->numnodes;i++)
        {
            for(j=0;j<g->numnodes;j++)
                cout<<g->arc[i][j];
            cout<<endl;
        }
    
    }
    
    void matrixoutput(graph g)
    {
        cout<<"邻接矩阵如下"<<endl;
        for(int i=0;i<g.numnodes;i++)
        {
            for(int j=0;j<g.numnodes;j++)
                cout<<g.arc[i][j];
            cout<<endl;
        }
    }
    
    void DFS1(graph g,int i)
    {
        visit[i]=true;
        cout<<g.vexs[i]<<" ";//打印顶点
        for(int j=0;j<g.numnodes;j++)//一个连通分量的遍历
            if(g.arc[i][j]==1 && !visit[j])
                DFS1(g,j);
    }
    //邻接矩阵的深度遍历
    void DFS(graph g)
    {
        for(int i=0;i<g.numnodes;i++)
            visit[i]=0;//初始所有顶点状态都是未访问过状态
        for(int i=0;i<g.numnodes;i++)//若是连通图,只会执行一次
            if(!visit[i])//对未访问过的顶点调用DFS
                DFS1(g,i);
    }
    main()
    {
        graph g;
        creatematrix(&g);
        cout<<"对邻接矩阵进行深度优先遍历"<<endl;
        DFS(g);
        system("pause");
    }
    
    
    
    
    点赞 评论 复制链接分享

相关推荐