270 likes | 457 Views
Implementing a Sorted List as a Linked Structure. CS 308 – Data Structures. SortedList Class Specification. private: int length; NodeType<ItemType>* listData; NodeType<ItemType>* currentPos; };. template <class ItemType> struct NodeType; template<class ItemType>
E N D
Implementing a Sorted List as a Linked Structure CS 308 – Data Structures
SortedList Class Specification private: int length; NodeType<ItemType>* listData; NodeType<ItemType>* currentPos; }; template <class ItemType> struct NodeType; template<class ItemType> class SortedType { public: SortedType(); ~SortedType(); void MakeEmpty(); bool IsFull() const; int LengthIs() const; void RetrieveItem(ItemType&, bool&); void InsertItem(ItemType); void DeleteItem(ItemType); void ResetList(); bool IsLastItem() const; void GetNextItem(ItemType&);
Function RetrieveItem (cont.) template<class ItemType> void SortedType<ItemType>::RetrieveItem(ItemType& item, bool& found) { NodeType<ItemType>* location; location = listData; found = false; while( (location != NULL) && !found) { if (location->info < item) location = location->next; else if (location->info == item) { found = true; item = location->info; } else location = NULL; // no reason to continue } }
Function InsertItem (cont.) • Can we compare one item ahead?? (like in the unsorted list case?) • In general, we must keep track of the previous pointer, as well as the current pointer.
Function InsertItem (cont.) prevLoc = location location= location->next
Inserting an element at the beginning of the list Case 1 newNode->next= location; listData=newNode;
Inserting an element in the middle of the list newNode->next=location; prevLoc->next = newNode; Case 2
Inserting an element atthe end of the list prevLoc->next = newNode; newNode->next=location; Case 3
Inserting into an empty list listData=newNode; newNode->next=location; Case 4
Function InsertItem (cont.) template <class ItemType> void SortedType<ItemType>::InsertItem(ItemType newItem) { NodeType<ItemType>* newNode; NodeType<ItemType>* predLoc; NodeType<ItemType>* location; bool stop; stop = false; location = listData; predLoc = NULL; while( location != NULL && !stop) { if (location->info < newItem) { predLoc = location; location = location->next; } else stop = true; }
Function InsertItem (cont.) newNode = new NodeType<ItemType>; newNode->info = newItem; if (predLoc == NULL) { newNode->next = listData; cases (1) and (4) listData = newNode; } else { newNode->next = location; predLoc->next = newNode; cases (2) and (3) } length++; }
Function DeleteItem • The DeleteItem we wrote for unsorted lists works for sorted lists as well • Another possibility is to write a new DeleteItem based on the following cases
Other SortedList functions • Same as in the case of UnsortedList class
Write a client function that takes two lists (unsorted or sorted) and returns a Boolean indicating whether the second list is a sublist of the first. • (i.e., the first list contains all the elements of the second list but may also contain other elements).
bool IsSubList (SortedType list1, SortedType list2) { ItemType item; bool subList, found; sublist = true; list2.ResetList(); while ( !list2.IsLastItem() && sublist ) { list2.GetNextItem (item); list1.RetrieveItem (item, found); if (!found) sublist = false; } return sublist; }
Write a member function that returns a pointer to the minimum node (i.e. the node storing the smallest value) of an unsorted list. • Precondition: list is not empty. • How would you implement the same function if the list was sorted? (assume that the elements in a sorted list are sorted in increasing order).
NodeType<ItemType>* UnsortedType<ItemType>::MinNode() { NodeType<ItemType * location, *tempLocation; ItemType minItem; minItem = listData->info; tempLocation = listData; location = listData; while (location->next != NULL) { location = location->next; if (location->info < minItem) { minItem=location->info; tempLocation=location; } } return tempLocation; } If the list is sorted, then you just need to return “listData” (pointer to the first element).
Exercises • 9, 15 - 18