0% found this document useful (0 votes)
19 views90 pages

CH 13 LinkedList StackQueue

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
19 views90 pages

CH 13 LinkedList StackQueue

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

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

You might also like