我正在尝试将某些内容插入到二叉树中,我想通过使用有序打印功能来查看内部的内容。似乎在“print_bst_node(root-> left);”中抛出异常。说“抛出异常:读取访问冲突”。每次我运行程序。这个功能有问题吗?
编辑,添加了insert_bst包装函数。
//bst.h
typedef struct bstNode { //pointer to the bst
long data; //storing long data types from -2,147,483,648 to 2,147,483,647
List courses; //this is the list of courses
struct bstNode *left; //left child of the tree
struct bstNode *right; //right child of the tree
} *BSTNodePtr;
typedef struct bst {
BSTNodePtr root; //points to the root of the tree
} BST;
//bst.c
void print_bst_node(BSTNodePtr root) {
if (root != NULL) {
print_bst_node(root->left);
printf("%ld ", root->data);
print_bst_node(root->right);
}
else {
printf("Nothing to see here");
}
}
BSTNodePtr insert_bst_node(BSTNodePtr self, long n) {
if (self == NULL) {
self = malloc(sizeof *self);
self->data = n;
self->courses = new_list(); //creates a new linked list in the binary search tree nodes.
self->left = self->right = NULL;
}
else if (n < self->data) {
self->left = insert_bst_node(self->left, n);
}
else if (n > self->data) {
self->right = insert_bst_node(self->right, n);
}
return self;
}
void insert_bst(BST *self, long n) { //wrapper function for insert_bst_node
self->root = insert_bst_node(self->root, n);
}
//main.c
void add_to_bst(BST *self) {
long input = 0;
printf("Enter student ID\n");
scanf("%ld", &input);
insert_bst(self, input);
print_bst_node(self);
}
答案 0 :(得分:2)
问题出现了,因为您将不兼容的指针作为参数传递给print_bst_node()
函数。 print_bst_node()
参数的类型为BSTNodePtr
:
void print_bst_node(BSTNodePtr root) {
您正在将self
传递给它:
print_bst_node(self);
是指向BST
类型的指针:
void add_to_bst(BST *self) {
相反,您应该将self->root
传递给print_bst_node()
:
print_bst_node(self->root);
编译器必须抛出警告消息以传递不兼容的指针类型。
答案 1 :(得分:1)
print_bst_node
函数会打印大量"Nothing to see here"
条消息!
除此之外,似乎没问题,只要我们可以推断......你没有提供BSTNodePtr
的声明。
问题出在其他地方:
left
和right
可能在分配或声明时未正确初始化使用代码更新您的问题,以获得更详细的答案的完整示例。
答案 2 :(得分:0)
每当您创建节点时,该节点必须将其所有左右子项设置为NULL
或(void *) 0
答案 3 :(得分:0)
添加新节点时,您应该将其值归属,然后将 - &gt; left - &gt;右侧归属为NULL,否则您将遇到类似函数的问题。因为停止案例正在寻找NULL并且不会有一个(它很可能会读取存储点处的垃圾)。
之后,您创建的功能非常好:)