Chapter 13
Pointers and Linked Lists
Copyright © 2018 Pearson Addison-Wesley. All rights reserved.
Overview
13.1 Nodes and Linked Lists
13.2 Stacks and Queues
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 3
13.1
Nodes and Linked Lists
Copyright © 2018 Pearson Addison-Wesley. All rights reserved.
Nodes and Linked Lists
◼ A linked list is a list that can grow and shrink
while the program is running
◼ A linked list is constructed using pointers
◼ A linked list often consists of structs or classes
that contain a pointer variable connecting them
to other dynamic variables
◼ A linked list can be visualized as items, drawn
as boxes, connected to other items by arrows
12 14 end
head 10
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 5
Nodes
◼ The boxes in the previous drawing represent the
nodes of a linked list
◼ Nodes contain the data item(s) and a pointer
that can point to another node of the same
type
◼ The pointers point to the entire node, not an
individual item that might be in the node
◼ The arrows in the drawing represent pointers
Display 13.1
Display 13.1
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 6
Implementing Nodes
◼ Nodes are implemented in C++ as structs or
classes
◼ Example: A structure to store two data items and
a pointer to another node of the same type,
along with a type definition might be:
struct ListNode
{
string item; This circular definition
int count; is allowed in C++
ListNode *link;
};
typedef ListNode* ListNodePtr;
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 7
The head of a List
◼ The box labeled head, in display 13.1, is not a
node, but a pointer variable that points to a node
◼ Pointer variable head is declared as:
ListNodePtr head;
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 8
Accessing Items in a Node
◼ Using the diagram of 13.1, this is one way to
change the number in the first node from
10 to 12:
(*head).count = 12;
◼ head is a pointer variable so *head is the node
that head points to
◼ The parentheses are necessary because the
dot operator . has higher precedence than the
dereference operator *
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 9
The Arrow Operator
◼ The arrow operator -> combines the actions of
the dereferencing operator * and the dot operator
to specify a member of a struct or object pointed
to by a pointer
◼ (*head).count = 12;
can be written as
head->count = 12;
◼ The arrow operator is more commonly used
Display 13.2
Display 13.2
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 10
NULL
◼ The defined constant NULL is used as…
◼ An end marker for a linked list
◼ A program can step through a list of nodes by
following the pointers, but when it finds a node
containing NULL, it knows it has come to the end of
the list
The value of a pointer that has nothing to point
◼
to
◼ The value of NULL is 0
◼ Any pointer can be assigned the value NULL:
double* there = NULL;
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 11
To Use NULL
◼ A definition of NULL is found in several
libraries, including <iostream> and <cstddef>
◼ A using directive is not needed for NULL
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 12
nullptr
◼ The fact that the constant NULL is actually the
number 0 leads to an ambiguity problem.
Consider the overloaded function below:
void func(int *p);
void func(int i);
◼ Which function will be invoked if we call
func(NULL)?
◼ To avoid this, C++11 has a new constant,
nullptr. It is not the integer zero, but a literal
constant used to represent a null pointer.
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 13
Linked Lists
◼ The diagram in Display 13.2 depicts a linked list
◼ A linked list is a list of nodes in which each node
has a member variable that is a pointer that
points to the next node in the list
◼ The first node is called the head
◼ The pointer variable head, points to the first
node
◼ The pointer named head is not the head of the
list…it points to the head of the list
◼ The last node contains a pointer set to NULL
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 14
Building a Linked List:
The node definition
◼ Let's begin with a simple node definition:
struct Node
{
int data;
Node *link;
};
typedef Node* NodePtr;
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 15
Building a Linked List:
Declaring Pointer Variable head
◼ With the node defined and a type definition to
make or code easier to understand, we can
declare the pointer variable head:
NodePtr head;
◼ head is a pointer variable that will point to the
head node when the node is created
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 16
Building a Linked List:
Creating the First Node
◼ To create the first node, the operator new is used
to create a new dynamic variable:
head = new Node;
◼ Now head points to the first, and only, node in
the list
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 17
Building a Linked List:
Initializing the Node
◼ Now that head points to a node, we need to
give values to the member variables of the node:
head->data = 3;
head->link = NULL;
◼ Since this node is the last node, the link is set
to NULL
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 18
Function headInsert
◼ It would be better to create a function to insert
nodes at the head of a list, such as:
◼ void headInsert(NodePtr& head, int theNumber);
◼ The first parameter is a NodePtr parameter that points to the
first node in the linked list
◼ The second parameter is the number to store in the list
◼ headInsert will create a new node for the number
◼ The number will be copied to the new node
◼ The new node will be inserted in the list as the new head node
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 19
Pseudocode for headInsert
◼ Create a new dynamic variable pointed to by
tempPtr
◼ Place the data in the new node called *tempPtr
◼ Make tempPtr's link variable point to the head
node
◼ Make the head pointer point to tempPtr
Display 13.3
Display 13.3
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 20
Translating headInsert to C++
◼ The pseudocode for headInsert can be written
in C++ using these lines in place of the lines of
pseudocode:
◼ NodePtr tempPtr; //create the temporary pointer
tempPtr = new Node; // create the new node
◼ tempPtr->data = theNumber; //copy the number
◼ tempPtr->link = head; //new node points to first
node
head = tempPtr; // head points to new
// first node
Display 13.4
Display 13.4
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 21
An Empty List
◼ A list with nothing in it is called an empty list
◼ An empty linked list has no head node
◼ The head pointer of an empty list is NULL
head = NULL;
◼ Any functions written to manipulate a linked list
should check to see if it works on the empty list
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 22
Losing Nodes
◼ You might be tempted to write headInsert using
the head pointer to construct the new node:
head = new Node;
head->data = theNumber;
◼ Now to attach the new node to the list
◼ The node that head used to point to is now
lost! Display 13.5
Display 13.5
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 23
Memory Leaks
◼ Nodes that are lost by assigning their pointers a
new address are not accessible any longer
◼ The program has no way to refer to the nodes
and cannot delete them to return their memory
to the freestore
◼ Programs that lose nodes have a memory leak
◼ Significant memory leaks can cause system
crashes
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 24
Searching a Linked List
◼ To design a function that will locate a particular
node in a linked list:
◼ We want the function to return a pointer to the
node so we can use the data if we find it, else
return NULL
◼ The linked list is one argument to the function
◼ The data we wish to find is the other argument
◼ This declaration will work:
NodePtr search(NodePtr head, int target);
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 25
Function search
◼ Refining our function
◼ We will use a local pointer variable, named
here, to move through the list checking for the
target
◼ The only way to move around a linked list is to
follow pointers
◼ We will start with here pointing to the first node
and move the pointer from node to node
following the pointer out of each node
Display 13.6
Display 13.6
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 26
Pseudocode for search
◼ Make pointer variable here point to the head node
◼ while(here does not point to a node containing target
AND here does not point to the last node)
{
make here point to the next node
}
◼ If (here points to a node containing the target)
return here;
else
return NULL;
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 27
Moving Through the List
◼ The pseudocode for search requires that pointer
here step through the list
◼ How does here follow the pointers from node
to node?
◼ When here points to a node, here->link is the
address of the next node
◼ To make here point to the next node, make the
assignment:
here = here->link;
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 28
A Refinement of search
◼ The search function can be refined in this way:
here = head;
while(here->data != target && here->link !=
NULL)
{
here = here->next;
} Check for last node
if (here->data = = target)
return here;
else
return NULL;
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 29
Searching an Empty List
◼ Our search algorithm has a problem
◼ If the list is empty, here equals NULL before
the while loop so…
◼ here->data is undefined
◼ here->link is undefined
◼ The empty list requires a special case in our
search function
◼ A refined search function that handles an
Display 13.7
empty list is shown in
Display 13.7
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 30
Pointers as Iterators
◼ An iterator is a construct that allows you to
cycle through the data items in a data structure
to perform an action on each item
◼ An iterator can be an object of an iterator class,
an array index, or simply a pointer
◼ A general outline using a pointer as an iterator:
Node_Type *iter;
for (iter = Head; iter != NULL; iter = iter->Link)
//perform the action on the node iter points to
◼ Head is a pointer to the head node of the list
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 31
Iterator Example
◼ Using the previous outline of an iterator we
can display the contents of a linked list in this
way:
NodePtr iter;
for (iter = Head; iter != NULL; iter = iter->Link)
cout << (iter->data);
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 32
Inserting a Node Inside a List
◼ To insert a node after a specified node in the
linked list:
◼ Use another function to obtain a pointer to the node
after which the new node will be inserted
◼ Call the pointer afterMe
◼ Use function insert, declared here to insert the node:
void insert(NodePtr afterMe, int theNumber);
Display 13.8
Display 13.8
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 33
Inserting the New Node
◼ Function insert creates the new node just as
headInsert did
◼ We do not want our new node at the head of the
list however, so…
◼ We use the pointer afterMe to insert the new
node
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 34
Inserting the New Node
◼ This code will accomplish the insertion of the
new node, pointed to by tempPtr, after the node
pointed to by afterMe:
tempPtr->link = afterMe->link;
afterMe->link = tempPtr;
2 3 7 9
head
2 2 2 0
5
afterMe tempPtr
2
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 35
Caution!
◼ The order of pointer assignments is critical
◼ If we changed afterMe->link to point to
tempPtr first, we would loose the rest of the list!
◼ The complete insert function is shown
in Display 13.9
Display 13.9
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 36
Function insert Again
◼ Notice that inserting into a linked list requires
that you only change two pointers
◼ This is true regardless of the length of the list
◼ Using an array for the list would involve
copying as many as all of the array elements to
new locations to make room for the new item
◼ Inserting into a linked list is often more efficient
than inserting into an array
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 37
Removing a Node
◼ To remove a node from a linked list
◼ Position a pointer, before, to point at the node
prior to the node to remove
◼ Position a pointer, discard, to point at the node
to remove
◼ Perform: before->link = discard->link;
◼ The node is removed from the list, but is still in
memory
◼ Return *discard to the freestore: delete Display 13.10
discard; Display 13.10
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 38
Assignment With Pointers
◼ If head1 and head2 are pointer variables and
head1 points to the head node of a list:
head2 = head1;
causes head2 and head1 to point to the same list
◼ There is only one list!
◼ If you want head2 to point to a separate copy,
you must copy the list node by node or
overload the assignment operator appropriately
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 39
Variations on Linked Lists
◼ Many other data structures can be constructed using
nodes and pointers
◼ Doubly-Linked List
◼ Each node has two links, one to the next node and one
to the previous node
◼ Allows easy traversal of the list in both directions
struct Node
{
int data;
Node *forwardLink;
Node *backLink; Display 13.11
}; Display 13.11
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 40
Binary Tree
◼ A tree is a data structure that looks like an
upside-down tree with the root at the top
◼ No cycles
◼ In a binary tree each node has at most two links
struct TreeNode
{
int data;
TreeNode *leftLink;
TreeNode *rightLink;
};
Display 13.12
Display 13.12
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 41
Linked List of Classes
◼ The preceding examples created linked lists of
structs. We can also create linked lists using
classes.
◼ Logic to use a class is identical except the syntax
of using and defining a class should be
substituted in place of that for a struct
◼ Interface and Definition for a Node Class
Display 13.13 Display 13.14 (1-2)
Display 13.13 Display 13.14 (1-2)
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 42
Program using the Node class
◼ We can create a linked list of numbers using the
Node class.
Display 13.15 (1-3)
Display 13.15 (1-3)
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 43
Section 13.1 Conclusion
◼ Can you
◼ Write type definitions for the nodes and
pointers in a linked list? Call the node type
NodeType and call the pointer type
PointerType. The linked lists will be lists of
letters.
◼ Explain why inserting into an array can be less
efficient than inserting into a linked list?
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 44
13.2
Stacks and Queues
Copyright © 2018 Pearson Addison-Wesley. All rights reserved.
A Linked List Application
◼ A stack is a data structure that retrieves data in
the reverse order the data was stored
◼ If 'A', 'B', and then 'C' are placed in a stack,
they will be removed in the order 'C', 'B', and
then 'A'
◼ A stack is a last-in/first-out data structure like
the stack of plates in a cafeteria; adding a plate
pushes down the stack and the top plate is the
first one removed Display 13.16
Display 13.16
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 46
Program Example:
A Stack Class
◼ We will create a stack class to store characters
◼ Adding an item to a stack is pushing onto the
stack
◼ Member function push will perform this task
◼ Removing an item from the stack is popping
the the item off the stack
◼ Member function pop will perform this task
Display 13.17
◼ Display 13.17 contains the stack class interface
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 47
Using the stack Class
Display 13.18 (1-2)
◼ Display 13.18 (1-2) demonstrates the use of the
stack class
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 48
Function push
◼ The push function adds an item to the stack
◼ It uses a parameter of the type stored in the stack
void push(char the_symbol);
◼ Pushing an item onto the stack is precisely the same
task accomplished by function headInsert of the linked
list
◼ For a stack, a pointer named top is used instead of a
pointer named head
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 49
Function pop
◼ The pop function returns the item that was at
the top of the stack
char pop( );
◼ Before popping an item from a stack, pop checks
that the stack is not empty
◼ pop stores the top item in a local variable result,
and the item is "popped" by: top = top->link;
◼ A temporary pointer must point to the old top item
so it can be "deleted" to prevent a memory leak
◼ pop then returns variable result
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 50
Empty Stack
◼ An empty stack is identified by setting the
top pointer to NULL
top = NULL;
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 51
The Copy Constructor
◼ Because the stack class uses a pointer and
creates new nodes using new, a copy constructor
is needed
◼ The copy constructor (a self-test exercise)
must make a copy of each item in the stack
and store the copies in a new stack
◼ Items in the new stack must be in the same position
in the stack as in the original
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 52
The stack destructor
◼ Because function pop calls delete each time an
item is popped off the stack, ~stack only needs
to call pop until the stack is empty
char next;
while( ! empty ( ) )
{
next = pop( );
}
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 53
stack Class Implementation
◼ The stack class implementation is
Display 13.19 (1)
found in
Display 13.19 (1) Display 13.19 (2)
Display 13.19 (2)
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 54
A Queue
◼ A queue is a data structure that retrieves data in
the same order the data was stored
◼ If 'A', 'B', and then 'C' are placed in a queue,
they will be removed in the order ‘A', 'B', and
then ‘C'
◼ A queue is a first-in/first-out data structure like
the checkout line in a supermarket
Display 13.20
Display 13.20
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 55
Queue Class Implementation
◼ The queue class is implemented in a manner
similar to the stack except there are two pointers,
one to track the front of the list, and one to track
the back of the list
◼ Interface: Display 13.21 (1-2)
Display 13.21 (1-2)
◼ Program using the Queue Class:
Display 13.22 (1-2)
Display 13.22 (1-2)
◼ Implementation: Display 13.23 (1-3)
Display 13.23 (1-3)
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 56
Section 13.2 Conclusion
◼ Can you
◼ Give the definition of member function push?
Create a definition for the stack class copy
constructor?
◼ Know when to use a queue vs. a stack?
◼ Create a definition for the queue class copy
constructor?
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 57
Chapter 13 -- End
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 58
Back Next
Display 13.1 Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 59
Back Next
Display 13.2 Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 60
Display 13.3
Next
Back
Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 61
Back Next
Display 13.4 Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 62
Back Next
Display 13.5 Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 63
Display 13.6
Back Next
Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 64
Display 13.7
Back Next
Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 65
Back Next
Display 13.8 Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 66
Back Next
Display 13.9 Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 67
Display 13.10
Back Next
Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 68
Next
Back
Display 13.11 Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 69
Next
Back
Display 13.12 Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 70
Display 13.13
Back Next
Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 71
Next
Back
Display 13.14 (1/2) Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 72
Display 13.14 (2/2)
Back Next
Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 73
Next
Back
Display 13.15 (1/3) Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 74
Display 13.15 (2/3)
Back Next
Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 75
Next
Back
Display 13.15 (3/3) Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 76
Next
Back
Display 13.16 Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 77
Display 13.17
Next
Back
Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 78
Display 13.18 (1/2)
Next
Back
Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 79
Display 13.18 Back
Next
(2/2) Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 80
Display 13.19 (1/2)
Back
Next
Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 81
Display 13.19 (2/2)
Next
Back
Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 82
Next
Back
Display 13.20 Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 83
Next
Back
Display 13.21 (1/2) Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 84
Next
Back
Display 13.21 (2/2) Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 85
Next
Back
Display 13.22 (1/2) Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 86
Next
Back
Display 13.22 (2/2) Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 87
Next
Back
Display 13.23 (1/3) Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 88
Display 13.23 (2/3)
Next
Back
Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 89
Display 13.23 (3/3)
Next
Back
Back Next
Copyright © 2018 Pearson Addison-Wesley. All rights reserved. Slide 13- 90