0

insert関数とswapSubTreesおよび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);
  }

 }
}

私の主なプログラムは:

#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;

  }

プログラムは完全にコンパイルおよび実行され、12から始まるリストの印刷を開始します。

これはbinaryTree.txtの内容です:12 23 56 45 78 89 98 25 36 65 54

なぜクラッシュし続けるのか、少し混乱しています。何かご意見は?リストを手動で作成したとき、プログラムは安定していませんでした。最後のアイテムが印刷された後、プログラムはハングします。印刷しようとするとハングするようになりました。機能に問題があると思います。

とても有難い

4

2 に答える 2

4
if (p->lLink != NULL && p->rLink != NULL)
   {

 nodeType<elemType> * temp = p->lLink;
  p->lLink = p->rLink;
  p->rLink = temp;
  delete temp;
}

lLinkを指しているポインタを削除しています...つまり、lLink全体を削除し、おそらく別の場所で再度アクセスしようとしているということですか?

これを処理する方法は、削除するのではなく、tempをnullに設定することです。ただし、tempはそのブロック内のローカル変数であり、tempがnullに設定された直後にスコープ外になるため、実際には問題ではありません。

印刷で問題となるもう1つの潜在的な領域:-

   if(p != NULL)
    cout << p->info << endl;
    printTree(p->lLink);
    printTree(p->rLink);

ifステートメントの本文に複数のステートメントを含めるには中括弧が必要です...

于 2012-11-05T23:39:16.350 に答える
2

私が思う問題(コードを実行せずに)は次のとおりです。

 delete temp;

スワップ3内。新しいポインタを作成せずに、tempへのポインタをコピーしています。削除する必要はありません。メモリ割り当ての変動により、プログラムが実行されたり、別のセクションで失敗したりする場合があります。

于 2012-11-05T23:41:58.907 に答える