我正在创建类似于结构列表的东西。在 main 的开头,我声明了一个空指针。然后我调用 insert() 函数几次,传递对该指针的引用,以添加新元素。
然而,似乎有些不对劲。我无法显示列表的元素,std::cout
只是破坏了程序,即使它在没有警告的情况下编译。
#include <iostream>
struct node {
node *p, *left, *right;
int key;
};
void insert(node *&root, const int key)
{
node newElement = {};
newElement.key = key;
node *y = NULL;
std::cout << root->key; // this line
while(root)
{
if(key == root->key) exit(EXIT_FAILURE);
y = root;
root = (key < root->key) ? root->left : root->right;
}
newElement.p = y;
if(!y) root = &newElement;
else if(key < y->key) y->left = &newElement;
else y->right = &newElement;
}
int main()
{
node *root = NULL;
insert(root, 5);
std::cout << root->key; // works perfectly if I delete cout in insert()
insert(root, 2);
std::cout << root->key; // program breaks before this line
return 0;
}
如您所见,我在插入函数中创建了新的结构元素并将其保存在根指针中。在第一次调用中,甚至没有启动 while 循环,因此它可以工作,并且我能够在主函数中显示 root 的元素。
但是在第二次调用中,while 循环已经起作用,我得到了我描述的问题。
语法有问题,root->key
因为即使我将它放在第一次调用中它也不起作用。
出了什么问题,原因是什么?
此外,我总是看到通过这样的指针插入新列表的元素:
node newElement = new node();
newElement->key = 5;
root->next = newElement;
此代码是否等于:
node newElement = {};
newElement.key = 5;
root->next = &newElement;
? 它会更干净一些,并且不需要删除内存。