Use C++ for the following: - implement the ListArray ADT [the declaration is given in ListArray.h] - implement the following operations: - constructor, assignment operator, destructor - insert, remove, replace, clear - isFull, isEmpty - gotoBeginning, gotoEnd, gotoNext, gotoPrior, getCursor - implement the member function moveToNth(...) that removes the item marked by the cursor and inserts it as the nth element of the list; test you implementation by turning the flag LAB3_TEST2 from 0 to 1 in config.h; - implement the ListArray member function find(...) that searches for the element given as a parameter; the search starts at the cursor and stops when it finds the element or at the end of the list; the cursor remains on the last position searched; test you implementation by turning the flag LAB3_TEST3 from 0 to 1 in config.h;
*********ListArray.h************
//-------------------------------------------------------------------- // // Laboratory 3 ListArray.h // **Instructor's Solution** // Class declaration for the array implementation of the List ADT // //-------------------------------------------------------------------- #ifndef LISTARRAY_H #define LISTARRAY_H #include #include using namespace std; #pragma warning( disable : 4290 ) template < typename DataType > class List { public: static const int MAX_LIST_SIZE = 10; // Default maximum list size // Constructors List ( int maxNumber = MAX_LIST_SIZE ); // Default constructor List ( const List& source ); // Copy constructor // Overloaded assignment operator List& operator= ( const List& source ); // Destructor virtual ~List (); // List manipulation operations virtual void insert ( const DataType& newDataItem ) // Insert after cursor throw ( logic_error ); void remove () throw ( logic_error ); // Remove data item virtual void replace ( const DataType& newDataItem ) // Replace data item throw ( logic_error ); void clear (); // Clear list // List status operations bool isEmpty () const; // List is empty bool isFull () const; // List is full // List iteration operations void gotoBeginning () // Go to beginning throw ( logic_error ); void gotoEnd () // Go to end throw ( logic_error ); bool gotoNext () // Go to next data item throw ( logic_error ); bool gotoPrior () // Go to prior data item throw ( logic_error ); DataType getCursor () const throw ( logic_error ); // Return data item // Output the list structure -- used in testing/debugging virtual void showStructure () const; // In-lab operations void moveToNth ( int n ) // Move data item to pos. n throw ( logic_error ); bool find ( const DataType& searchDataItem ) // Find data item throw ( logic_error ); protected: // Data members int maxSize, size, // Actual number of data item in the list cursor; // Cursor array index DataType *dataItems; // Array containing the list data item }; #endif
************config.h***********************
/** * List class (Lab 3/Lab 4) configuration file. * Activate test #N by defining the corresponding LAB3_TESTN to have the value 1. * * Because you will copy the List class code to your ordered list directory, having * two "config.h" files presented the risk of accidentally replacing the one in the * ordered list directory. So the two configuration files are combined for labs 3 and 4. * * NOTE!!! There was an error in the printed book. TEST1 shows up twice in the book. * The basic List implementation uses TEST1 as described below, then exercise 2 * is activated by TEST2 */ #define LAB3_TEST1 0 // 0 => test with char, 1 => test with int #define LAB3_TEST2 0 // Prog exercise 2: moveToNth #define LAB3_TEST3 0 // Prog exercise 3: find /** * Ordered list class tests. */ #define LAB4_TEST1 0 // merge: programming exercise 2 #define LAB4_TEST2 0 // subset: programming exercise 3
**********ListArray.cpp********
#include "ListArray.h" template < typename DataType > List::List ( int maxNumber ) { } template < typename DataType > List::List ( const List& source ) { } template < typename DataType > List& List::operator= ( const List& source ) { return *this; } template < typename DataType > List::~List () { } template < typename DataType > void List::insert ( const DataType& newDataItem ) throw ( logic_error ) { } template < typename DataType > void List::remove () throw ( logic_error ) { } template < typename DataType > void List::replace ( const DataType& newDataItem ) throw ( logic_error ) { } template < typename DataType > void List::clear () { } template < typename DataType > bool List::isEmpty () const { return false; } template < typename DataType > bool List::isFull () const { return false; } template < typename DataType > void List::gotoBeginning () throw ( logic_error ) { } template < typename DataType > void List::gotoEnd () throw ( logic_error ) { } template < typename DataType > bool List::gotoNext () throw ( logic_error ) { return false; } template < typename DataType > bool List::gotoPrior () throw ( logic_error ) { return false; } template < typename DataType > DataType List::getCursor () const throw ( logic_error ) { DataType t; return t; } #include "show3.cpp" template < typename DataType > void List::moveToNth ( int n ) throw ( logic_error ) { } template < typename DataType > bool List::find ( const DataType& searchDataItem ) throw ( logic_error ) { return false; }
**************show3.cpp*************
//-------------------------------------------------------------------- // // Laboratory 3 show3.cpp // // Array implementation of the showStructure operation for the // List ADT // //-------------------------------------------------------------------- #include "ListArray.h" template void List:: showStructure () const // outputs the data items in a list. if the list is empty, outputs // "empty list". this operation is intended for testing/debugging // purposes only. { int j; // loop counter if ( size == 0 ) cout << "empty list" << endl; // The Ordered List code blows up below. Since this is just debugging // code, we check for whether the OrderedList is defined, and if so, // print out the key value. If not, we try printing out the entire item. // Note: This assumes that you have used the double-inclusion protection // in your OrderedList.cpp file by doing a "#ifndef ORDEREDLIST_CPP", etc. // If not, you will need to comment out the code in the section under // the "else", otherwise the compiler will go crazy in lab 4. // The alternative is to overload operator<< for all data types used in // the ordered list. else { cout << "size = " << size << " cursor = " << cursor << endl; for ( j = 0 ; j < maxSize ; j++ ) cout << j << "\t"; cout << endl; for ( j = 0 ; j < size ; j++ ) { if( j == cursor ) { cout << "["; cout << dataItems[j] #ifdef ORDEREDLIST_CPP .getKey() #endif ; cout << "]"; cout << "\t"; } else cout << dataItems[j] #ifdef ORDEREDLIST_CPP .getKey() #endif << "\t"; } cout << endl; } }
***************test3.cpp************
//-------------------------------------------------------------------- // // Laboratory 3 test3.cpp // // Test program for the operations in the List ADT // //-------------------------------------------------------------------- #include using namespace std; // Because of C++ template implementations, must include source for templated class // That is ugly, but it is required. #include "ListArray.cpp" #include "config.h" void print_help(); void showTwoLists(List list1, List list2); // Displays two lists that are supposedly equivalent. int main() { // hack: put a "try/catch" with list creation code? // we need to demonstrate use of the try/catch syntax. #if LAB3_TEST1 List testList(8); // Test list to test with ints List copyList(testList); // Used to test copy constructor List assignList; // Used to test assignment operator int testData; // List data item #else List testList(8); // Test list to test with chars List copyList(testList); // Used to test copy constructor List assignList; // Used to test assignment operator char testData; // List data item #endif int n; // Position within list char cmd; // Input command print_help(); do { testList.showStructure(); // Output list cout << endl << "Command: "; // Read command cin >> cmd; if ( cmd == '+' || cmd == '=' || cmd == '?' ) cin >> testData; else if ( cmd == 'M' || cmd == 'm' ) cin >> n; switch ( cmd ) { case 'H' : case 'h': print_help(); break; case '+' : // insert cout << "Insert " << testData << endl; try { testList.insert(testData); } catch (logic_error &e) { cerr << "EXCEPTION: A logic error occurred in the insert function."; } break; case '-' : // remove cout << "Remove the data item marked by the cursor" << endl; try { testList.remove(); } catch (logic_error &e) { cerr << "EXCEPTION: A logic error occurred in the remove function."; } break; case '=' : // replace cout << "Replace the data item marked by the cursor " << "with " << testData << endl; try { testList.replace(testData); } catch (logic_error &e) { cerr << "EXCEPTION: A logic error occurred in the replace function."; } break; case '@' : // getCursor try { cout << "Data item marked by the cursor is " << testList.getCursor() << endl; } catch (logic_error &e) { cerr << "EXCEPTION: A logic error occurred in the getCursor function."; } break; case '<' : // gotoBeginning cout << "Go to the beginning of the list" << endl; try { testList.gotoBeginning(); } catch (logic_error &e) { cerr << "EXCEPTION: A logic error occurred in the gotoBeginning function."; } break; case '>' : // gotoEnd cout << "Go to the end of the list" << endl; try { testList.gotoEnd(); } catch (logic_error &e) { cerr << "EXCEPTION: A logic error occurred in the gotoEnd function."; } break; case 'N' : case 'n' : // gotoNext try { if ( testList.gotoNext() ) cout << "Go to the next data item" << endl; else cout << "Failed -- either at the end of the list " << "or the list is empty" << endl; } catch (logic_error &e) { cerr << "EXCEPTION: A logic error occurred in the gotoNext function."; } break; case 'P' : case 'p' : // gotoPrior try { if ( testList.gotoPrior() ) cout << "Go to the prior data item" << endl; else cout << "Failed -- either at the beginning of the " << "list or the list is empty" << endl; } catch (logic_error &e) { cerr << "EXCEPTION: A logic error occurred in the gotoPrior function."; } break; case 'C' : case 'c' : // clear cout << "Clear the list" << endl; testList.clear(); break; case 'E' : case 'e' : // isEmpty if ( testList.isEmpty() ) cout << "List is empty" << endl; else cout << "List is NOT empty" << endl; break; case 'F' : case 'f' : // isFull if ( testList.isFull() ) cout << "List is full" << endl; else cout << "List is NOT full" << endl; break; case '!' : showTwoLists(copyList, testList); break; case '#' : assignList.insert('x'); assignList = testList; showTwoLists(assignList, testList); break; #if LAB3_TEST2 case 'M' : case 'm' : // In-lab Exercise 2 cout << "Move the data item marked by the cursor to " << "posititon " << n << endl; try { testList.moveToNth(n); } catch (logic_error &e) { cerr << "EXCEPTION: A logic error occurred in the moveToNth function."; } break; #endif // LAB3_TEST1 #if LAB3_TEST3 case '?' : // In-lab Exercise 3 try { if ( testList.find(testData) ) cout << "Found" << endl; else cout << "NOT found" << endl; } catch (logic_error &e) { cerr << "EXCEPTION: A logic error occurred in the find function."; } break; #endif // LAB3_TEST3 case 'Q' : case 'q' : // Quit test program break; default : // Invalid command cout << "Inactive or invalid command" << endl; } } while ( cin && cmd != 'Q' && cmd != 'q' ); if( !cin ) { cout << "Input error" << endl; } return 0; } void showTwoLists(List list1, List list2) { // Variables should match, but dynamic memory buffer must be different cout << "Look at the two lists below and decide whether they are equivalent" << endl; cout << "List 1: "; list1.showStructure(); cout << "List 2: "; list2.showStructure(); cout << endl; } void print_help() { cout << endl << "Commands:" << endl; cout << " H : Help (displays this message)" << endl; cout << " +x : Insert x after the cursor" << endl; cout << " - : Remove the data item marked by the cursor" << endl; cout << " =x : Replace the data item marked by the cursor with x" << endl; cout << " @ : Display the data item marked by the cursor" << endl; cout << " < : Go to the beginning of the list" << endl; cout << " > : Go to the end of the list" << endl; cout << " N : Go to the next data item" << endl; cout << " P : Go to the prior data item" << endl; cout << " C : Clear the list" << endl; cout << " E : Empty list?" << endl; cout << " F : Full list?" << endl; cout << " ! : Test copy constructor" << endl; cout << " # : Test assignment operator" << endl; cout << " M n : Move data item marked by cursor to pos. n (" #if LAB3_TEST2 << "Active " #else << "Inactive " #endif // LAB3_TEST2 << ": In-lab Ex. 2)" << endl; cout << " ?x : Search rest of list for x (" #if LAB3_TEST3 << "Active " #else << "Inactive " #endif // LAB3_TEST3 << ": In-lab Ex. 3)" << endl; cout << " Q : Quit the test program" << endl; cout << endl; }