求关键路径,这里为啥会报错?

求关键路径,这里为啥会报错?

img


完整代码:

void KeyPath(AdjGraph* G)
{
    int topsort[MAXV];
    TopSort(G, topsort);
    int ve[MAXV] = { 0 };
    int vl[MAXV];
    int lnode = topsort[0];
    int enode = topsort[G->n - 1];
    int ee = 0;
    int el = 0;
    int i = 0;
    ArcNode* p = NULL;
    for (i = 0; i < G->n; i++)
    {
        p = G->adjlist[i].firstarc;
        while (p != NULL)
        {
            if (ve[p->adjvex] < ve[i] + p->weight)
            {
                ve[p->adjvex] = ve[i] + p->weight;
            }
            p = p->nextarc;
        }
    }
    for (i = 0; i < G->n; i++)//vl数组的初始化
    {
        //vl[i] = ve[G->n - 1];
        vl[i] = ve[enode];
    }
    for (i = G->n - 2; i >= 0; i++)//n -2
    {
        p = G->adjlist[i].firstarc;
        while (p != NULL)
        {
            //if (ve[i] - p->weight < vl[i])
            if (vl[p->adjvex] - p->weight < vl[i])
            {
                vl[i] = vl[p->adjvex] - p->weight;
            }
            p = p->nextarc;
        }
    }
    for (i = 0; i < G->n; i++)
    {
        p = G->adjlist[i].firstarc;
        while (p != NULL)
        {
            ee = ve[i];
            //el = vl[i] - p->weight;
            el = vl[p->adjvex] - p->weight;
            if (ee == el)
            {
                printf("%3d%3d%3d", i, p->adjvex, p->weight);
            }
            p = p->nextarc;
        }
    }
}

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

在你的代码中,第二个 for 循环的条件写成了 i++,应该是 i--。因此,当循环到 i = G->n - 1 时,i++ 会使 i 的值超出数组 vl 的索引范围,导致运行时错误。

更正后的代码如下:

void KeyPath(AdjGraph* G)
{
    int topsort[MAXV];
    TopSort(G, topsort);
    int ve[MAXV] = { 0 };
    int vl[MAXV];
    int lnode = topsort[0];
    int enode = topsort[G->n - 1];
    int ee = 0;
    int el = 0;
    int i = 0;
    ArcNode* p = NULL;
    for (i = 0; i < G->n; i++)
    {
        p = G->adjlist[i].firstarc;
        while (p != NULL)
        {
            if (ve[p->adjvex] < ve[i] + p->weight)
            {
                ve[p->adjvex] = ve[i] + p->weight;
            }
            p = p->nextarc;
        }
    }
    for (i = 0; i < G->n; i++)//vl数组的初始化
    {
        //vl[i] = ve[G->n - 1];
        vl[i] = ve[enode];
    }
    for (i = G->n - 2; i >= 0; i--)//修正此处的循环条件
    {
        p = G->adjlist[i].firstarc;
        while (p != NULL)
        {
            //if (ve[i] - p->weight < vl[i])
            if (vl[p->adjvex] - p->weight < vl[i])
            {
                vl[i] = vl[p->adjvex] - p->weight;
            }
            p = p->nextarc;
        }
    }
    for (i = 0; i < G->n; i++)
    {
        p = G->adjlist[i].firstarc;
        while (p != NULL)
        {
            ee = ve[i];
            //el = vl[i] - p->weight;
            el = vl[p->adjvex] - p->weight;
            if (ee == el)
            {
                printf("%3d%3d%3d", i, p->adjvex, p->weight);
            }
            p = p->nextarc;
        }
    }
}

现在,你的代码应该能够正确运行并求得关键路径。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7473992
  • 这篇博客你也可以参考下:数组类型的参数做函数入参,会退化为指针
  • 除此之外, 这篇博客: 最简单的函数,看看就会了中的 函数是什么? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    维基百科中对函数的定义:子程序

    • 在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组 成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。
    • 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。
    • 大白话:之前我们写一个加法功能是写在main函数里面的现在,把它拿出来单独写在main函数外面,就成了一个加法函数。
  • 您还可以看一下 肖海鹏老师的项目实战:大型企业会议室预定系统课程中的 已预定会议列表小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^