So we were giving an assignment to write a SplitList function using an array based unsorted list and pointer based unsorted list. My problem is with the pointer based code. When I run the code (using the command prompt) it stops at SplitList command and a window pops up saying temp.exe has stopped working. I've asked the teacher and the TA and neither of them know what is wrong. Here is the code:
ItemType.h
ItemType.cpp
UnsortedType.h
UnsortedType.cpp
listDriver.cpp
Input File listData
Thanks in advance for any and all help.
ItemType.h
#include <fstream> const int MAX_ITEMS = 5; enum RelationType {LESS, GREATER, EQUAL}; class ItemType { public: ItemType(); RelationType ComparedTo(ItemType) const; void Print(std::ostream&) const; void Initialize(int number); private: int value; };
ItemType.cpp
#include <fstream> #include <iostream> #include "ItemType.h" ItemType::ItemType() { value = 0; } RelationType ItemType::ComparedTo(ItemType otherItem) const { if (value < otherItem.value) return LESS; else if (value > otherItem.value) return GREATER; else return EQUAL; } void ItemType::Initialize(int number) { value = number; } void ItemType::Print(std::ostream& out) const // pre: out has been opened. // post: value has been sent to the stream out. { out << value; }
UnsortedType.h
struct NodeType; class UnsortedType { public: UnsortedType(); // Constructor ~UnsortedType(); // Destructor void MakeEmpty(); // Function: Returns the list to the empty state. // Post: List is empty. bool IsFull() const; // Function: Determines whether list is full. // Pre: List has been initialized. // Post: Function value = (list is full) int GetLength() const; // Function: Determines the number of elements in list. // Pre: List has been initialized. // Post: Function value = number of elements in list ItemType GetItem(ItemType& item, bool& found); // Function: Retrieves list element whose key matches item's key (if // present). // Pre: List has been initialized. // Key member of item is initialized. // Post: If there is an element someItem whose key matches // item's key, then found = true and someItem is returned; // otherwise found = false and item is returned. // List is unchanged. void PutItem(ItemType item); // Function: Adds item to list. // Pre: List has been initialized. // List is not full. // item is not in list. // Post: item is in list. void DeleteItem(ItemType item); // Function: Deletes the element whose key matches item's key. // Pre: List has been initialized. // Key member of item is initialized. // One and only one element in list has a key matching item's key. // Post: No element in list has a key matching item's key. void ResetList(); // Function: Initializes current position for an iteration through the list. // Pre: List has been initialized. // Post: Current position is prior to list. ItemType GetNextItem(); // Function: Gets the next element in list. // Pre: List has been initialized and has not been changed since last call. // Current position is defined. // Element at current position is not last in list. // // Post: Current position is updated to next position. // item is a copy of element at current position. void SplitLists(ItemType item, UnsortedType& list1, UnsortedType& list2); // Function: Divides list into two lists according to the key of item. // Pre: list has been initialized and is not empty. // Post: list1 contains all the items of list whose keys are less than // or equal to item's key; list2 contains all the items of list // whose keys are greater than item's key. private: NodeType* listData; int length; NodeType* currentPos; };
UnsortedType.cpp
#include "UnsortedType.h" struct NodeType { ItemType info; NodeType* next; }; UnsortedType::UnsortedType() // Class constructor { length = 0; listData = NULL; } bool UnsortedType::IsFull() const // Returns true if there is no room for another ItemType // on the free store; false otherwise. { NodeType* location; try { location = new NodeType; delete location; return false; } catch(std::bad_alloc exception) { return true; } } int UnsortedType::GetLength() const // Post: Number of items in the list is returned. { return length; } void UnsortedType::MakeEmpty() // Post: List is empty; all items have been deallocated. { NodeType* tempPtr; while (listData != NULL) { tempPtr = listData; listData = listData->next; delete tempPtr; } length = 0; } void UnsortedType::PutItem(ItemType item) // item is in the list; length has been incremented. { NodeType* location; // Declare a pointer to a node location = new NodeType; // Get a new node location->info = item; // Store the item in the node location->next = listData; // Store address of first node // in next field of new node listData = location; // Store address of new node into // external pointer length++; // Increment length of the list } ItemType UnsortedType::GetItem(ItemType& item, bool& found) // Pre: Key member(s) of item is initialized. // Post: If found, item's key matches an element's key in the // list and a copy of that element has been stored in item; // otherwise, item is unchanged. { bool moreToSearch; NodeType* location; location = listData; found = false; moreToSearch = (location != NULL); while (moreToSearch && !found) { switch (item.ComparedTo(location->info)) { case LESS : case GREATER : location = location->next; moreToSearch = (location != NULL); break; case EQUAL : found = true; item = location->info; break; } } return item; } void UnsortedType::DeleteItem(ItemType item) // Pre: item's key has been initialized. // An element in the list has a key that matches item's. // Post: No element in the list has a key that matches item's. { NodeType* location = listData; NodeType* tempLocation = NULL; // Locate node to be deleted. if (item.ComparedTo(listData->info) == EQUAL) { tempLocation = location; listData = listData->next; // Delete first node. } else { while (item.ComparedTo((location->next)->info) != EQUAL) location = location->next; // Delete node at location->next tempLocation = location->next; location->next = (location->next)->next; } delete tempLocation; length--; } void UnsortedType::ResetList() // Post: Current position has been initialized. { currentPos = NULL; } ItemType UnsortedType::GetNextItem() // Post: A copy of the next item in the list is returned. // When the end of the list is reached, currentPos // is reset to begin again. { ItemType item; if (currentPos == NULL) currentPos = listData; else currentPos = currentPos->next; item = currentPos->info; return item; } // This is the only function not given to us void UnsortedType::SplitLists(ItemType item, UnsortedType& list1, UnsortedType& list2) // Pre: // Post: { int length = GetLength(); list1.MakeEmpty(); list2.MakeEmpty(); ResetList(); for (int index = 0; index <= length; index++) { ItemType temp = GetNextItem(); if (temp.ComparedTo(item) == EQUAL || temp.ComparedTo(item) == LESS) { list1.PutItem(temp); } else if (temp.ComparedTo(item) == GREATER) { list2.PutItem(temp); } } } UnsortedType::~UnsortedType() // Post: List is empty; all items have been deallocated. { NodeType* tempPtr; while (listData != NULL) { tempPtr = listData; listData = listData->next; delete tempPtr; } }
listDriver.cpp
#include <iostream> #include <fstream> #include <string> #include <cctype> #include <cstring> #include <cstdlib> #include "UnsortedType.h" using namespace std; void PrintList(ofstream& outFile, UnsortedType& list); int main() { ifstream inFile; // file containing operations ofstream outFile; // file containing output string inFileName; // input file external name string outFileName; // output file external name string outputLabel; string command; // operation to be executed int number; ItemType item; UnsortedType list, list1, list2; bool found; int numCommands; // Prompt for file names, read file names, and prepare files cout << "Enter name of input command file; press return." << endl; cin >> inFileName; inFile.open(inFileName.c_str()); cout << "Enter name of output file; press return." << endl; cin >> outFileName; outFile.open(outFileName.c_str()); cout << "Enter name of test run; press return." << endl; cin >> outputLabel; outFile << outputLabel << endl; if (!inFile) { cout << "File not found." << endl; exit(2); } inFile >> command; numCommands = 0; while (command != "Quit") { cout << command; if (command == "PutItem") { inFile >> number; item.Initialize(number); list.PutItem(item); item.Print(outFile); outFile << " is in list." << endl; } else if (command == "DeleteItem") { inFile >> number; item.Initialize(number); list.DeleteItem(item); item.Print(outFile); outFile << " is deleted." << endl; } else if (command == "GetItem") { inFile >> number; item.Initialize(number); item = list.GetItem(item, found); if (found) outFile << number << " found in list." << endl; else outFile << number << " not in list." << endl; } else if (command == "GetLength") outFile << "Length is " << list.GetLength() << endl; else if (command == "IsFull") if (list.IsFull()) outFile << "List is full." << endl; else outFile << "List is not full." << endl; else if (command == "MakeEmpty") list.MakeEmpty(); else if (command == "PrintList") PrintList(outFile, list); else if (command == "SplitLists") { inFile >> number; item.Initialize(number); list.SplitLists(item, list1, list2); PrintList(outFile, list1); PrintList(outFile, list2); } else cout << " Command not recognized." << endl; numCommands++; cout << " Command number " << numCommands << " completed." << endl; inFile >> command; } cout << "Quit" << endl << "Testing completed." << endl; inFile.close(); outFile.close(); return 0; } void PrintList(ofstream& dataFile, UnsortedType& list) // Pre: list has been initialized. // dataFile is open for writing. // Post: Each component in list has been written to dataFile. // dataFile is still open. { int length; ItemType item; dataFile << "PrintList" << endl; list.ResetList(); length = list.GetLength(); if (length == 0) dataFile << "List is empty."; else for (int counter = 1; counter <= length; counter++) { item = list.GetNextItem(); item.Print(dataFile); } dataFile << endl; }
Input File listData
GetLength PutItem 5 PutItem 7 PutItem 6 PutItem 9 PrintList PutItem 1 SplitLists 6 PrintList GetItem 4 GetItem 5 GetItem 9 GetItem 10 IsFull DeleteItem 5 IsFull DeleteItem 1 DeleteItem 6 DeleteItem 9 PrintList MakeEmpty PrintList Error Quit
Thanks in advance for any and all help.