微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

链表遍历随机崩溃

如何解决链表遍历随机崩溃

我正在处理图形问题,所以我的程序有一个初始化,它使用 adjacencyList 设置所有连接。目前遇到一个非常奇怪的错误,想知道是否有人可以就可能发生的事情提供一些见解。

所以我有一个设置连接的函数

void setConnection(Graph g,int svertex,int eVertex){
    ListNode *newNode = (ListNode *) malloc(sizeof(ListNode*));
    newNode->vertex = eVertex;

    ListNode *temp = g.list[svertex-1];

    if (temp == NULL){ // Corresponding list is empty
        newNode->next = NULL;
        g.list[svertex-1] = newNode;
    }
    else{ // Insert new node to the front
        newNode->next = temp; // set newNode's next to current 'head'
        g.list[svertex-1] = newNode; // Replace head as newNode
    }


    //printf("Connection set from %d to %d\n",svertex,g.list[svertex-1]->vertex);
    return;
}

初始化后,我通常会尝试打印出 adjacencyList 以检查逻辑是否正确。功能如下:

void printGraphList(Graph g){
    int i;
    ListNode* temp;

    for(i=0;i<g.V;i++)
    {
        printf("|");
        printf("%d:\t",i+1);
        temp = g.list[i];
        while(temp != NULL){
            printf("%d -> ",temp->vertex);
            temp = temp->next;
        }
        printf("\n");
    }
}

所以这是奇怪的部分,代码大部分时间都可以正常工作,但在打印 adjacencyList 时偶尔会随机崩溃。我调试到

printf("%d -> ",temp->vertex);

出于某种原因,在某些情况下,插入的第一个节点没有将其 ->next 正确设置为 NULL。因此在列表遍历中,它没有正确退出,因此无法获得 temp->vertex,从而导致崩溃。

我还调试了 setConnection 以确保正确设置链接,就像实际的指针值本身 T.T

以下是工作运行和问题运行的示例。我在打印顶点之前打印了 & 并且之后打印了 @ 。如图,对于顶点7,它应该只链接到顶点9和10,但是在问题运行中,看起来9的下一个节点没有正确设置为NULL,导致程序崩溃试图获取节点 9's->next->vertex,因为它不存在...

如前所述,这种情况每运行 3 到 4 次就会发生一次,我不知道是什么导致了这种不一致。任何帮助表示赞赏!提前致谢。

Problem Example Working Example

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。