C++ BST 内存错误 - 我的删除有什么问题?
C++ BST Memory error - what's wrong with my remove?
我遇到的问题是,我的树只能成功地删除一个节点一次。当我试图让它删除更多,它会崩溃与分割错误(核心转储)错误。我似乎无法指出它出错的确切位置,但它应该是我在内存分配和释放方面做错了,我只是看不到它。
这是我的插入,移除,移除助手,和叶子(因为它被称为内部移除):
插入:
/*********************************************************
Function: insert
Arguments: const T &x (a T variable)
Returns: void
Notes: If the tree is empty, the function will set the node
as the root. Otherwise, it will look for the appropiate
place (in terms of a BST) to place it as long as its data
is not already existent inside the tree.
*********************************************************/
template<class T> void binSTree<T>::insert(const T &x)
{
BinTreeNode *newnode, *current, *parentOfCurrent; /* newnode will be the inserted node, current and parentOfCurrent will be traversing the while loop to find an appropiate space to insert */
newnode = new BinTreeNode; /* allocates storage space */
newnode->info = x; /* sets newnode's data equal to x */
newnode->left = newnode->right = NULL; /* sets newnode's left and right children equal to NULL */
if (root == NULL) { /* if the tree is empty, it will place newnode on the root */
root = newnode;
cout << "added to rootn";
return; }
current = root; /* sets current at the root */
while(current != NULL) { /* while current is not NULL, it will search for a place to insert the new node */
parentOfCurrent = current; /* sets the parent equal to current */
if(current->info == x) /* if the variable is found inside the tree, then it will error and exit */
{
cout << x << " already exists in tree. Duplicates not allowed!n";
return;
}
else if(current->info > x) /* otherwise, if the variable is less than the data on the tree currently, it will move left */
current = current->left;
else /* otherwise, if the variable is greater than the data on the tree currently, it will move right */ current = current->right;
}
/* the new node is placed where current would be in */
if (parentOfCurrent->info > x)
parentOfCurrent->left = newnode;
else
parentOfCurrent->right = newnode;
}
remove and privRemove:
template <class T> bool binSTree<T>::remove(const T &x)
{
BinTreeNode *current, *parentOfCurrent; /* current for tranversing the tree in the while loop and parentofCurrent to help */
bool found = false; /* the booleans that is to be returned */
if (root == NULL) { /* Checks if the tree is empty, if it is, it returns found (false) and exits */
return found;
}
current = root; /* sets current equal to root */
while(current != NULL) /* loops repeats until current is equal to NULL */
{
if(current->info == x) { /* if the current data from the tree is equal tox, then it breaks the loop and sets found equal to true */
found = true;
break;
}
else { /* otherwise, it will search for the next place to go in the tree */
parentOfCurrent = current; /* parentOfCurrent is set to current before current is set to one of its children */
if(current->info > x) /* if x is less than the data on current, then it will move left */
current = current->left;
else /* if x is greater than the data on current, then it will move right */
current = current->right;
}
}
if(found == true) { /* if it was found, it will pass current via the parent to the private remove function */
if (current == root)
privRemove(root);
else if (parentOfCurrent->info > x) { /* if current is to the left of the parent */
found = leaf( parentOfCurrent->left );
if(found == true)
privRemove(parentOfCurrent->left);
}
else { /* if current is to the right of the parent */
found = leaf( parentOfCurrent->left );
if(found == true)
privRemove(parentOfCurrent->right);
}
}
return found;
}
/*********************************************************
Function: privRemove
Arguments: BinTreeNode* &node (the node that is to be deleted)
Returns: void
Notes: This private remove function will take in the node that
is provided by the public remove function, and, after ensuring
that the node passed is not NULL, then it will delete it.
*********************************************************/
template <class T> void binSTree<T>::privRemove(BinTreeNode* &node)
{
BinTreeNode *temp; /* initializes temp in order to hold the information of node */
if(root != NULL ) /* if the node is not NULL */
{
temp = node;
delete node;
node = temp;
}
}
叶:
/*********************************************************
Function: leaf
Arguments: BinTreeNode* node
Returns: boolean
Notes: This function will check if the node in the argument
is a leaf by checking if both of its children are NULL. If
they are, it returns true. Otherwise, it returns false.
*********************************************************/
template <class T> bool binSTree<T>::leaf(BinTreeNode* node) const
{
bool isLEaf = false; /* the boolean variable it is to return */
if(node->left == NULL && node->right == NULL) /* checks if the node has no children */
isLEaf = true; /* if it does, it sets isLEaf equal to true */
return isLEaf; /* after going through the if statement, it returns the variable isLeaf */
}
应该注意的是,我的节点是在类头文件中声明的结构体,变量root被声明为受保护的变量,格式为BinTreeNode* root;它在binSTree构造函数中初始化为NULL。另外,我只允许删除叶子。
在我看来,你做错了是在privRemove方法…假设您试图删除一个节点,并且在该节点上调用了privRemove。
:
delete node;
你释放的内存节点指向。
然后将node重新分配给它之前的值:
node=temp;
,所以它现在指向与以前相同的位置(在函数内部和外部,因为你通过引用传递它)。
现在在下一次移除时,你最终会遇到相同的节点并测试它是否为NULL,但它不是,因为你给了它一个值,所以它指向它之前拥有的内存(node=temp),所以节点指向内存中的某个地方,不是NULL,所以你会认为它是一个合法的节点,但它不是,它指向已经释放的内存。当你在它上面调用一个方法时…
相关文章:
- 警告处理为错误这里有什么问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 当我尝试添加 2 个大字符串时,我无法弄清楚出了什么问题
- 违反const正确性:我应该现实地期待什么问题
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 我的逻辑反转字符串中的元音有什么问题?
- 需要以下代码的帮助,下面的代码有什么问题
- 常量公共成员有什么问题?
- 以下代码中的函数模板有什么问题?
- 这个返回元素位置的基于循环的函数有什么问题?
- creat_list2功能有什么问题?
- 格式说明符C++有什么问题
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 我的堆栈和库存清单程序的结构有什么问题?
- 此工厂功能有什么问题?
- 以下 C++ 代码有什么问题?
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了