You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++邻接表实现图时PopulateGraph执行后指针异常崩溃问题求解

问题排查

1. 程序崩溃直接原因:PopulateGraph 函数缺少返回值

你声明该函数的返回类型为AdjVertex*,但函数执行完成后没有写return head;语句,导致返回值是内存中的随机垃圾值,赋值给G.head[i]后指针指向非法地址,访问时直接触发段错误。

2. 边权值逻辑错误

当前你把prob()<P的布尔值(0/1)直接作为权重传给AddNewVertex,不符合作业要求的1~10随机距离要求。虽然概率不通过时权重为0、跳过加边的逻辑是通顺的,但权值范围完全不符合需求。

3. 随机数种子未初始化

代码没有调用srand(time(NULL)),每次运行生成的随机序列都是固定的,不符合随机图的生成要求。

4. 无向图逻辑缺失

当前仅给顶点i的邻接表添加了j的边,没有同步给顶点j的邻接表添加i的边,最终生成的是有向图而非作业要求的无向图。

5. 命名冲突隐患

PopulateGraph的形参head和类的成员变量head重名,虽然当前逻辑下不会触发错误,但非常容易引发后续的逻辑混乱。


核心修复代码

// 新增生成1.0~10.0随机距离的函数
double randCost() {
    return 1.0 + static_cast<double>(rand()) / (RAND_MAX / 9.0);
}

// 修改PopulateGraph,补返回值、修正权值逻辑、避免命名冲突
AdjVertex* graph::PopulateGraph(AdjVertex *local_head,int pos,int size, double P){
    #ifdef DEBUG
    cout << "I'm filling adjiacency list of vertex"<< pos<<endl;
    #endif
    for (int j=0;j<size;++j){
        if(pos==j){
            #ifdef DEBUG
            cout << "I'm avoiding a loop"<<endl;
            #endif
        }else if(prob() < P){
            // 概率符合要求时生成1~10的随机权值加边
            local_head = AddNewVertex(j, randCost(), local_head);
        }
    }
    // 补返回值,这是修复崩溃的核心步骤
    return local_head;
}

int main(){
    //  main函数开头加随机数种子初始化
    srand(time(NULL));
    int SIZE=4;
    graph G(SIZE);
    // 其余原有逻辑不变
}

如果要实现无向图,建议调整生成逻辑:不要单顶点循环生成邻接表,而是全局遍历所有i<j的顶点对,符合概率要求时同时给i和j的邻接表加边即可。


内容的提问来源于stack exchange,提问作者Davidee91

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:36:01