c - <0xC0000005> 插入链表时出错

标签 c list pointers memory

我无法解决以下函数中的错误。该函数的目的是将数字按升序插入到链表中。

当列表为空/插入第一个节点时,此函数工作正常,但我收到错误 Process returned -1073741819 <0xC0000005>当它之后尝试插入节点时。

Node *orderedInsert(Node *p, int newval)
{
    Node* q = (Node*)malloc(sizeof(Node));
    q->data = newval;
    if(p == NULL || newval <= p->data)
    {
        q->next = p;
        return q;
    }
    else
    {
        Node* tmp = p;
        while(tmp != NULL && tmp->data <= newval)
        {
            tmp = tmp->next;
        }
        q->next = tmp->next;
        tmp->next = q;
        return p;
    }
}

我意识到 0xC0000005 错误代表访问冲突;在尝试调试此问题时,我注意到访问 tmp->next不会给我任何预期的结果:我猜我的 tmp 有问题节点,我只是不太知道什么以及如何修复它。

谁能帮助我理解我做错了什么?

最佳答案

问题是您在需要插入的地方插入了过去。这意味着如果您插入的节点具有最大值,您将到达 tmp 为 NULL 的末尾,然后您将尝试设置 tmp->nextq。您可能想要使用位于 tmp 后面一个元素的 prev 指针,因此您可以在 prev 处插入。

关于c - <0xC0000005> 插入链表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27339930/

相关文章:

java/jackson - 不要序列化包装类

c++ - 为什么用 debug_rep(&s) 调用模板 <typename T> string debug_rep(T *p) 时 T 不是 string*

c - 写在一个字符串上,但每 k 个字节

c - 使用 uint8_t 声明变量的正确方法

c - 为什么我们不能在不使用花括号的情况下在 switch case 冒号后声明变量?

java - 使用 "id"字段更新列表的子部分

list - 由列表分配的值,每次迭代更改

c++ - 通过引用传递的多种方式?

c - 在 for 语句中声明变量时出错

c - 在没有分支的情况下设置或重置给定位