![Page 1: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/1.jpg)
Pointers & Dynamic Data Structures
Chapter 13
![Page 2: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/2.jpg)
2
Dynamic Data Structures
Arrays & structs are static (compile time) Dynamic expand as program executes Linked list is example of dynamic data
structure
Node Node Node
PointerPointer
Linked list
![Page 3: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/3.jpg)
3
13.1 Pointers and the “new” Operator
Pointer Declarations– pointer variable of type “pointer to float”– can store the address of a float in p
float *p; The new operator creates a variable of type float
& puts the address of the variable in pointer pp = new float;
Dynamic allocation - program execution
![Page 4: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/4.jpg)
4
Pointers
Actual address has no meaning
Form: type *variable; Example: float *p;
?
P
![Page 5: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/5.jpg)
5
new Operator
Actually allocates storage
Form: new type;
new type [n];
Example: new float;
![Page 6: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/6.jpg)
6
Accessing Data with Pointers
* - indirection operator*p = 15.5;
Stores floating value 15.5 in memory location *p - the location pointed to by p
15.5
p
![Page 7: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/7.jpg)
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;
OutputThe contents of memory cell pointed to by p is 15.5
![Page 8: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/8.jpg)
8
Pointer Operations
Pointers can only contain addresses So the following are errors:
– p = 1000;– p = 15.5;
Assignment of pointers if q & p are the same pointer type– q = p;
Also relational operations == and !=
![Page 9: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/9.jpg)
9
Pointers to Structs
struct electric
{
string current;
int volts;
};
electric*p, *q; p and q are pointers to a struct of type electric
![Page 10: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/10.jpg)
10
Pointers to Structs
p = new electric; Allocates storage for struct of type electric
and places address into pointer p
Struct access operator .
? ?current voltsp
![Page 11: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/11.jpg)
11
Assignments
*p.current = “AC”;
*p.volts = 115;
Statements above can also be written– p ->current = “AC”;– p ->volts = 115;
AC 115current voltsp
![Page 12: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/12.jpg)
12
Struct Member Access via Pointers
From: p ->m Example: p ->volts
Example:– cout << p->current << p->volts << endl;
Output– AC115
![Page 13: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/13.jpg)
13
Pointers to Structs
q = new electric; Allocates storage for struct of type electric and places
address into pointer q Copy contents of p struct to q struct
*q = *p;
AC 115
q->current q->voltsq
![Page 14: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/14.jpg)
14
Pointers to Structs
q->volts = 220;
q = p;
AC 220
q->current q->voltsq
AC 115
AC 220
q
p q->current q->voltsp->current p->volts
![Page 15: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/15.jpg)
15
13.2 Manipulating the Heap
When new executes where is struct stored ? Heap
– C++ storage pool available to new operator Effect of p = new node; Figure 14.1 shows Heap before and after
executing new operator
![Page 16: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/16.jpg)
16
Effect on new on the Heap
![Page 17: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/17.jpg)
17
Returning Cells to the Heap
Operation– delete p;
Returns cells back to heap for re-use When finished with a pointer delete it Watch dual assignments and initialization
Form: delete variable; Example: delete p;
![Page 18: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/18.jpg)
18
13.3 Linked Lists
Arrange dynamically allocated structures into a new structure called a linked list
Think of a set of children’s pop beads Connecting beads to make a chain You can move things around and re-connect
the chain We use pointers to create the same effect
![Page 19: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/19.jpg)
19
Children’s Beads
![Page 20: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/20.jpg)
20
Declaring Nodes
If a pointer is included in a struct we can connect nodesstruct node
{
string word;
int count;
node *link;
};
node *p, *q, *r;
![Page 21: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/21.jpg)
21
Declaring Nodes
Each var p, q and r can point to a struct of type node– word (string)– count (int)– link (pointer to a node address)
word count link
Struct of type node
String Integer Address
![Page 22: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/22.jpg)
22
Connecting Nodes
Allocate storage of 2 nodesp = new node;
q = new node; Assignment Statements
p->word = “hat”;
p->count = 2;
q->word = “top”;
q->count = 3;
![Page 23: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/23.jpg)
23
Figure 13.3
![Page 24: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/24.jpg)
24
Connecting Nodes
Link fields undefined until assignmentp->link = q;
Address of q is stored in link field pointed to by p
Access elements as followsq->word or p->link->word
Null stored at last link fieldq->link = NULL; or p->link->link = NULL;
![Page 25: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/25.jpg)
25
Connecting Nodes
![Page 26: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/26.jpg)
26
Inserting a Node
Create and initialize noder = new node;
r->word = “the”;
r->count = 5; Connect node pointed to by p to node pointed to by r
p->link = r; Connect node pointed to by r to node pointed to by q
r->link = q;
![Page 27: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/27.jpg)
27
Inserting a New Node in a List
![Page 28: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/28.jpg)
28
Insertion at Head of List
OldHead points to original list headoldHead = p;
Point p to a new nodep = new node;
Connect new node to old list headp->link = oldHead;
![Page 29: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/29.jpg)
29
Insertion at Head of List
![Page 30: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/30.jpg)
30
Insertion at End of List
Typically less efficient (no pointer) Attach new node to end of list
last->link = new node; Mark end with a NULL
last->link->link = NULL;
![Page 31: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/31.jpg)
31
Insertion at End of List
![Page 32: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/32.jpg)
32
Deleting a Node
Adjust the link field to remove a node Disconnect the node pointed to by r
p->link = r->link; Disconnect the node pointed to by r from its
successorr->link = NULL;
Return node to Heapdelete r;
![Page 33: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/33.jpg)
33
Deleting a Node
![Page 34: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/34.jpg)
34
Traversing a List
Often need to traverse a list Start at head and move down a trail of
pointers Typically displaying the various nodes
contents as the traversing continues Advance node pointer
head = head->link; Watch use of reference parameters
![Page 35: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/35.jpg)
35
PrintList.cpp
// FILE: PrintList.cpp
// DISPLAY THE LIST POINTED TO BY HEAD
void printList (listNode *head)
{
while (head != NULL)
{
cout << head->word << " " << head ->count
<< endl;
head = head->link;
}
}
![Page 36: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/36.jpg)
36
Circular Lists - Two Way Option
A list where the last node points back to the first node
Two way list is a list that contains two pointers– pointer to next node– pointer to previous node
![Page 37: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/37.jpg)
37
13.4 Stacks as Linked Lists
Implement Stack as a dynamic structure– Earlier we used arrays (chps 12, 13)
Use a linked list The first element is s.top New nodes are inserted at head of list LIFO (Last-In First-Out) StackLis.h
![Page 38: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/38.jpg)
38
StackList.h
//FILE: StackList.h
#ifndef STACK_LIST_H
#define STACK_LIST_H
template <class stackElement>
class stackList
{
public:
// Member functions ...
// CONSTRUCTOR TO CREATE AN EMPTY STACK
stackList ();
![Page 39: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/39.jpg)
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;
};
![Page 40: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/40.jpg)
40
StackList.h
// Data member
stackNode* top;
};
#endif // STACK_LIST_H
![Page 41: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/41.jpg)
41
StackList.cpp
// File: stackList.cpp
// Implementation of template class stack
// as a linked list
#include "stackList.h"
#include <cstdlib> // for NULL
using namespace std;
![Page 42: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/42.jpg)
42
StackList.cpp
// Member functions ...
template <class stackElement>
stackList<stackElement>::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.
![Page 43: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/43.jpg)
43
StackList.cpp
template <class stackElement>
bool stackList<stackElement>::push
(const stackElement& x)
{
// Local data
stackNode* oldTop;
bool success;
oldTop = top;
top = new stackNode;
if (top == NULL)
{
![Page 44: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/44.jpg)
44
StackList.cpp
top = oldTop;
success = false;
}
else
{
top->next = oldTop;
top->item = x;
success = true;
}
return success;
} // end push
![Page 45: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/45.jpg)
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 <class stackElement>
bool stackList<stackElement>::pop
(stackElement& x)
{
// Local data
![Page 46: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/46.jpg)
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;
}
![Page 47: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/47.jpg)
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.
![Page 48: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/48.jpg)
48
StackList.cpp
template <class stackElement>
bool stackList<stackElement>::peek
(stackElement& x) const
{
// Local data
bool success;
if (top == NULL)
success = false;
else
{
x = top->item;
success = true;
![Page 49: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/49.jpg)
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 <class stackElement>
bool stackList<stackElement>::isEmpty() const
{
return top == NULL;
} // end isEmpty
![Page 50: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/50.jpg)
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 <class stackElement>
bool stackList<stackElement>::isFull() const
{
return false;
} // end isFull
![Page 51: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/51.jpg)
51
13.5 Queue ADT
List structure where items are added to one end and removed from the opposite end
FIFO (First-In First-Out) Bank service line, car wash or check-out are
examples of a queue Implementing a queue as a list we added
elements to the end and remove from the front Queue.h
![Page 52: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/52.jpg)
52
Queue of Customers
![Page 53: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/53.jpg)
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 queueElement>
class queue
{
public:
queue ();
![Page 54: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/54.jpg)
54
Queue.h
bool insert (const queueElement& x);
bool remove (queueElement& x);
bool isEmpty ();
int getSize ();
private:
struct queueNode
{
queueElement item;
queueNode* next;
};
![Page 55: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/55.jpg)
55
Queue.h
queueNode* front;
queueNode* rear;
int numItems;
};
#endif // QUEUE_H
![Page 56: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/56.jpg)
56
Queue.cpp
// File: queue.cpp
// Implementation of template class queue
#include "queue.h"
#include <cstdlib> // for NULL
using namespace std;
// Member functions
// constructor - create an empty queue
template<class queueElement>
queue<queueElement>::queue()
![Page 57: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/57.jpg)
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.
![Page 58: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/58.jpg)
58
Queue.cpp
template<class queueElement>
bool queue<queueElement>::insert
(const queueElement& x)
{
if (numItems == 0)
{
rear = new queueNode;
if (rear == NULL)
return false;
else
front = rear;
}
![Page 59: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/59.jpg)
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
![Page 60: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/60.jpg)
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<class queueElement>
bool queue<queueElement>::remove
(queueElement& x)
{
![Page 61: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/61.jpg)
61
Queue.cpp
// Local data
queueNode* oldFront;
if (numItems == 0)
{
return false;
}
else
{
oldFront = front;
x = front->item;
front = front->next;
![Page 62: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/62.jpg)
62
Queue.cpp
oldFront->next = NULL;
delete oldFront;
numItems--;
return true;
}
} // end remove
// Test whether queue is empty
template<class queueElement>
bool queue<queueElement>::isEmpty()
{
return (numItems == 0);
}
![Page 63: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/63.jpg)
63
Queue.cpp
// Returns queue size
template<class queueElement>
int queue<queueElement>::getSize()
{
return numItems;
}
![Page 64: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/64.jpg)
64
13.6 Binary Trees
List with additional pointer 2 pointers
– right pointer– left pointer
Binary Tree – 0 - 1 or 2 successor nodes– empty– root – left and right sub-trees
![Page 65: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/65.jpg)
65
Binary Tree
![Page 66: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/66.jpg)
66
Binary Search Tree
Efficient data retrieval Data stored by unique key Each node has 1 data component Values stored in right sub-tree are greater
than the values stored in the left sub-tree Above must be true for all nodes in the
binary search tree
![Page 67: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/67.jpg)
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
![Page 68: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/68.jpg)
68
Searching for Key 42
![Page 69: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/69.jpg)
69
Building a Binary Search Tree
Tree created from root downward Item 1 stored in root Next item is attached to left tree if value is
smaller or right tree if value is larger When inserting an item into existing tree
must locate the items parent and then insert
![Page 70: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/70.jpg)
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
![Page 71: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/71.jpg)
71
Figure 13.18 Building a Tree
![Page 72: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/72.jpg)
72
Displaying a Binary Search Tree
Recursive algorithm
if (tree is not empty)
display left sub-tree
display root
display right sub-tree In-order traversal Pre and post order traversals
![Page 73: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/73.jpg)
73
Example of traversal
Trace of Figure 13.18– 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
![Page 74: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/74.jpg)
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
![Page 75: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/75.jpg)
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
![Page 76: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/76.jpg)
76
13.7 Binary Search Tree ADT
Specification for a Binary Search Tree– root pointer to the tree root– binaryTree a constructor– insert inserts an item– retrieve retrieves an item– search locates a node for a key– display displays a tree
![Page 77: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/77.jpg)
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 treeElement>
class binTree
{
![Page 78: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/78.jpg)
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;
![Page 79: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/79.jpg)
79
BinaryTree.h
// DISPLAY A TREE
void display () const;
private:
// Data type ...
struct treeNode
{
treeElement info;
treeNode* left;
treeNode* right;
};
![Page 80: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/80.jpg)
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;
![Page 81: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/81.jpg)
81
BinaryTree.h
// Displays a subtree
void display (treeNode*) const;
};
#endif // BIN_TREE_H
![Page 82: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/82.jpg)
82
BinaryTree.cpp
// File: binaryTree.cpp
// Implementation of template class binary
// search tree
#include "binaryTree.h"
#include <iostream>
using namespace std;
// Member functions ...
// constructor - create an empty tree
template<class treeElement>
binaryTree<treeElement>::binaryTree()
{
root = NULL;
}
![Page 83: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/83.jpg)
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<class treeElement>
bool binaryTree<treeElement>::search
(const treeElement& el) const
{
return search(root, el);
} // search
![Page 84: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/84.jpg)
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<class treeElement>
bool binaryTree<treeElement>::search
(treeNode* aRoot,const treeElement& el)
const
{
if (aRoot == NULL)
![Page 85: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/85.jpg)
85
BinaryTree.cpp
return false;
else if (el == aRoot->info)
return true;
else if (el <= aRoot->info)
return search(aRoot->left, el);
else
return search(aRoot->right, el);
} // search
![Page 86: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/86.jpg)
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<class treeElement>
bool binaryTree<treeElement>::insert
(const treeElement& el)
{
return insert(root, el);
} // insert
![Page 87: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/87.jpg)
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<class treeElement>
bool binaryTree<treeElement>::insert
(treeNode*& aRoot,
const treeElement& el)
{
![Page 88: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/88.jpg)
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;
![Page 89: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/89.jpg)
89
BinaryTree.cpp
else if (el <= aRoot->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.
![Page 90: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/90.jpg)
90
BinaryTree.cpp
template<class treeElement>
void binaryTree<treeElement>::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<class treeElement>
void binaryTree<treeElement>::display
(treeNode* aRoot) const
![Page 91: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/91.jpg)
91
BinaryTree.cpp
{
if (aRoot != NULL)
{ // recursive step
display(aRoot->left);
cout << aRoot->info << endl;
display(aRoot->right);
}
} // display
![Page 92: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/92.jpg)
92
BinaryTree.cpp
// Insert member functions retrieve.
template<class treeElement>
bool binaryTree<treeElement>::retrieve
(const treeElement& el) const
{
return retrieve(root, el);
} // retrieve
![Page 93: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/93.jpg)
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<class treeElement>
bool binaryTree<treeElement>::retrieve
(treeNode* aRoot, treeElement& el) const
{
return true;
}
![Page 94: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/94.jpg)
94
13.8 Efficiency of a Binary Search Tree
Searching for a target in a list is O(N) Time is proportional to the size of the list Binary Tree more efficient
– cutting in half process Possibly not have nodes matched evenly Efficiency is O(log N)
![Page 95: Pointers & Dynamic Data Structures Chapter 13. 2 Dynamic Data Structures t Arrays & structs are static (compile time) t Dynamic expand as program executes](https://reader035.vdocuments.us/reader035/viewer/2022062719/56649ef15503460f94c02413/html5/thumbnails/95.jpg)
95
13.9 Common Programming Errors
Use the * de-referencing operator Operator -> member *p refers to the entire node p->x refers to member x new operator to allocate storage delete de-allocates storage Watch out for run-time errors with loops Don’t try to access a node returned to heap