为什么我的编译器不显示我对链表的输入操作以及返回值 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_left
和move_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);
我创建了实现双向链表的代码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_left
和move_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);