1 / 26

CSC212 Data Structure - Section PR

CSC212 Data Structure - Section PR. Lecture 10 The Bag and Sequence Classes with Linked Lists Instructor: Esther Levin Department of Computer Science City College of New York. Review: Node and Linked List. Node a class with a pointer to an object of the node class

spike
Download Presentation

CSC212 Data Structure - Section PR

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CSC212 Data Structure - Section PR Lecture 10 The Bag and Sequence Classes with Linked Lists Instructor: Esther Levin Department of Computer Science City College of New York

  2. Review: Node and Linked List • Node • a class with a pointer to an object of the node class • core structure for the linked list • two versions of the link functions • why and how? • handout and questions...

  3. size_t list_length(const node* head_ptr) { const node *cursor; size_t count = 0; for (cursor = head_ptr; cursor != NULL; cursor = cursor->link()) count++; return count; } Review: Node and Linked List • Linked Lists Traverse • How to access the next node by using link pointer of the current node • the special for loop

  4. Review: Node and Linked List • Insert • Insert at the head • set the head_ptr and the link of the new node correctly • Insert at any location • cursor pointing to the current node • need a pre-cursor to point to the node before the current node (two approaches) • the third approach: doubly linked list

  5. Review: Node and Linked List • Delete • Delete at the head • set the head_ptr correctly • release the memory of the deleted node • Delete at any location • cursor pointing to the current node • need a pre-cursor to point to the node before the current node (two approaches) • the third approach: doubly linked list

  6. Key points you need to know Toolkit Code • Linked List Toolkit uses the node class which has • set and retrieve functions • The functions in the Toolkit are not member functions of the node class • length, insert(2), remove(2), search, locate, copy,... • compare their Big-Os with similar functions for an array • They can be used in various container classes, such as bag, sequence, etc.

  7. Container Classes using Linked Lists • Bag Class with a Linked List • Specification • Class definition • Implementation • Testing and Debugging • Sequence Class with a Linked List • Design suggestion – difference from bag • Arrays or Linked Lists: which approach is better? • Dynamic Arrays • Linked Lists • Doubly Linked Lists

  8. Our Third Bag - Specification • The documentation • nearly identical to our previous bag • The programmer uses the bag do not need to know know about linked lists. • The difference • No worries about capacity therefore • no default capacity • no reserve function • because our new bag with linked list can grow or shrink easily!

  9. Our Third Bag – Class Definition • The invariant of the 3rd bag class • the items in the bag are stored in a linked list (which is dynamically allocated) • the head pointer of the list is stored in the member variable head_ptr of the class bag • The total number of items in the list is stored in the member variable many_nodes. • The Header File (code)

  10. Our Third Bag – Class Definition • How to mach bag::value_type with node::value_type • Following the rules for dynamic memory usage • Allocate and release dynamic memory • The law of the Big-Three class bag { public: typedef node::value_type value type; ...... }

  11. Our Third Bag - Implementation • Use the Toolkit Functions! • The Constructors • default constructor • copy constructor • Overloading the Assignment Operator • release and re-allocate dynamic memory • self-assignment check • The Destructor • return all the dynamic memory to the heap • Other functions and the code

  12. bag::bag() { head_ptr = NULL; many_nodes = 0; } Default Constructor Computational Complexity: O(1)

  13. Copy Constructor bag::bag(const bag& source){ node *tail_ptr; list_copy(source.head_ptr, head_ptr, tail_ptr); many_nodes = source.many_nodes; } Computational Complexity: O(n)

  14. Destructor bag::~bag( ) { list_clear(head_ptr); many_nodes = 0; } Computational Complexity: O(n)

  15. Assignment Operator void bag::operator =(const bag& source) { node *tail_ptr; list_clear(head_ptr); many_nodes = 0; list_copy(source.head_ptr, head_ptr, tail_ptr); many_nodes = source.many_nodes; }

  16. Assignment Operator Check for self assignment! void bag::operator =(const bag& source) { node *tail_ptr; if (this == &source) return; list_clear(head_ptr); many_nodes = 0; list_copy(source.head_ptr, head_ptr, tail_ptr); many_nodes = source.many_nodes; } Computational Complexity: O(n)

  17. The Count Function bag::size_type bag::count(const value_type& target) const { size_type answer; const node *cursor; // Use const node* since we don't change the nodes. answer = 0; cursor = list_search(head_ptr, target); while (cursor != NULL) { // Each time that cursor is not NULL, we have another occurrence of // target, so we add one to answer, and move cursor to the next // occurrence of the target. ++answer; cursor = cursor->link( ); cursor = list_search(cursor, target); } return answer; } Computational Complexity: O(n)

  18. Erase One Function bool bag::erase_one(const value_type& target) { node *target_ptr; target_ptr = list_search(head_ptr, target); if (target_ptr == NULL) return false; // target isn't in the bag, so no work to do target_ptr->set_data( head_ptr->data( ) ); list_head_remove(head_ptr); --many_nodes; return true; } Computational Complexity: O(n)

  19. Erase Function bag::size_type bag::erase(const value_type& target) { size_type answer = 0; node *target_ptr; target_ptr = list_search(head_ptr, target); while (target_ptr != NULL) { // Each time that target_ptr is not NULL, we have another occurrence // of target. We remove this target using the same technique that // was used in erase_one. target_ptr->set_data( head_ptr->data( ) ); target_ptr = target_ptr->link( ); list_head_remove(head_ptr); --many_nodes; ++answer; target_ptr = list_search(target_ptr, target); } return answer; } Computational Complexity: O(n)

  20. Insert Function void bag::insert(const value_type& entry) { list_head_insert(head_ptr, entry); ++many_nodes; } Computational Complexity: O(1)

  21. The Append Operator void bag::operator +=(const bag& addend) { node *copy_head_ptr; node *copy_tail_ptr; if (addend.many_nodes > 0) { list_copy(addend.head_ptr, copy_head_ptr, copy_tail_ptr); copy_tail_ptr->set_link( head_ptr ); head_ptr = copy_head_ptr; many_nodes += addend.many_nodes; } } Computational Complexity: O(n) ?? bag b; b+=b ??

  22. Sequence Class with Linked List • Compare three implementations • using a fixed size array (assignment 2) • using a dynamic array (assignment 3) • using a linked list (will be assignment 4) • What are the differences? • member variables • value semantics • Performance (time and space)

  23. Sequence – Design Suggestions • Five private member variables • many_nodes: number of nodes in the list • head_ptr and tail_ptr : the head and tail pointers of the linked list • why tail_ptr - for attaching when no current item • cursor : pointer to the current item (or NULL) • precursor: pointer to the item before the current item • for an easy insert or remove (WHY) • Don’t forget • the dynamic allocation/release • the value semantics and • the Law of the Big-Three

  24. Sequence – Value Semantics • Goal of assignment and copy constructor • make one sequence equals to a new copy of another • Can we just use list_copy in the Toolkit? • list_copy(source.head_ptr, head_ptr, tail_ptr); • Problems ( deep copy – new memory allocation) • many_nodes OKAY • head_ptr and tail_ptr OKAY • How to set cursor and precursor ?

  25. Dynamic Arrays vs Linked Lists • Arrays are better at random access • O (1) vs. O(n) • Linked lists are better at insertions/ deletions at a cursor • O(1) vs O(n) • Doubly linked lists are better for a two-way cursor • for example for insert O(1) vs. O(n) • Resizing can be Inefficient for a Dynamic Array • re-allocation, copy, release

  26. Reading and Programming Assignments • Reading after Class • Chapter 6 • Programming Assignment 4 • Detailed guidelines online!

More Related