mirror of https://github.com/xfarrow/lasd.git
parent
2e4f7c3de8
commit
33106bcee2
|
@ -35,12 +35,12 @@ bool BinaryTreeLnk<Data>::NodeLnk::HasRightChild() const noexcept{
|
|||
}
|
||||
|
||||
template <typename Data>
|
||||
struct BinaryTree<Data>::Node& BinaryTreeLnk<Data>::NodeLnk::LeftChild() const{
|
||||
struct BinaryTreeLnk<Data>::NodeLnk& BinaryTreeLnk<Data>::NodeLnk::LeftChild() const{
|
||||
return *left;
|
||||
}
|
||||
|
||||
template <typename Data>
|
||||
struct BinaryTree<Data>::Node& BinaryTreeLnk<Data>::NodeLnk::RightChild() const{
|
||||
struct BinaryTreeLnk<Data>::NodeLnk& BinaryTreeLnk<Data>::NodeLnk::RightChild() const{
|
||||
return *right;
|
||||
}
|
||||
|
||||
|
|
|
@ -25,8 +25,8 @@ protected:
|
|||
bool HasLeftChild() const noexcept override; // (concrete function should not throw exceptions)
|
||||
bool HasRightChild() const noexcept override; // (concrete function should not throw exceptions)
|
||||
|
||||
struct BinaryTree<Data>::Node& LeftChild() const override; // (concrete function must throw std::out_of_range when not existent)
|
||||
struct BinaryTree<Data>::Node& RightChild() const override; // (concrete function must throw std::out_of_range when not existent)
|
||||
struct NodeLnk& LeftChild() const override; // (concrete function must throw std::out_of_range when not existent)
|
||||
struct NodeLnk& RightChild() const override; // (concrete function must throw std::out_of_range when not existent)
|
||||
|
||||
friend class BinaryTreeLnk<Data>;
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ bool BinaryTreeVec<Data>::NodeVec::HasRightChild() const noexcept{
|
|||
}
|
||||
|
||||
template <typename Data>
|
||||
struct BinaryTree<Data>::Node& BinaryTreeVec<Data>::NodeVec::LeftChild() const{
|
||||
struct BinaryTreeVec<Data>::NodeVec& BinaryTreeVec<Data>::NodeVec::LeftChild() const{
|
||||
if(index*2+1 < ReferenceToTree->size)
|
||||
return *((ReferenceToTree->tree)[index*2+1]);
|
||||
else
|
||||
|
@ -58,7 +58,7 @@ struct BinaryTree<Data>::Node& BinaryTreeVec<Data>::NodeVec::LeftChild() const{
|
|||
}
|
||||
|
||||
template <typename Data>
|
||||
struct BinaryTree<Data>::Node& BinaryTreeVec<Data>::NodeVec::RightChild() const{
|
||||
struct BinaryTreeVec<Data>::NodeVec& BinaryTreeVec<Data>::NodeVec::RightChild() const{
|
||||
if(index*2+2 < ReferenceToTree->size)
|
||||
return *((ReferenceToTree->tree)[index*2+2]);
|
||||
else
|
||||
|
|
|
@ -26,8 +26,8 @@ protected:
|
|||
bool IsLeaf() const noexcept override; // (concrete function should not throw exceptions)
|
||||
bool HasLeftChild() const noexcept override; // (concrete function should not throw exceptions)
|
||||
bool HasRightChild() const noexcept override; // (concrete function should not throw exceptions)
|
||||
struct BinaryTree<Data>::Node& LeftChild() const override; // (concrete function must throw std::out_of_range when not existent)
|
||||
struct BinaryTree<Data>::Node& RightChild() const override; // (concrete function must throw std::out_of_range when not existent)
|
||||
struct NodeVec& LeftChild() const override; // (concrete function must throw std::out_of_range when not existent)
|
||||
struct NodeVec& RightChild() const override; // (concrete function must throw std::out_of_range when not existent)
|
||||
|
||||
friend class BinaryTreeVec<Data>;
|
||||
};
|
||||
|
|
|
@ -15,8 +15,10 @@ void menu(){
|
|||
Implementation chosenImplementation;
|
||||
|
||||
do{
|
||||
std::cout<<std::endl;
|
||||
std::cout<<" 1. Use your tests (to be used by the professor)"<<std::endl;
|
||||
std::cout<<" 2. Use the library demo"<<std::endl;
|
||||
cout<<endl<<" -> ";
|
||||
std::cin>>std::ws;
|
||||
std::cin>>choice;
|
||||
}while(choice!=1 && choice!=2);
|
||||
|
@ -39,6 +41,7 @@ DataType ChooseDataType(){
|
|||
std::cout<<" 1. Integer"<<std::endl;
|
||||
std::cout<<" 2. Float"<<std::endl;
|
||||
std::cout<<" 3. String"<<std::endl;
|
||||
cout<<endl<<" -> ";
|
||||
std::cin>>std::ws;
|
||||
std::cin>>choice;
|
||||
}while(!(choice>0 && choice<4));
|
||||
|
@ -55,6 +58,7 @@ Implementation ChooseImplementation(){
|
|||
std::cout<<"\nChoose an implementation for the binary tree:"<<std::endl;
|
||||
std::cout<<" 1. Vector"<<std::endl;
|
||||
std::cout<<" 2. Pointers"<<std::endl;
|
||||
cout<<endl<<" -> ";
|
||||
std::cin>>std::ws;
|
||||
std::cin>>choice;
|
||||
}while(!(choice>0 && choice<3));
|
||||
|
@ -111,8 +115,10 @@ void IntegerFunctions(T& bt){
|
|||
std::cout<<" 2. Check exsistence of an element"<<std::endl;
|
||||
std::cout<<" 3. Product of integers less than 'n' "<<std::endl;
|
||||
std::cout<<" 4. Multiply each element by 3"<<std::endl;
|
||||
std::cout<<"5. Go back"<<std::endl;
|
||||
std::cout<<"6. Quit"<<std::endl;
|
||||
std::cout<<" 5. Iterate over the tree"<<std::endl;
|
||||
std::cout<<" 6. Go back"<<std::endl;
|
||||
std::cout<<" 7. Quit"<<std::endl;
|
||||
cout<<endl<<" -> ";
|
||||
std::cin>>std::ws;
|
||||
std::cin>>choice;
|
||||
std::cout<<std::endl;
|
||||
|
@ -130,10 +136,13 @@ void IntegerFunctions(T& bt){
|
|||
MultiplyByThree(bt);
|
||||
break;
|
||||
case 5:
|
||||
Iterators(bt);
|
||||
break;
|
||||
case 6:
|
||||
menu();
|
||||
break;
|
||||
}
|
||||
}while(choice!=5 && choice!=6);
|
||||
}while(choice!=6 && choice!=7);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
@ -146,8 +155,10 @@ void FloatFunctions(T& bt){
|
|||
std::cout<<" 2. Check exsistence of an element"<<std::endl;
|
||||
std::cout<<" 3. Sum of floats greater than 'n' "<<std::endl;
|
||||
std::cout<<" 4. Cube elements"<<std::endl;
|
||||
std::cout<<"5. Go back"<<std::endl;
|
||||
std::cout<<"6. Quit"<<std::endl;
|
||||
std::cout<<" 5. Iterate over the tree"<<std::endl;
|
||||
std::cout<<" 6. Go back"<<std::endl;
|
||||
std::cout<<" 7. Quit"<<std::endl;
|
||||
cout<<endl<<" -> ";
|
||||
std::cin>>std::ws;
|
||||
std::cin>>choice;
|
||||
std::cout<<std::endl;
|
||||
|
@ -165,10 +176,13 @@ void FloatFunctions(T& bt){
|
|||
CubeElements(bt);
|
||||
break;
|
||||
case 5:
|
||||
Iterators(bt);
|
||||
break;
|
||||
case 6:
|
||||
menu();
|
||||
break;
|
||||
}
|
||||
}while(choice!=5 && choice!=6);
|
||||
}while(choice!=6 && choice!=7);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
@ -181,8 +195,10 @@ void StringFunctions(T& bt){
|
|||
std::cout<<" 2. Check exsistence of an element"<<std::endl;
|
||||
std::cout<<" 3. Concatenate strings whose dimension is less or equal than 'n' "<<std::endl;
|
||||
std::cout<<" 4. Head concatenation of a string"<<std::endl;
|
||||
std::cout<<"5. Go back"<<std::endl;
|
||||
std::cout<<"6. Quit"<<std::endl;
|
||||
std::cout<<" 5. Iterate over the tree"<<std::endl;
|
||||
std::cout<<" 6. Go back"<<std::endl;
|
||||
std::cout<<" 7. Quit"<<std::endl;
|
||||
cout<<endl<<" -> ";
|
||||
std::cin>>std::ws;
|
||||
std::cin>>choice;
|
||||
std::cout<<std::endl;
|
||||
|
@ -200,10 +216,13 @@ void StringFunctions(T& bt){
|
|||
HeadConcat(bt);
|
||||
break;
|
||||
case 5:
|
||||
Iterators(bt);
|
||||
break;
|
||||
case 6:
|
||||
menu();
|
||||
break;
|
||||
}
|
||||
}while(choice!=5 && choice!=6);
|
||||
}while(choice!=6 && choice!=7);
|
||||
}
|
||||
|
||||
/* ----- integer functions ----- */
|
||||
|
@ -330,6 +349,73 @@ void PrintSingleElement(Data& data, void* _){
|
|||
std::cout << data << " ";
|
||||
}
|
||||
|
||||
template <template <typename...> class Tree, typename DTType>
|
||||
void Iterators(Tree<DTType>& tree){
|
||||
uint choice;
|
||||
cout<<endl<<"Choose a type of iterator:"<<endl;
|
||||
cout<<" 1. Pre order"<<endl;
|
||||
cout<<" 2. Post order"<<endl;
|
||||
cout<<" 3. In order"<<endl;
|
||||
cout<<" 4. Breadth order"<<endl;
|
||||
cout<<" Press any other key to go back"<<endl;
|
||||
cout<<endl<<" -> ";
|
||||
cin>>ws;
|
||||
cin>>choice;
|
||||
switch(choice){
|
||||
case 1:
|
||||
{
|
||||
BTPreOrderIterator<DTType> preitr(tree);
|
||||
NavigateWithIterator(preitr);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
BTPostOrderIterator<DTType> postitr(tree);
|
||||
NavigateWithIterator(postitr);
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
{
|
||||
BTInOrderIterator<DTType> initr(tree);
|
||||
NavigateWithIterator(initr);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
{
|
||||
BTBreadthIterator<DTType> breadthitr(tree);
|
||||
NavigateWithIterator(breadthitr);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
template <template <typename...> class Iter, typename ItrType>
|
||||
void NavigateWithIterator(Iter<ItrType>& itr){
|
||||
uint choice=0;
|
||||
ItrType element;
|
||||
|
||||
while(!itr.Terminated() && choice!=3){
|
||||
cout<<endl<<" *** Current position: "<<*itr<<" *** "<<endl<<endl;
|
||||
|
||||
cout<<" 1. Go ahead (++)\n";
|
||||
cout<<" 2. Edit the value\n";
|
||||
cout<<" 3. Go to main menu\n";
|
||||
cout<<endl<<" -> ";
|
||||
cin>>ws;
|
||||
cin>>choice;
|
||||
|
||||
if(choice == 1){
|
||||
++itr;
|
||||
}
|
||||
else if(choice == 2){
|
||||
cout<<"\n Overwrite with: ";
|
||||
cin>>ws;
|
||||
cin>>*itr;
|
||||
}
|
||||
}
|
||||
if(itr.Terminated()) cout<<"\n *** Iterator is terminated ***\n";
|
||||
}
|
||||
|
||||
template <template <typename...> class Tree, typename DTType>
|
||||
void CheckExistence(Tree<DTType>& tree){
|
||||
DTType elementToLookFor;
|
||||
|
|
|
@ -65,6 +65,12 @@ void PrintSingleElement(Data&, void*);
|
|||
template <template <typename...> class Tree, typename DTType>
|
||||
void CheckExistence(Tree<DTType>&);
|
||||
|
||||
template <template <typename...> class Tree, typename DTType>
|
||||
void Iterators(Tree<DTType>&);
|
||||
|
||||
template <template <typename...> class Iter, typename ItrType>
|
||||
void NavigateWithIterator(Iter<ItrType>&);
|
||||
|
||||
/* ----- Generator functions ----- */
|
||||
DataType ChooseDataType(); //choose data type
|
||||
Implementation ChooseImplementation();
|
||||
|
|
Loading…
Reference in New Issue