C++ 二叉树:从文件读取崩溃
在测试了insert函数、swapusubtrees和printTree函数之后,我终于让我的所有函数都正常工作了。现在我需要从一个文件创建一个二叉树,然后打开该文件并读取该文件的第一个整数,但是我的程序崩溃了 这里有一大堆代码,我不想把代码堆成一堵墙。我将张贴我的重要部分,如果需要,将提供其余的代码,如果要求 我的交换和打印功能是:C++ 二叉树:从文件读取崩溃,c++,C++,在测试了insert函数、swapusubtrees和printTree函数之后,我终于让我的所有函数都正常工作了。现在我需要从一个文件创建一个二叉树,然后打开该文件并读取该文件的第一个整数,但是我的程序崩溃了 这里有一大堆代码,我不想把代码堆成一堵墙。我将张贴我的重要部分,如果需要,将提供其余的代码,如果要求 我的交换和打印功能是: template<class elemType> void bSearchTreeType<elemType>::printTree()
template<class elemType>
void bSearchTreeType<elemType>::printTree()
{
printTree(root);
}
template<class elemType>
void bSearchTreeType<elemType>::printTree(nodeType<elemType> *p)
{
if(p != NULL)
cout << p->info << endl;
printTree(p->lLink);
printTree(p->rLink);
}
template<class elemType>
void bSearchTreeType<elemType>::swapSubtrees(nodeType<elemType> * p)
{
if (p != NULL)
{
if (p->lLink != NULL && p->rLink != NULL)
{
nodeType<elemType> * temp = p->lLink;
p->lLink = p->rLink;
p->rLink = temp;
delete temp;
}
if (p->lLink != NULL && p->rLink == NULL)
{
swapSubtrees(p->lLink);
}
if (p->rLink != NULL && p->lLink == NULL)
{
swapSubtrees(p->rLink);
}
}
}
模板
void bSearchTreeType::printTree()
{
打印树(根);
}
模板
void bSearchTreeType::printTree(节点类型*p)
{
如果(p!=NULL)
cout-info-lLink);
打印树(p->rLink);
}
模板
void bSearchTreeType::SwapusubTrees(节点类型*p)
{
如果(p!=NULL)
{
如果(p->lLink!=NULL&&p->rLink!=NULL)
{
节点类型*temp=p->lLink;
p->lLink=p->rLink;
p->rLink=温度;
删除临时文件;
}
如果(p->lLink!=NULL&&p->rLink==NULL)
{
Swapusubtrees(p->lLink);
}
如果(p->rLink!=NULL&&p->lLink==NULL)
{
交换树(p->rLink);
}
}
}
我的主要课程是:
#include<iostream>
#include<fstream>
#include<cstdlib>
#include "binarySearchTree.h"
using namespace std;
int main()
{
bSearchTreeType<int>bt;
ifstream infile;
infile.open("binaryTree.txt");
if(!infile){
cout<<"File not found"<<endl;
}
int tree;
while(infile>> tree)
{
bt.insert(tree);
}
bt.swapSubtrees();
bt.printTree();
bt.swapSubtrees();
system("PAUSE");
return 0;
}
#包括
#包括
#包括
#包括“binarySearchTree.h”
使用名称空间std;
int main()
{
b搜索快报;
河流充填;
open(“binaryTree.txt”);
如果(!infle){
coutif(p->lLink!=NULL&&p->rLink!=NULL)
{
节点类型*temp=p->lLink;
p->lLink=p->rLink;
p->rLink=温度;
删除临时文件;
}
您正在删除一个指向lLink的指针……这意味着您正在删除整个lLink,并可能试图在其他地方重新访问它
处理这个问题的方法是只将temp设置为null,而不是删除。但这并不重要,因为temp是该块中的一个局部变量,它在temp设置为null后立即超出范围
另一个可能存在印刷问题的领域:-
if(p != NULL)
cout << p->info << endl;
printTree(p->lLink);
printTree(p->rLink);
if(p!=NULL)
cout-info-lLink);
打印树(p->rLink);
您需要大括号来包含if语句体中的多个语句…if(p->lLink!=NULL&&p->rLink!=NULL)
{
节点类型*temp=p->lLink;
p->lLink=p->rLink;
p->rLink=温度;
删除临时文件;
}
您正在删除一个指向lLink的指针……这意味着您正在删除整个lLink,并可能试图在其他地方重新访问它
处理这个问题的方法是只将temp设置为null,而不是删除。但这并不重要,因为temp是该块中的一个局部变量,它在temp设置为null后立即超出范围
另一个可能存在印刷问题的领域:-
if(p != NULL)
cout << p->info << endl;
printTree(p->lLink);
printTree(p->rLink);
if(p!=NULL)
cout-info-lLink);
打印树(p->rLink);
您需要大括号来包含if语句体中的多个语句…我认为(不运行代码)的问题在于:
在交换三内。您正在复制指向临时的指针,而不是创建新指针。无需删除它。
由于内存分配的变幻莫测,您的程序有时会在不同的部分运行,有时会失败。我认为(不运行代码)的问题在于:
在交换三内。您正在复制指向临时的指针,而不是创建新指针。无需删除它。
由于内存分配的变幻莫测,您的程序有时可能会在不同的部分运行,有时会失败。当您使用调试器进行调试时,会出现什么错误?我猜这是一个空指针,proj8.exe中0x777415de处存在未经处理的异常:0xC0000005:访问冲突读取位置0x00000004。为什么要删除gbSearchTreeType::swapusubtrees
中的gtemp
?它只是一个指针。它不是一个完全分配的对象。因此,您正在删除它所指向的对象,这是您的新rlink。如果您想彻底了解,只需将指针设置为null。不要删除它。请检查我对大括号的最新编辑,看看是否有帮助。当您逐步完成时,请h使用调试器时会出现什么错误?我猜它是一个空指针,proj8.exe中0x777415de处未处理的异常:0xC0000005:访问冲突读取位置0x00000004。为什么要删除bSearchTreeType::swapusubtrees
中的temp
?它只是一个指针。它不是一个完全分配的对象。所以您被删除了正在删除它所指向的内容,这是您的新rlink。如果您想彻底了解,只需将指针设置为null。不要删除它。检查我最近对大括号的编辑,看看是否有帮助。我删除了这个,程序仍然挂起我删除了这个,程序仍然挂起现在我将它在visual studio中运行,但当我将它移植到我的linux mac上时hine它编译了,但我收到了一个分段错误。你有什么想法吗?我的gdb告诉我如果(p->lLink!=NULL&&p->rLink!=NULL)在处有一个分段错误
有什么想法吗?现在我在visual studio中使用它,但是当我将它移植到我的linux机器上时,它会编译,但我收到一个分段错误。有什么想法吗?我的gdb告诉我如果(p->lLink!=NULL&&p->rLink!=NULL)
有什么想法吗?
delete temp;