Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes.

Slides:



Advertisements
Similar presentations
Stacks, Queues, and Linked Lists
Advertisements

DATA STRUCTURES USING C++ Chapter 5
Starting Out with C++: Early Objects 5/e © 2006 Pearson Education. All Rights Reserved Starting Out with C++: Early Objects 5 th Edition Chapter 18 Stacks.
1 A full binary tree A full binary tree is a binary tree in which all the leaves are on the same level and every non leaf node has two children. SHAPE.
Chapter 13 Pointers and Linked Lists. Nodes and Linked Lists Linked list: A sequence of nodes in which each node is linked or connected to the node preceding.
Stack and Queue Dr. Bernard Chen Ph.D. University of Central Arkansas.
Copyright © 2014, 2008 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++ Early Objects Eighth Edition by Tony Gaddis,
Binary Tree A data structure whose nodes contain two pointer fields. One or both pointers can have the value NULL. Each node in a binary tree can have.
More Arrays Arrays and classes Multi-dimensional Arrays Dynamic arrays.
Chapter 12 C Data Structures Acknowledgment The notes are adapted from those provided by Deitel & Associates, Inc. and Pearson Education Inc.
© Copyright 1992–2004 by Deitel & Associates, Inc. and Pearson Education Inc. All Rights Reserved. Chapter 12 – Data Structures Outline 12.1Introduction.
5 Linked Structures. 2 Definition of Stack Logical (or ADT) level: A stack is an ordered group of homogeneous items (elements), in which the removal and.
1 Fall Chapter 4 ADT Sorted List. 2 Goals Describe the Abstract Data Type Sorted List from three perspectives Implement the following Sorted List.
1 Stack Data : a collection of homogeneous elements arranged in a sequence. Only the first element may be accessed Main Operations: Push : insert an element.
Data Structures Using C++ 2E
Chapter 12 Data Structure Associate Prof. Yuh-Shyan Chen Dept. of Computer Science and Information Engineering National Chung-Cheng University.
1 C++ Classes and Data Structures Jeffrey S. Childs Chapter 8 Stacks and Queues Jeffrey S. Childs Clarion University of PA © 2008, Prentice Hall.
Copyright © 2008 Pearson Addison-Wesley. All rights reserved. Chapter 13 Pointers and Linked Lists.
Copyright © 2012 Pearson Addison-Wesley. All rights reserved. Chapter 13 Pointers and Linked Lists.
Lecture 23: Pointers. 2 Lecture Contents: t Pointers and addresses t Pointers and function arguments t Pointers and arrays t Pointer arrays t Demo programs.
Lists ADT (brief intro):  Abstract Data Type  A DESCRIPTION of a data type  The data type can be anything: lists, sets, trees, stacks, etc.  What.
 2007 Pearson Education, Inc. All rights reserved C Data Structures.
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Chapter 13: Pointers and Dynamic Data Structures Problem Solving, Abstraction,
DATA STRUCTURES AND ALGORITHMS Lecture Notes 4 Prepared by İnanç TAHRALI.
Binary Trees Chapter Definition And Application Of Binary Trees Binary tree: a nonlinear linked list in which each node may point to 0, 1, or two.
INTRODUCTION TO BINARY TREES P SORTING  Review of Linear Search: –again, begin with first element and search through list until finding element,
Prof. Amr Goneid, AUC1 Analysis & Design of Algorithms (CSCE 321) Prof. Amr Goneid Department of Computer Science, AUC Part R2. Binary Search Trees.
Lecture 25: Practical Training on Pointers. 2 Lecture Contents: t Reminder on Arrays t Reminder on Strings t Reminder on Pointers t Demo programs, Exercises.
C++ Programming: From Problem Analysis to Program Design, Second Edition Chapter 17: Linked Lists.
1 Chapter 16 Linked Structures Dale/Weems. 2 Chapter 16 Topics l Meaning of a Linked List l Meaning of a Dynamic Linked List l Traversal, Insertion and.
1 Chapter 16 Linked Structures Dale/Weems/Headington.
Nyhoff, ADTs, Data Structures and Problem Solving with C++, Second Edition, © 2005 Pearson Education, Inc. All rights reserved Stacks.
Prof. amr Goneid, AUC1 CSCE 110 PROGRAMMING FUNDAMENTALS WITH C++ Prof. Amr Goneid AUC Part 16. Linked Lists.
Slide 1 Linked Data Structures. Slide 2 Learning Objectives  Nodes and Linked Lists  Creating, searching  Linked List Applications  Stacks, queues.
1 Linked-list, stack and queue. 2 Outline Abstract Data Type (ADT)‏ Linked list Stack Queue.
Review of Stacks and Queues Dr. Yingwu Zhu. How does a Stack Work? Last-in-First-out (LIFO) data structure Adding an item Push operation Removing an item.
Lists Chapter 8. 2 Linked Lists As an ADT, a list is –finite sequence (possibly empty) of elements Operations commonly include: ConstructionAllocate &
Programming Practice 3 - Dynamic Data Structure
Copyright © 2002 Pearson Education, Inc. Slide 1.
Starting Out with C++ Early Objects Seventh Edition by Tony Gaddis, Judy Walters, and Godfrey Muganda Chapter 18: Stacks and Queues.
Lecture 23: Pointers. 2 Lecture Contents: t Pointers and addresses t Pointers and function arguments t Pointers and arrays t Pointer arrays t Demo programs.
Pointer Variables int i; declares an int variable and sets aside a named memory location to store the int int * iptr; declares a variable that holds the.
Data Structures Chapter 6. Data Structure A data structure is a representation of data and the operations allowed on that data. Examples: 1.Array 2.Record.
Java How to Program, 9/e © Copyright by Pearson Education, Inc. All Rights Reserved.
1 Data Structures and Algorithms Stacks and Queues.
Prof. Amr Goneid, AUC1 CSCE 210 Data Structures and Algorithms Prof. Amr Goneid AUC Part 6. Dictionaries(3): Binary Search Trees.
1 C++ Plus Data Structures Nell Dale Chapter 5 Linked Structures Modified from the slides by Sylvia Sorkin, Community College of Baltimore County - Essex.
Data Structures. Abstract Data Type A collection of related data is known as an abstract data type (ADT) Data Structure = ADT + Collection of functions.
Copyright © 2012 Pearson Education, Inc. Chapter 20: Binary Trees.
Prof. amr Goneid, AUC1 CSCE 110 PROGRAMMING FUNDAMENTALS WITH C++ Prof. Amr Goneid AUC Part 15. Dictionaries (1): A Key Table Class.
Copyright © 2015, 2012, 2009 Pearson Education, Inc., Publishing as Addison-Wesley All rights reserved. Chapter 20: Binary Trees.
Chapter 17: Linked Lists. Objectives In this chapter, you will: – Learn about linked lists – Learn the basic properties of linked lists – Explore insertion.
CS 240Chapter 10 – TreesPage Chapter 10 Trees The tree abstract data type provides a hierarchical to the representation of certain types of relationships.
Copyright © 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Chapter 20: Binary Trees.
1 Binary Search Trees. 2 Binary Search Trees Binary Search Trees The Binary Search Tree (BST) Search, Insertion and Traversal of BST Removal of nodes.
Prof. Amr Goneid, AUC1 CSCE 210 Data Structures and Algorithms Prof. Amr Goneid AUC Part R2. Elementary Data Structures.
Chapter 16: Linked Lists.
C++ Programming:. Program Design Including
CSCE 210 Data Structures and Algorithms
Pointers and Linked Lists
Chapter 12 – Data Structures
12 C Data Structures.
CSCE 210 Data Structures and Algorithms
Chapter 20: Binary Trees.
Map interface Empty() - return true if the map is empty; else return false Size() - return the number of elements in the map Find(key) - if there is an.
Chapter 16-2 Linked Structures
Chapter 21: Binary Trees.
C++ Plus Data Structures
Chapter 16 Linked Structures
Pointers & Dynamic Data Structures
Presentation transcript:

Pointers & Dynamic Data Structures Chapter 13

2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes t Linked list is example of dynamic data structure Node Pointer Linked list

Pointers and the “new” Operator t Pointer Declarations –pointer variable of type “pointer to float” –can store the address of a float in p float*p; t The new operator creates a variable of type float & puts the address of the variable in pointer p p = new float; t Dynamic allocation - program execution

4 Pointers t Actual address has no meaning t Form:type*variable; t Example:float *p; ? P

5 new Operator t Actually allocates storage t Form:new type; new type [n]; t Example:new float;

6 Accessing Data with Pointers t * - indirection operator *p = 15.5; t Stores floating value 15.5 in memory location *p - the location pointed to by p 15.5 p

7 Pointer Statements float*p; p = new float; *p = 15.5; cout << “The contents of the memory cell pointed to by p is “ << *p << endl; Output The contents of memory cell pointed to by p is 15.5

8 Pointer Operations t Pointers can only contain addresses t So the following are errors: –p = 1000; –p = 15.5; t Assignment of pointers if q & p are the same pointer type –q = p; t Also relational operations == and !=

9 Pointers to Structs struct electric { string current; int volts; }; electric*p,*q; t p and q are pointers to a struct of type electric

10 Pointers to Structs p = new electric; t Allocates storage for struct of type electric and places address into pointer p t Struct access operator. ?? currentvoltsp

11 Assignments *p.current = “AC”; *p.volts = 115; t Statements above can also be written –p ->current = “AC”; –p ->volts = 115; AC115 currentvoltsp

12 Struct Member Access via Pointers t From:p ->m t Example:p ->volts t Example: –cout current volts << endl; t Output –AC115

13 Pointers to Structs q = new electric; t Allocates storage for struct of type electric and places address into pointer q t Copy contents of p struct to q struct *q = *p; AC115 q->currentq->voltsq

14 Pointers to Structs q->volts = 220; q = p; AC220 q->currentq->voltsq AC 115 AC220 q pq->currentq->volts p->currentp->volts

Manipulating the Heap t When new executes where is struct stored ? t Heap –C++ storage pool available to new operator t Effect of p = new node; t Figure 14.1 shows Heap before and after executing new operator

16 Effect on new on the Heap

17 Returning Cells to the Heap t Operation –delete p; t Returns cells back to heap for re-use t When finished with a pointer delete it t Watch dual assignments and initialization t Form:deletevariable; t Example:deletep;

Linked Lists t Arrange dynamically allocated structures into a new structure called a linked list t Think of a set of children’s pop beads t Connecting beads to make a chain t You can move things around and re-connect the chain t We use pointers to create the same effect

19 Children’s Beads

20 Declaring Nodes t If a pointer is included in a struct we can connect nodes struct node { string word; int count; node *link; }; node*p, *q, *r;

21 Declaring Nodes t Each var p, q and r can point to a struct of type node –word(string) –count(int) –link(pointer to a node address) wordcountlink Struct of type node String Integer Address

22 Connecting Nodes t Allocate storage of 2 nodes p = new node; q = new node; t Assignment Statements p->word = “hat”; p->count = 2; q->word = “top”; q->count = 3;

23 Figure 13.3

24 Connecting Nodes t Link fields undefined until assignment p->link = q; t Address of q is stored in link field pointed to by p t Access elements as follows q->word or p->link->word t Null stored at last link field q->link = NULL; or p->link->link = NULL;

25 Connecting Nodes

26 Inserting a Node t Create and initialize node r = new node; r->word = “the”; r->count = 5; t Connect node pointed to by p to node pointed to by r p->link = r; t Connect node pointed to by r to node pointed to t by q r->link = q;

27 Inserting a New Node in a List

28 Insertion at Head of List t OldHead points to original list head oldHead = p; t Point p to a new node p = new node; t Connect new node to old list head p->link = oldHead;

29 Insertion at Head of List

30 Insertion at End of List t Typically less efficient (no pointer) t Attach new node to end of list last->link = new node; t Mark end with a NULL last->link->link = NULL;

31 Insertion at End of List

32 Deleting a Node t Adjust the link field to remove a node t Disconnect the node pointed to by r p->link = r->link; t Disconnect the node pointed to by r from its successor r->link = NULL; t Return node to Heap delete r;

33 Deleting a Node

34 Traversing a List t Often need to traverse a list t Start at head and move down a trail of pointers t Typically displaying the various nodes contents as the traversing continues t Advance node pointer head = head->link; t Watch use of reference parameters

35 PrintList.cpp // FILE: PrintList.cpp // DISPLAY THE LIST POINTED TO BY HEAD void printList (listNode *head) { while (head != NULL) { cout word count << endl; head = head->link; }

36 Circular Lists - Two Way Option t A list where the last node points back to the first node t Two way list is a list that contains two pointers –pointer to next node –pointer to previous node

Stacks as Linked Lists t Implement Stack as a dynamic structure –Earlier we used arrays (chps 12, 13) t Use a linked list t The first element is s.top t New nodes are inserted at head of list t LIFO (Last-In First-Out) t StackLis.h

38 StackList.h //FILE: StackList.h #ifndef STACK_LIST_H #define STACK_LIST_H template class stackList { public: // Member functions... // CONSTRUCTOR TO CREATE AN EMPTY STACK stackList ();

39 StackList.h bool push (const stackElement& x); bool pop (stackElement& x); bool peek (stackElement& x) const; bool isEmpty () const; bool isFull () const; private: struct stackNode { stackElement item; stackNode* next; };

40 StackList.h // Data member stackNode* top; }; #endif // STACK_LIST_H

41 StackList.cpp // File: stackList.cpp // Implementation of template class stack // as a linked list #include "stackList.h" #include // for NULL using namespace std;

42 StackList.cpp // Member functions... template stackList ::stackList() { top = NULL; } // end stackList // Push an element onto the stack // Pre: The element x is defined. // Post: If there is space on the heap, // the item is pushed onto the stack and // true is returned. Otherwise, the // stack is unchanged and false is // returned.

43 StackList.cpp template bool stackList ::push (const stackElement& x) { // Local data stackNode* oldTop; bool success; oldTop = top; top = new stackNode; if (top == NULL) {

44 StackList.cpp top = oldTop; success = false; } else { top->next = oldTop; top->item = x; success = true; } return success; } // end push

45 StackList.cpp // Pop an element off the stack // Pre: none // Post: If the stack is not empty, the value // at the top of the stack is removed, its // value is placed in x, and true is returned. // If the stack is empty, x is not defined and // false is returned. template bool stackList ::pop (stackElement& x) { // Local data

46 StackList.cpp stackNode* oldTop; bool success; if (top == NULL) success = false; else { x = top->item; oldTop = top; top = oldTop->next; delete oldTop; success = true; }

47 StackList.cpp return success; } // end pop // Get top element from stack without popping // Pre: none // Post: If the stack is not empty, the value // at the top is copied into x and true is // returned. If the stack is empty, x is not // defined and false is returned. In // either case, the stack is not changed.

48 StackList.cpp template bool stackList ::peek (stackElement& x) const { // Local data bool success; if (top == NULL) success = false; else { x = top->item; success = true;

49 StackList.cpp } return success; } // end peek // Test to see if stack is empty // Pre : none // Post: Returns true if the stack is empty; // otherwise, returns false. template bool stackList ::isEmpty() const { return top == NULL; } // end isEmpty

50 StackList.cpp // Test to see if stack is full // Pre : none // Post: Returns false. List stacks are never // full. (Does not check heap availability.) template bool stackList ::isFull() const { return false; } // end isFull

Queue ADT t List structure where items are added to one end and removed from the opposite end t FIFO (First-In First-Out) t Bank service line, car wash or check-out are examples of a queue t Implementing a queue as a list we added elements to the end and remove from the front t Queue.h

52 Queue of Customers

53 Queue.h // FILE: Queue.h // DEFINITION AND IMPLEMENTATION OF A TEMPLATE // CLASS QUEUE USING A LINKED LIST #ifndef QUEUE_H #define QUEUE_H template class queue { public: queue ();

54 Queue.h bool insert (const queueElement& x); bool remove (queueElement& x); bool isEmpty (); int getSize (); private: struct queueNode { queueElement item; queueNode* next; };

55 Queue.h queueNode* front; queueNode* rear; int numItems; }; #endif // QUEUE_H

56 Queue.cpp // File: queue.cpp // Implementation of template class queue #include "queue.h" #include // for NULL using namespace std; // Member functions // constructor - create an empty queue template queue ::queue()

57 Queue.cpp { numItems = 0; front = NULL; rear = NULL; } // Insert an element into the queue // Pre : none // Post: If heap space is available, the // value x is inserted at the rear of the queue // and true is returned. Otherwise, the queue is // not changed and false is returned.

58 Queue.cpp template bool queue ::insert (const queueElement& x) { if (numItems == 0) { rear = new queueNode; if (rear == NULL) return false; else front = rear; }

59 Queue.cpp else { rear->next = new queueNode; if (rear->next == NULL) return false; else rear = rear->next; } rear->item = x; numItems++; return true; } // end insert

60 Queue.cpp // Remove an element from the queue // Pre : none // Post: If the queue is not empty, the value at // the front of the queue is removed, its value // is placed in x, and true is returned. If the // queue is empty, x is not defined and false // is returned. template bool queue ::remove (queueElement& x) {

61 Queue.cpp // Local data queueNode* oldFront; if (numItems == 0) { return false; } else { oldFront = front; x = front->item; front = front->next;

62 Queue.cpp oldFront->next = NULL; delete oldFront; numItems--; return true; } } // end remove // Test whether queue is empty template bool queue ::isEmpty() { return (numItems == 0); }

63 Queue.cpp // Returns queue size template int queue ::getSize() { return numItems; }

Binary Trees t List with additional pointer t 2 pointers –right pointer –left pointer t Binary Tree –0 - 1 or 2 successor nodes –empty –root –left and right sub-trees

65 Binary Tree

66 Binary Search Tree t Efficient data retrieval t Data stored by unique key t Each node has 1 data component t Values stored in right sub-tree are greater than the values stored in the left sub-tree t Above must be true for all nodes in the binary search tree

67 Searching Algorithm if (tree is empty) target is not in the tree else if (the target key is the root) target found in root else if (target key smaller than the root’s key) search left sub-tree else search right sub-tree

68 Searching for Key 42

69 Building a Binary Search Tree t Tree created from root downward t Item 1 stored in root t Next item is attached to left tree if value is smaller or right tree if value is larger t When inserting an item into existing tree must locate the items parent and then insert

70 Algorithm for Insertion if (tree is empty) insert new item as root else if (root key matches item) skip insertion duplicate key else if (new key is smaller than root) insert in left sub-tree else insert in right sub-tree

71 Figure Building a Tree

72 Displaying a Binary Search Tree t Recursive algorithm if (tree is not empty) display left sub-tree display root display right sub-tree t In-order traversal t Pre and post order traversals

73 Example of traversal t Trace of Figure –Display left sub-tree of node 40 –Display left sub-tree of node 20 –Display left sub-tree of node 10 –Tree is empty - return left sub-tree node is 10 –Display item with key 10 –Display right sub-tree of node 10

74 Example of traversal –Tree is empty - return from displaying right sub-tree node is 10 –Return from displaying left sub-tree of node 20 –Display item with key 20 –Display right sub-tree of node 20 –Display left sub-tree of node 30 –Tree is empty - return from displaying left sub- tree of node 30 –Display item with key 30

75 Example of traversal –Display right sub-tree of node 30 –Tree is empty - return from displaying right sub-tree of node 30 –Return from displaying right sub-tree of node 20 –Return from displaying left sub-tree of node 40 –Display item with key 40 –Display right sub-tree of node 40

Binary Search Tree ADT t Specification for a Binary Search Tree –rootpointer to the tree root –binaryTreea constructor –insertinserts an item –retrieveretrieves an item –searchlocates a node for a key –displaydisplays a tree

77 BinaryTree.h // FILE: BinaryTree.h // DEFINITION OF TEMPLATE CLASS BINARY SEARCH // TREE #ifndef BIN_TREE_H #define BIN_TREE_H // Specification of the class template class binTree {

78 BinaryTree.h public: // Member functions... // CREATE AN EMPTY TREE binTree (); // INSERT AN ELEMENT INTO THE TREE bool insert (const treeElement& el ); // RETRIEVE AN ELEMENT FROM THE TREE bool retrieve (treeElement& el ) const; // SEARCH FOR AN ELEMENT IN THE TREE bool search (const treeElement& el ) const;

79 BinaryTree.h // DISPLAY A TREE void display () const; private: // Data type... struct treeNode { treeElement info; treeNode* left; treeNode* right; };

80 BinaryTree.h // Data member.... treeNode* root; // Member functions... // Searches a subtree for a key bool search (treeNode*, const treeElement&) const; // Inserts an item in a subtree bool insert (treeNode*&, const treeElement&) const; // Retrieves an item in a subtree bool retrieve (treeNode*, treeElement&) const;

81 BinaryTree.h // Displays a subtree void display (treeNode*) const; }; #endif // BIN_TREE_H

82 BinaryTree.cpp // File: binaryTree.cpp // Implementation of template class binary // search tree #include "binaryTree.h" #include using namespace std; // Member functions... // constructor - create an empty tree template binaryTree ::binaryTree() { root = NULL; }

83 BinaryTree.cpp // Searches for the item with same key as el // in a binary search tree. // Pre : el is defined. // Returns true if el's key is located, // otherwise, returns false. template bool binaryTree ::search (const treeElement& el) const { return search(root, el); } // search

84 BinaryTree.cpp // Searches for the item with same key as el // in the subtree pointed to by aRoot. Called // by public search. // Pre : el and aRoot are defined. // Returns true if el's key is located, // otherwise, returns false. template bool binaryTree ::search (treeNode* aRoot,const treeElement& el) const { if (aRoot == NULL)

85 BinaryTree.cpp return false; else if (el == aRoot->info) return true; else if (el info) return search(aRoot->left, el); else return search(aRoot->right, el); } // search

86 BinaryTree.cpp // Inserts item el into a binary search tree. // Pre : el is defined. // Post: Inserts el if el is not in the tree. // Returns true if the insertion is performed. // If there is a node with the same key value // as el, returns false. template bool binaryTree ::insert (const treeElement& el) { return insert(root, el); } // insert

87 BinaryTree.cpp // Inserts item el in the tree pointed to by // aRoot. // Called by public insert. // Pre : aRoot and el are defined. // Post: If a node with same key as el is found, // returns false. If an empty tree is reached, // inserts el as a leaf node and returns true. template bool binaryTree ::insert (treeNode*& aRoot, const treeElement& el) {

88 BinaryTree.cpp // Check for empty tree. if (aRoot == NULL) { // Attach new node aRoot = new treeNode; aRoot->left = NULL; aRoot->right = NULL; aRoot->info = el; return true; } else if (el == aRoot->info) return false;

89 BinaryTree.cpp else if (el info) return insert(aRoot->left, el); else return insert(aRoot->right, el); } // insert // Displays a binary search tree in key order. // Pre : none // Post: Each element of the tree is displayed. // Elements are displayed in key order.

90 BinaryTree.cpp template void binaryTree ::display() const { display(root); } // display // Displays the binary search tree pointed to // by aRoot in key order. Called by display. // Pre : aRoot is defined. // Post: displays each node in key order. template void binaryTree ::display (treeNode* aRoot) const

91 BinaryTree.cpp { if (aRoot != NULL) { // recursive step display(aRoot->left); cout info << endl; display(aRoot->right); } } // display

92 BinaryTree.cpp // Insert member functions retrieve. template bool binaryTree ::retrieve (const treeElement& el) const { return retrieve(root, el); } // retrieve

93 BinaryTree.cpp // Retrieves for the item with same key as el // in the subtree pointed to by aRoot. Called // by public search. // Pre : el and aRoot are defined. // Returns true if el's key is located, // otherwise, returns false. template bool binaryTree ::retrieve (treeNode* aRoot, treeElement& el) const { return true; }

Efficiency of a Binary Search Tree t Searching for a target in a list is O(N) t Time is proportional to the size of the list t Binary Tree more efficient –cutting in half process t Possibly not have nodes matched evenly t Efficiency is O(log  N)

Common Programming Errors t Use the * de-referencing operator t Operator -> member t *p refers to the entire node t p->x refers to member x t new operator to allocate storage t delete de-allocates storage t Watch out for run-time errors with loops t Don’t try to access a node returned to heap