aquiral
12-01-2007, 10:18
Salve a tutti, non riesco a capire l' errore di compilazione su questo programma, premetto che prima di utilizzare il costruttio switch nel main funzionava correttamente:
// Fig. 4.16: fig4_16.cpp
// Driver to test class Tree
#include <iostream>
#include <iomanip>
using namespace std;
using std::cout;
using std::cin;
using std::setiosflags;
using std::ios;
using std::setprecision;
#ifndef TREE_H
#define TREE_H
#include "treenode.h"
using std::endl;
template< class NODETYPE >
class Tree {
public:
Tree();
void insertNode( const NODETYPE & );
void preOrderTraversal() const;
void inOrderTraversal() const;
void postOrderTraversal() const;
private:
TreeNode< NODETYPE > *rootPtr;
// utility functions
void insertNodeHelper(
TreeNode< NODETYPE > **, const NODETYPE & );
void preOrderHelper( TreeNode< NODETYPE > * ) const;
void inOrderHelper( TreeNode< NODETYPE > * ) const;
void postOrderHelper( TreeNode< NODETYPE > * ) const;
};
template< class NODETYPE >
Tree< NODETYPE >::Tree() { rootPtr = 0; }
template< class NODETYPE >
void Tree< NODETYPE >::insertNode( const NODETYPE &value )
{ insertNodeHelper( &rootPtr, value ); }
// This function receives a pointer to a pointer so the
// pointer can be modified.
template< class NODETYPE >
void Tree< NODETYPE >::insertNodeHelper(
TreeNode< NODETYPE > **ptr, const NODETYPE &value )
{
if ( *ptr == 0 ) { // tree is empty
*ptr = new TreeNode< NODETYPE >( value );
assert( *ptr != 0 );
}
else // tree is not empty
if ( value < ( *ptr )->data )
insertNodeHelper( &( ( *ptr )->leftPtr ), value );
else
if ( value > ( *ptr )->data )
insertNodeHelper( &( ( *ptr )->rightPtr ), value );
else
cout << value << " dup" << endl;
}
template< class NODETYPE >
void Tree< NODETYPE >::preOrderTraversal() const
{ preOrderHelper( rootPtr ); }
template< class NODETYPE >
void Tree< NODETYPE >::preOrderHelper(
TreeNode< NODETYPE > *ptr ) const
{
if ( ptr != 0 ) {
cout << ptr->data <<" ";
preOrderHelper( ptr->leftPtr );
preOrderHelper( ptr->rightPtr );
}
}
template< class NODETYPE >
void Tree< NODETYPE >::inOrderTraversal() const
{ inOrderHelper( rootPtr ); }
template< class NODETYPE >
void Tree< NODETYPE >::inOrderHelper(
TreeNode< NODETYPE > *ptr ) const
{
if ( ptr != 0 ) {
inOrderHelper( ptr->leftPtr );
cout << ptr->data << " ";
inOrderHelper( ptr->rightPtr );
}
}
template< class NODETYPE >
void Tree< NODETYPE >::postOrderTraversal() const
{ postOrderHelper( rootPtr ); }
template< class NODETYPE >
void Tree< NODETYPE >::postOrderHelper(
TreeNode< NODETYPE > *ptr ) const
{
if ( ptr != 0 ) {
postOrderHelper( ptr->leftPtr );
postOrderHelper( ptr->rightPtr );
cout << ptr->data <<" " ;
}
}
#endif
#ifndef TREENODE_H
#define TREENODE_H
template< class NODETYPE > class Tree; // forward declaration
template< class NODETYPE >
class TreeNode {
friend class Tree< NODETYPE >;
public:
TreeNode( const NODETYPE &d )
: leftPtr( 0 ), data( d ), rightPtr( 0 ) { }
NODETYPE getData() const { return data; }
private:
TreeNode< NODETYPE > *leftPtr; // pointer to left subtree
NODETYPE data;
TreeNode< NODETYPE > *rightPtr; // pointer to right subtree
};
#endif
int main()
{
int scelta,x,i;
cout<<"\nChe tipo di dato vuoi inserire? "<<endl<<"1->Intero "<<endl<<"2->Reale "
<<endl<<"3->Carattere "<<endl<<"Scelta: ";
cin>>scelta;
switch(scelta) {
case '1':
Tree< int > intTree;
int intVal,x,i;
cout<<" \nQuanti valori vuoi inserire? ";
cin>>x;
cout << "\nInserire valori interi:"<<endl;
for( i = 0; i < x; i++ ) {
cin >> intVal;
intTree.insertNode( intVal );
}
cout << "\nVisita pre-ordine:\t";
intTree.preOrderTraversal();
cout << "\nVisita in-ordine:\t";
intTree.inOrderTraversal();
cout << "\nVisita post-ordine:\t";
intTree.postOrderTraversal();
break;
case '2':
Tree< double > doubleTree;
double doubleVal;
cout<<" \nQuanti valori vuoi inserire? ";
cin>>x;
cout << "\n\n\nInserire valori reali:"<<endl
<< setiosflags( ios::fixed | ios::showpoint )
<< setprecision( 1 );
for ( i = 0; i < x; i++ ) {
cin >> doubleVal;
doubleTree.insertNode( doubleVal );
}
cout << "\nVisita pre-ordine\t";
doubleTree.preOrderTraversal();
cout << "\nVisita in-ordine\t";
doubleTree.inOrderTraversal();
cout << "\nVisita post-ordine\t";
doubleTree.postOrderTraversal();
cout<<endl<<endl<<endl;
break;
case '3':
Tree< char > charTree;
char charVal;
cout<<" \nQuanti valori vuoi inserire? ";
cin>>x;
cout << "\n\n\nInserire caratteri:"<<endl;
for ( i = 0; i < x; i++ ) {
cin >> charVal;
charTree.insertNode(charVal );
}
cout << "\nVisita pre-ordine\t";
charTree.preOrderTraversal();
cout << "\nVisita in-ordine\t";
charTree.inOrderTraversal();
cout << "\nVisita post-ordine\t";
charTree.postOrderTraversal();
cout<<endl<<endl<<endl;
break;
default:
cout<<"Scelta incorretta, prego ripetere.";
break;
}
system("pause");
return 0;
}
// Fig. 4.16: fig4_16.cpp
// Driver to test class Tree
#include <iostream>
#include <iomanip>
using namespace std;
using std::cout;
using std::cin;
using std::setiosflags;
using std::ios;
using std::setprecision;
#ifndef TREE_H
#define TREE_H
#include "treenode.h"
using std::endl;
template< class NODETYPE >
class Tree {
public:
Tree();
void insertNode( const NODETYPE & );
void preOrderTraversal() const;
void inOrderTraversal() const;
void postOrderTraversal() const;
private:
TreeNode< NODETYPE > *rootPtr;
// utility functions
void insertNodeHelper(
TreeNode< NODETYPE > **, const NODETYPE & );
void preOrderHelper( TreeNode< NODETYPE > * ) const;
void inOrderHelper( TreeNode< NODETYPE > * ) const;
void postOrderHelper( TreeNode< NODETYPE > * ) const;
};
template< class NODETYPE >
Tree< NODETYPE >::Tree() { rootPtr = 0; }
template< class NODETYPE >
void Tree< NODETYPE >::insertNode( const NODETYPE &value )
{ insertNodeHelper( &rootPtr, value ); }
// This function receives a pointer to a pointer so the
// pointer can be modified.
template< class NODETYPE >
void Tree< NODETYPE >::insertNodeHelper(
TreeNode< NODETYPE > **ptr, const NODETYPE &value )
{
if ( *ptr == 0 ) { // tree is empty
*ptr = new TreeNode< NODETYPE >( value );
assert( *ptr != 0 );
}
else // tree is not empty
if ( value < ( *ptr )->data )
insertNodeHelper( &( ( *ptr )->leftPtr ), value );
else
if ( value > ( *ptr )->data )
insertNodeHelper( &( ( *ptr )->rightPtr ), value );
else
cout << value << " dup" << endl;
}
template< class NODETYPE >
void Tree< NODETYPE >::preOrderTraversal() const
{ preOrderHelper( rootPtr ); }
template< class NODETYPE >
void Tree< NODETYPE >::preOrderHelper(
TreeNode< NODETYPE > *ptr ) const
{
if ( ptr != 0 ) {
cout << ptr->data <<" ";
preOrderHelper( ptr->leftPtr );
preOrderHelper( ptr->rightPtr );
}
}
template< class NODETYPE >
void Tree< NODETYPE >::inOrderTraversal() const
{ inOrderHelper( rootPtr ); }
template< class NODETYPE >
void Tree< NODETYPE >::inOrderHelper(
TreeNode< NODETYPE > *ptr ) const
{
if ( ptr != 0 ) {
inOrderHelper( ptr->leftPtr );
cout << ptr->data << " ";
inOrderHelper( ptr->rightPtr );
}
}
template< class NODETYPE >
void Tree< NODETYPE >::postOrderTraversal() const
{ postOrderHelper( rootPtr ); }
template< class NODETYPE >
void Tree< NODETYPE >::postOrderHelper(
TreeNode< NODETYPE > *ptr ) const
{
if ( ptr != 0 ) {
postOrderHelper( ptr->leftPtr );
postOrderHelper( ptr->rightPtr );
cout << ptr->data <<" " ;
}
}
#endif
#ifndef TREENODE_H
#define TREENODE_H
template< class NODETYPE > class Tree; // forward declaration
template< class NODETYPE >
class TreeNode {
friend class Tree< NODETYPE >;
public:
TreeNode( const NODETYPE &d )
: leftPtr( 0 ), data( d ), rightPtr( 0 ) { }
NODETYPE getData() const { return data; }
private:
TreeNode< NODETYPE > *leftPtr; // pointer to left subtree
NODETYPE data;
TreeNode< NODETYPE > *rightPtr; // pointer to right subtree
};
#endif
int main()
{
int scelta,x,i;
cout<<"\nChe tipo di dato vuoi inserire? "<<endl<<"1->Intero "<<endl<<"2->Reale "
<<endl<<"3->Carattere "<<endl<<"Scelta: ";
cin>>scelta;
switch(scelta) {
case '1':
Tree< int > intTree;
int intVal,x,i;
cout<<" \nQuanti valori vuoi inserire? ";
cin>>x;
cout << "\nInserire valori interi:"<<endl;
for( i = 0; i < x; i++ ) {
cin >> intVal;
intTree.insertNode( intVal );
}
cout << "\nVisita pre-ordine:\t";
intTree.preOrderTraversal();
cout << "\nVisita in-ordine:\t";
intTree.inOrderTraversal();
cout << "\nVisita post-ordine:\t";
intTree.postOrderTraversal();
break;
case '2':
Tree< double > doubleTree;
double doubleVal;
cout<<" \nQuanti valori vuoi inserire? ";
cin>>x;
cout << "\n\n\nInserire valori reali:"<<endl
<< setiosflags( ios::fixed | ios::showpoint )
<< setprecision( 1 );
for ( i = 0; i < x; i++ ) {
cin >> doubleVal;
doubleTree.insertNode( doubleVal );
}
cout << "\nVisita pre-ordine\t";
doubleTree.preOrderTraversal();
cout << "\nVisita in-ordine\t";
doubleTree.inOrderTraversal();
cout << "\nVisita post-ordine\t";
doubleTree.postOrderTraversal();
cout<<endl<<endl<<endl;
break;
case '3':
Tree< char > charTree;
char charVal;
cout<<" \nQuanti valori vuoi inserire? ";
cin>>x;
cout << "\n\n\nInserire caratteri:"<<endl;
for ( i = 0; i < x; i++ ) {
cin >> charVal;
charTree.insertNode(charVal );
}
cout << "\nVisita pre-ordine\t";
charTree.preOrderTraversal();
cout << "\nVisita in-ordine\t";
charTree.inOrderTraversal();
cout << "\nVisita post-ordine\t";
charTree.postOrderTraversal();
cout<<endl<<endl<<endl;
break;
default:
cout<<"Scelta incorretta, prego ripetere.";
break;
}
system("pause");
return 0;
}