Question: improve the insert() function. Currently, if you try to add an item to a full list, insert() returns false and does not add the item.
improve the insert() function. Currently, if you try to add an item to a full list, insert() returns false and does not add the item. Improve this so that it dynamically allocates more memory to the list to make room for the new item using the new operator. You can add another CHUNK_SIZE amount of memory, or any other amount of memory you think makes sense. Don't forget to deallocate any existing memory, e.g. using delete [].
#include#include #include using namespace std; template class List { private: static const int CHUNK_SIZE=100; ItemType *list; int numItems; int maxItems; public: // default constructor and destructor List() { numItems = 0; maxItems = CHUNK_SIZE; list = new ItemType[CHUNK_SIZE]; } ~List() { delete [] list; } // list member functions bool isEmpty() const { return numItems==0; } int getLength() const { return numItems; } bool insert(int pos, const ItemType& item); bool remove(int pos); // clear the list // clear can simply set numItems to zero. The array list may still contain // items already inserted into the list, but since numItems is zero, there // isn't any way to get at them using getEntry() or setEntry() void clear() { numItems = 0; } // return entry at postion pos // throw invalid_argument if pos<1 or pos>getLength() ItemType getEntry(int pos) const; // set entry at postion pos to item // throw invalid_argument if pos<1 or pos>getLength() void setEntry(int pos, const ItemType& item); }; template bool List ::insert(int pos, const ItemType& item) { bool canAdd; canAdd = ((pos > 0) && (pos <= numItems + 1) && (numItems < maxItems)); if (canAdd) { // first, we have to move everything after our insertion point over one // position to make room for our new item. start at the back of the list. // don't forget arrays start at postion zero and our list ADT starts at // position 1. for(int i=numItems; i>=pos; i--) list[i] = list[i-1]; // now put our item at position pos-1 list[pos-1] = item; numItems++; } return canAdd; } template ItemType List ::getEntry(int pos) const { if(pos<1 || pos>getLength()) { throw invalid_argument("ERROR: getEntry() using invalid position"); } return list[pos-1]; } // TODO: add implementations for setEntry() and remove() functions // setEntry template void List ::setEntry(int pos, const ItemType& item) { if (pos < 1 or pos > getLength()) { throw invalid_argument("ERROR: setEntry() using invalid position"); } list[pos-1]=item; } // Remove method template bool List ::remove(int pos) { if(pos<1 || pos>getLength()) { throw invalid_argument("ERROR: getEntry() using invalid position"); } for(int i=pos-1; i > trackNumber)) { cout << "Please enter numbers only. "; cin.clear(); cin.ignore(10000,' '); inputCheck = false; } } while (!inputCheck); return trackNumber; } int main() { List songs; char goAgain = 'y'; int trackNumber; string trackName; // Insert some songs into our list songs.insert(1, "One More Saturday Night"); songs.insert(1, "Friday I'm in Love"); songs.insert(3, "Sunday Morning Coming Down"); songs.insert(1, "California Love"); songs.setEntry(1,"America song"); songs.remove(2); cout << "Welcome! There are " << songs.getLength() << " tracks. "; while (goAgain!='n') { trackNumber = getTrack(); try { trackName = songs.getEntry(trackNumber); } catch (invalid_argument arg) { cout << arg.what() << endl; trackName = "No Track"; } cout << "Your track name is " << trackName << endl; cout << "Go again? (y/n) "; cin >> goAgain; } cout << "Rock on! "; return 0; }
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
