Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with...

34
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++ Early Objects Seventh Edition by Tony Gaddis, Judy Walters, and Godfrey Muganda Chapter 17: Linked Lists

description

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Linked List Terminology The node at the beginning is called the head of the list The entire list is identified by the pointer to the head node. This pointer is called the list head. 17-3

Transcript of Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with...

Page 1: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Starting Out with C++ Early Objects Seventh Edition

by Tony Gaddis, Judy Walters, and Godfrey Muganda

Chapter 17: Linked Lists

Page 2: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

17.1 Introduction to the Linked List ADT

• Linked list: a sequence of data structures (nodes) with each node containing a pointer to its successor

• The last node in the list has its successor pointer set to NULL

17-2

NULL

listhead

Page 3: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Linked List Terminology

• The node at the beginning is called the head of the list

• The entire list is identified by the pointer to the head node. This pointer is called the list head.

17-3

Page 4: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Linked Lists

• Nodes can be added or removed from the linked list during execution

• Addition or removal of nodes can take place at beginning, end, or middle of the list

17-4

NULLlist

head Add or delete node

Page 5: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Linked Lists vs. Arrays and Vectors

• Linked lists can grow and shrink as needed, unlike arrays, which have a fixed size

• Unlike vectors, insertion or removal of a node in the middle of the list is very efficient

17-5

NULL

listhead

Page 6: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Node Organization

A node contains:– data: one or more data fields – may be

organized as structure, object, etc.– a pointer that can point to another node

17-6

datapointer

Page 7: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Empty List

• A list with no nodes is called the empty list

• In this case the list head is set to NULL

17-7

NULL

listhead

Page 8: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

C++ Implementation

Implementation of nodes requires a structure containing a pointer to a structure of the same type:struct ListNode{ int data; ListNode *next;};

17-8

Page 9: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

C++ Implementation

Nodes can be equipped with constructors:struct ListNode{ int data; ListNode *next; ListNode(int d, ListNode* p=NULL) {data = d; next = p;}};

17-9

Page 10: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Creating an Empty List

• Define a pointer for the head of the list:ListNode *head = NULL;

• Head pointer initialized to NULL to indicate an empty list

17-10

NULL

head

Page 11: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

17.2 Linked List Operations

• Basic operations:– add a node to the end of the list– insert a node within the list– traverse the linked list– delete a node– delete/destroy the list

17-11

Page 12: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Creating a Node

ListNode *p; int num = 23;p = new ListNode(num);

17-12

NULL23

p

Page 13: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Appending an Item

• To add an item to the end of the list:– If the list is empty, set head to a new node

containing the item head = new ListNode(num);– If the list is not empty, move a pointer p to

the last node, then add a new node containing the item

p->next = new ListNode(num);

17-13

Page 14: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Appending an Item

17-14

listhead

5 13 23

p

NULL

List originally has 5, 13.p locates the last node, then a node with a new item, 23, is added

Page 15: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Inserting a Node

• Used to insert an item into a sorted list, keeping the list sorted.

• Two possibilities:– Insertion is at the head of the list (because

item at head is already greater than item being inserted, or because list is empty

– Insertion is after an existing node in a non-empty list

17-15

Page 16: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Inserting a Node at Head of a List

• Test to see if– head pointer is null, or – node value pointed at by head is greater

than value to be inserted• Must test in this order: unpredictable

results if second test is attempted on an empty list

• Create new node, set its next pointer to head, then point head to it

17-16

Page 17: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Inserting a Node in Body of a List

• Requires two pointers to traverse the list:– pointer to locate the node with data value

greater than that of node to be inserted– pointer to 'trail behind' one node, to point to

node before point of insertion• New node is inserted between the nodes

pointed at by these pointers

17-17

Page 18: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Inserting a Node into a Linked List

17-18

NULL

listhead

5 13 19

17

nodePtrpreviousNode

Correct position locatedItem to insert

num

Page 19: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Inserting a Node into a Linked List

17-19

NULL

listhead

5 13 19

17

nodePtrpreviousNode

New node created and inserted in order in the linked list

Page 20: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Traversing a Linked List

• List traversals visit each node in a linked list to display contents, validate data, etc.

• Basic process of traversal:set a pointer to the head pointerwhile pointer is not NULL

process dataset pointer to the successor of the current node

end while

17-20

Page 21: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Traversing a Linked List

17-21

NULL

listhead

5 13 19

nodePtr

nodePtr points to the node containing 5, then thenode containing 13, then the node containing 19,then points to NULL, and the list traversal stops

Page 22: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Removing an Element

• Used to remove a node from a linked list• Requires two pointers: one to locate the

node to be deleted, one to point to the node before the node to be deleted

17-22

Page 23: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Deleting a Node

17-23

NULL

listhead

5 13 19

nodePtrpreviousNode

Locating the node containing 13

Contents of node to be

deleted: 13

Page 24: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Deleting a Node

17-24

NULL

listhead

5 13 19

nodePtrpreviousNode

Adjusting pointer around the node to be deleted

Page 25: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Deleting a Node

17-25

NULL

listhead

5 19

nodePtrpreviousNode

Linked list after deleting the node containing 13

Page 26: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Destroying a Linked List

• Must remove all nodes used in the list

• To do this, use list traversal to visit each node

• For each node,– Unlink the node from the list

– Free the node’s memory

• Finally, set the list head to NULL17-26

Page 27: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

17.4 Recursive Linked List Operations

• A non-empty linked list consists of a head node followed by the rest of the nodes

• The rest of the nodes form a linked list that is called the tail of the original list

17-27

Page 28: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Recursive Linked List Operations

Many linked list operations can be broken down into the smaller problems of processing the head of the list and then recursively operating on the tail of the list

17-28

Page 29: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Recursive Linked List Operations

To find the length (number of elements) of a list– If the list is empty, the length is 0 (base case)– If the list is not empty, find the length of the

tail and then add 1 to obtain length of original list

17-29

Page 30: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Recursive Linked List Operations

To find the length of a list:

int length(ListNode *myList) { if (myList == NULL) return 0; else return 1 + length(myList->next); }

17-30

Page 31: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Other Recursive Linked List Operations

General design considerations:

• Base case is often when the list is empty

• Recursive case often involves the use of the tail of the list (i.e., the list without the head). Since the tail has one fewer entry than the list that was passed in to this call, the recursion eventually stops.

17-31

Page 32: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

17.5 Variations of the Linked List

doubly-linked list: each node contains two pointers: one to the next node in the list, one to the previous node in the list

17-32

NULL

listhead

5 13 19

NULL

Page 33: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

Variations of the Linked List

circular linked list: the last node in the list points back to the first node in the list, not to NULL

17-33

listhead

5 13 19

Page 34: Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++…

Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley

17.6 The STL list Container

• Template for a doubly linked list• Member functions for

– locating beginning, end of list: front, back, end

– adding elements to the list: insert, merge, push_back, push_front

– removing elements from the list: erase, pop_back, pop_front, unique

17-34