0
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

template <class T>
struct TreeNode{
  string value;
  T key;
  TreeNode<T> *LeftChild;
  TreeNode<T> *RightChild;
  TreeNode (T k,string Val)
  {
           this->value=Val;
           this->key=k;
           this->LeftChild=NULL;
           this->RightChild=NULL;
  }
};

template <class T>
class BinaryTree{
  private:
       TreeNode<T> *Root;        
  public:  
       BinaryTree();
       void insertNode();
};


template <class T>
BinaryTree<T>::BinaryTree()
{
Root=NULL;                       
ifstream fin;
fin.open("names.txt");
string buffer;
T buff;
while (!fin.eof())
{
      getline(fin,buffer,'~');
      fin>>buff;
      cout<<buff<<buffer<<endl;
      cout<<"down the tree"<<endl;
      TreeNode<T> *temp=Root;
      while (temp!=NULL)
      {
          TreeNode<T> *Right=temp->RightChild;
          TreeNode<T> *Left=temp->LeftChild;
          if (temp->key>buff)
          {
              temp=temp->LeftChild;
          }
          else if (temp->key<buff)
              temp=temp->RightChild;
          }
          cout<<"further down"<<endl;
      }
      temp->value=buffer;
      temp->key=buff;
      cout<<"and done!"<<endl;

      cout<<"hey"<<endl;
}
fin.close();
}

二分木を作っています。ツリーには左右の子へのポインタと、各ノードのキーと文字列値があります。デストラクタでは、ファイルから読み取り、キーと値をノードに保存しています。ファイルのすべての行の形式は次のとおりです "M. Ubiquity~ 14100148" 。-値は名前の後にキーが続きます。このコードを実行するたびに、セグメンテーション違反エラーが発生しますが、障害を見つけることができないようです。ヒント/ヘルプをいただければ幸いです。

4

2 に答える 2

1

あなたが持っていてRoot=NULL;、それから数行後TreeNode<T> *temp = Root;にあなたが持っているtemp=NULL.

明らかに、while (temp!=NULL)決して実行されず、while ループの後、temp->value=buffer;セグメンテーション違反が発生します。

于 2013-02-23T13:15:42.647 に答える
0

ポインタはメモリアドレスにのみ関連付けることができ、値には関連付けることができません。主に2つの方法があります。自動変数がある場合は、次のようにそのアドレスをポインターに割り当てることができます。

int  i  = 6; //automatic variable
int *pi = &i;
std::cout << pi; // you get the address of pi (hexadecimal number)
std::cout << *pi; // 6

または、手動でメモリを割り当てることができます。主なことは、変数にメモリを割り当てた場合、それも割り当てを解除する必要があります。そうしないと、プログラムで「メモリリーク」が発生します。

int *pi = new int(6);
delete pi;

したがって、ツリーに新しい要素を配置する場合は、それらにメモリを割り当てる必要があり、要素を削除する場合は、deleteで破棄する必要があります。リストを壊さないように気をつけなければなりません。

于 2013-02-23T14:13:52.657 に答える