为什么我的编译器不显示我对链表的输入操作以及返回值 3221225477?

Why doesn't my compiler show my input operation about the linked list and with returned value 3221225477?

我创建了实现双向链表的代码structure.However,我不知道为什么它没有显示我预期的输出,甚至不打印任何东西。 这是编译器的输出: 进程在 0.2849 秒后退出,return 值为 3221225477 但它显示 0 错误和 0 警告。 你知道这个问题吗? 提前致谢!

这是我的代码

#include <stdio.h>
#include <stdlib.h>
//define a node
typedef struct ListNode
{
    int val;
    struct ListNode* left;
    struct ListNode* right;
} ListNode;
//define a function to insert node on the right
void insert_right(ListNode* p)
{
    ListNode* new_node = (ListNode*)malloc(sizeof(ListNode));
    new_node->val = 0;
    new_node->right = p->right;
    p->right->left = new_node;
    p->right = new_node;
    new_node->left = p;
}
//define a function to insert node on the left
void insert_left(ListNode* p)
{
    ListNode* new_node = (ListNode*)malloc(sizeof(ListNode));
    new_node->val = 0;
    new_node->left = p->left;
    p->left->right = new_node;
    p->left = new_node;
    new_node->right = p;
}
//move the p to the right by X
void move_right(int X, ListNode* p)
{
    int i; 
    for(i = 0; i < X; i++)
    {
        if (p->right != NULL)
        {
            p = p->right;
        }
        else
        {
            printf("Right");
            break;
        }
    }
}
//move the p to the left by X
void move_left(int X, ListNode* p)
{
    int i;
    for(i = 0; i < X; i++)
    {
        if (p->left != NULL)
        {
            p = p->left;
        }
        else
        {
            printf("Left");
            break;
        }
    }
}

//delete the node on the right of p
void remove_right(ListNode* p)
{
    if(p->right != NULL)
    {
        p->right->right->left = p;
        p->right = p->right->right;
    }
    else printf("Right");
}
//delete the node on the left of p
void remove_left(ListNode* p)
{
    if(p->left != NULL)
    {
        p->left->left->right = p;
        p->left = p->left->left;
    }
    else printf("Left");
}
//change the val of the node(p points to) to X
void set(int X, ListNode* p)
{
    p->val = X;
}
//show the value of the node which p points to
void show(ListNode* p)
{
    printf("%d", p->val);
}
int main()
{
    int i, j;
    //define the head_node and let p points to it
    ListNode* head = (ListNode*)malloc(sizeof(ListNode));
    head->val = 0;
    head->left = NULL;
    head->right = NULL;
    ListNode* p = head;
    for(i = 0; i < 6; i++)
    {
    insert_left(p); 
    }
    for(i = 0; i < 6; i++)
    {
    insert_right(p); 
    }
    move_left(2, p);
    move_right(30, p);
    show(p);
    printf("ha"); 
}

第一次调用 insert_left(p); 作为 head->left = NULL; 时出现问题,并且在 insert_left()p->left->right = new_node; 中使用了 NULL 指针。

我建议使用调试器并逐行检查变量是否符合您的简单测试数据。在 C 或 C++ 中调查内存覆盖是非常困难的。始终检查指针是否为 NULL 很重要。有一个例外:如果您之前检查过。

第一个问题就是你说的p->left可能指向NULL。 而另一个问题是在move_leftmove_right中,p只能在函数内改变,不能在函数外改变。所以我应该使用“指向指针的指针”。 就像这样:

    //move the p to the right by X
    void move_right(int X, ListNode** p_ref)
    {
        int i;
        for(i = 0; i < X; i++)
        {
            if ((*p_ref)->right != NULL)
            {
                (*p_ref)= (*p_ref)->right;
            }
            else
            {
                printf("Right");
                break;
            }
        }
    } 
//and in main func:

move_left(20, &p);
show(p);
move_right(30, &p);