高效刷题 迎战校招
校招精选试题
2021年IT面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
喜羊羊 ID:JKVyhJlW 回复2

为什么在当pTemp-pNext为NULL值运行sTemp-pNext = pTemp-pNext;会出异常

2024-04-16 03:12:07 0
登录后,才能评论哟
九纹龙 ID:9SX6tGDc


为什么在当pTemp-pNext为NULL值运行sTemp-pNext = pTemp-pNext;会出异常,编译器为VS2022

2024-04-16 03:12:07
0 0
石秀 ID:PTGklKBF

引自免费微信小程序:皆我百晓生

在您的代码片段中,您遇到了一个读取访问权限冲突的异常,这通常是因为试图访问一个未初始化或者已经被释放的指针。具体来说,异常发生在执行 sTemp-pNext = pTemp-pNext; 这一行。

要解决这个问题,我们需要检查几个关键点:

确保在对链表进行操作之前,已经正确地初始化了所有的结构体。 当遍历链表并找到插入位置时,确保不会尝试访问空指针。 在插入新节点时,正确更新前驱节点的后继指针和新节点的前驱指针。

首先,让我们从头开始分析您的代码。看起来您正在尝试在一个单向链表中插入一个新的学生节点。以下是您提供的部分代码:

studentLIST* insertStuLIST(studentLIST* I, int index, student stu) {
    // ... 初始化代码 ...
    while (pTemp != NULL  j  i) {
        pTemp = pTemp-pNext;
        j++;
    }
    if (pTemp == NULL) {
        return;
    }

    sTemp = new studentLIST;
    sTemp-pStudent = stu;
    sTemp-pPrevious = pTemp;
    sTemp-pNext = pTemp-pNext;

    if (pTemp-pNext != NULL) {
        pTemp-pNext-pPrevious = sTemp;
    }
    pTemp-pNext = sTemp;
}

问题可能出现在以下几个地方:

pTemp 可能是空指针,导致 pTemp-pNext 访问异常。 pTemp-pNext 在插入点之后可能是空的,也可能导致异常。

为了解决这个问题,我们可以修改代码以防止上述情况:

studentLIST* insertStuLIST(studentLIST* I, int index, student stu) {
    studentLIST* temp = I;
    studentLIST* prev = nullptr;

    // 遍历链表,找到插入位置
    while (temp != nullptr  j  i) {
        prev = temp;
        temp = temp-pNext;
        j++;
    }

    // 如果到达链表末尾,则将新节点添加到最后
    if (temp == nullptr) {
        prev-pNext = sTemp;
        sTemp-pPrevious = prev;
        return I;
    }

    // 否则,在找到的位置插入新节点
    sTemp = new studentLIST;
    sTemp-pStudent = stu;
    sTemp-pPrevious = prev;
    sTemp-pNext = temp;

    // 更新前驱节点的后继指针和新节点的前驱指针
    if (prev != nullptr) {
        prev-pNext = sTemp;
    } else {
        I = sTemp;
    }
    temp-pPrevious = sTemp;

    return I;
}

这里主要做了两处修改:

使用临时变量 temp 和 prev 分别跟踪当前节点和前一个节点,以便在插入时正确处理边界情况。 在循环结束后,判断 temp 是否为空,若为空则表示到达链表末尾,此时只需将新节点添加到 prev 的后面。

这样应该可以避免因空指针而导致的异常。请尝试使用这段修正后的代码,并观察是否解决了问题。如果有任何其他疑问或需要进一步的帮助,请随时告诉我。

2024-04-16 03:12:07
0 0