csc211 data structures lecture 9 linked lists instructor: prof. xiaoyan li department of computer...

88
CSC211 Data Structures Lecture 9 Lecture 9 Linked Lists Linked Lists Instructor: Prof. Xiaoyan Instructor: Prof. Xiaoyan Li Li Department of Computer Department of Computer Science Science Mount Holyoke College Mount Holyoke College

Upload: ella-eaves

Post on 30-Mar-2015

213 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

CSC211 Data Structures CSC211 Data Structures

Lecture 9Lecture 9Linked ListsLinked Lists

Instructor: Prof. Xiaoyan LiInstructor: Prof. Xiaoyan LiDepartment of Computer Science Department of Computer Science

Mount Holyoke CollegeMount Holyoke College

Page 2: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

MotivationMotivation

In a sequence using an array, inserting a In a sequence using an array, inserting a new item needs to move others back...new item needs to move others back...

1010 2020 3030 ?? ??

1818

Page 3: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

MotivationMotivation

In a sequence using an array, inserting a In a sequence using an array, inserting a new item needs to move others back...new item needs to move others back...

1010 2020 2020 3030 ??

1818

Page 4: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

MotivationMotivation

In a sequence using an array, inserting a In a sequence using an array, inserting a new item needs to move others back...new item needs to move others back...

So the Big-O of the insert is O(n)So the Big-O of the insert is O(n)

1010 1818 2020 3030 ??

Page 5: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

MotivationMotivation

How can we insert a new item without How can we insert a new item without moving others ?moving others ?

1010 2020 3030 ?? ??

1818

We need a new data structure

Page 6: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

MotivationMotivation

How can we insert a new item without How can we insert a new item without moving others ?moving others ?

1818

????303020201010

break an array into a linked chain...

Page 7: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

MotivationMotivation

How can we insert a new item without How can we insert a new item without moving others ?moving others ?

1818

????303020201010

and then put the new item into the chain

Page 8: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

MotivationMotivation

How can we insert a new item without How can we insert a new item without moving others ?moving others ?

1818

????303020201010

But the links (->) need some way to build up

Page 9: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Chapter 5 introduces the often-used data structure of linked lists.

This presentation shows how to implement the most common operations on linked lists.

Linked Lists in ActionLinked Lists in Action

CHAPTER 5Data Structures and Other Objects

Page 10: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Each node in the linked list is a class, as shown here.

data

link

10

data

link

15

data

link

7

null

class node{public: typedef int value_type; ...private: value_type data; node *link;};

Declarations for Linked ListsDeclarations for Linked Lists

Page 11: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

data

link

7

The data portion of each node is a type called value_type, defined by a typedef.

link

null

data

link

15

Declarations for Linked ListsDeclarations for Linked Lists

data10

class node{public: typedef int value_type; ...private: value_type data; node *link;};

Page 12: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Each node also contains a link field which is a pointer to another node.

data15

data7

Declarations for Linked ListsDeclarations for Linked Lists

data10

link

link

null

link

class node{public: typedef int value_type; ...private: value_type data; node *link;};

Page 13: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Declarations for Linked ListsDeclarations for Linked Lists

A program can keep track of the first node by using a pointer variable such as head_ptr in this example.

Notice that head_ptr itself is not a node -- it is a pointer to a node. data

link

10

data

link

15

data

link

7

nullhead_ptr

node * head_ptr;

Page 14: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Declarations for Linked ListsDeclarations for Linked Lists

A program can also keep track of the last node by using a pointer variable such as tail_ptr in this example.

Notice that tail_ptr itself is not a node -- it is a pointer to a node. data

link

10

data

link

15

data

link

7

nullhead_ptr

node * head_ptr;node * tail_ptr;

tail_ptr

Page 15: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Declarations for Linked ListsDeclarations for Linked Lists

A program can keep track of the first and the last nodes by using pointer variables such as head_ptr, tail_ptr.

Notice that neither head_ptr nor tail_ptr is a node -- it is a pointer to a node.

For an empty list, null is stored in both the head and the tail pointers.

head_ptr

nulltail_ptr

null

node * head_ptr;

node * tail_ptr;

head_ptr = NULL;

tail_ptr = NULL;

// NULL can be used for any pointers!

Page 16: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

The Complete node Class DefinitionThe Complete node Class Definition

The node class is fundamental to linked listsThe node class is fundamental to linked lists The private member variablesThe private member variables

data: a value_type variabledata: a value_type variable link: a pointer to the next nodelink: a pointer to the next node

The member functions include:The member functions include: A constructorA constructor Set data and set linkSet data and set link Retrieve data and retrieve linkRetrieve data and retrieve link

Page 17: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

The Complete node Class DefinitionThe Complete node Class Definition

The node class is fundamental to linked listsThe node class is fundamental to linked lists The private member variablesThe private member variables

data_fielddata_field link_fieldlink_field

The member functions include:The member functions include: A constructorA constructor Set data and set linkSet data and set link Retrieve data and retrieve linkRetrieve data and retrieve link

class node { public:

// TYPEDEFtypedef double value_type;

// CONSTRUCTORnode( const value_type& init_data = value_type( ), node* init_link = NULL){ data = init_data; link = init_link; }

// Member functions to set the data and link fields: void set_data(const value_type& new_data) { data = new_data; } void set_link(node* new_link) { link = new_link; }

// Constant member function to retrieve the current data:value_type data( ) const { return data; }

// Two slightly different member functions to retrieve// the current link:const node* link( ) const { return link; }

node* link( ) { return link;}

private:value_type data;node* link;

};

default argument given by the value_type default constructor (no DC for int and double in old versions of C++)

Why TWO? p. 213--

Page 18: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

A Small Quiz - A Small Quiz -

Suppose a a program has built the linked list as shown, and head_ptr is a pointer to a node. What is the data type of *head_ptr? cout << (*head_ptr). data(); cout << head_ptr->data();

data

link

10

data

link

15

data

link

7

nullhead_ptr

Page 19: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Linked List ToolkitLinked List Toolkit

Design Container Classes using Linked Design Container Classes using Linked ListsLists The use of a linked list is similar to our The use of a linked list is similar to our

previous use of an array in a container classprevious use of an array in a container class But storing and retrieving needs more work But storing and retrieving needs more work

since we do not have that handy indexing since we do not have that handy indexing => Linked List Toolbox => Linked List Toolbox

using node classusing node class

Page 20: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

The Workings of four functionsThe Workings of four functions

This lecture will show four functions:This lecture will show four functions: Compute the length of a linked list (code)Compute the length of a linked list (code) Insert a new node at the head (code)Insert a new node at the head (code) Insert a node at any location (pseudo-code)Insert a node at any location (pseudo-code) Delete a node from the head (pseudo-code)Delete a node from the head (pseudo-code)

Read Section 5.2 for other functions in the Read Section 5.2 for other functions in the ToolboxToolbox will be used in container classes bag and sequencewill be used in container classes bag and sequence

Page 21: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

size_t list_length(const node* head_ptr);

Length of a Linked ListLength of a Linked List

We simply want to compute the We simply want to compute the lengthlength of the linked list, for of the linked list, for example the one shown here.example the one shown here.

Note that list_length is not a Note that list_length is not a member function of the node member function of the node classclass

10

15

7

nullhead_ptr

Page 22: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

size_t list_length(const node* head_ptr);

Pseudo-code of list_lengthPseudo-code of list_length

Page 23: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

size_t list_length(const node* head_ptr);

Pseudo-code of list_lengthPseudo-code of list_length

1.1. Initialize the Initialize the countcount to zero. to zero.

2.2. Make Make cursorcursor point to each point to each node, starting at the head. node, starting at the head. Each time Each time cursorcursor points to a points to a new node, add 1 to new node, add 1 to countcount..

3.3. return return countcount..10

15

7

nullhead_ptr

count

0

Page 24: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

size_t list_length(const node* head_ptr);

Pseudo-code of list_lengthPseudo-code of list_length

1.1. Initialize the Initialize the countcount to zero. to zero.

2.2. Make Make cursorcursor point to each point to each node, starting at the head. node, starting at the head. Each time Each time cursorcursor points to a points to a new node, add 1 to new node, add 1 to countcount..

3.3. return return countcount..10

15

7

nullhead_ptr

count

1

cursor

Page 25: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

size_t list_length(const node* head_ptr);

Pseudo-code of list_lengthPseudo-code of list_length

1.1. Initialize the Initialize the countcount to zero. to zero.

2.2. Make Make cursorcursor point to each point to each node, starting at the head. node, starting at the head. Each time Each time cursorcursor points to a points to a new node, add 1 to new node, add 1 to countcount..

3.3. return return countcount..10

15

7

nullhead_ptr

count

2

cursor

Page 26: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

size_t list_length(const node* head_ptr);

Pseudo-code of list_lengthPseudo-code of list_length

1.1. Initialize the Initialize the countcount to zero. to zero.

2.2. Make Make cursorcursor point to each point to each node, starting at the head. node, starting at the head. Each time Each time cursorcursor points to a points to a new node, add 1 to new node, add 1 to countcount..

3.3. return return countcount..10

15

7

nullhead_ptr

count

3

cursor

Page 27: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

size_t list_length(const node* head_ptr);

Pseudo-code of list_lengthPseudo-code of list_length

1.1. Initialize the Initialize the countcount to zero. to zero.

2.2. Make Make cursorcursor point to each point to each node, starting at the head. node, starting at the head. Each time Each time cursorcursor points to a points to a new node, add 1 to new node, add 1 to countcount..

3.3. return return countcount..10

15

7

nullhead_ptr

count

3

cursor

Page 28: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

size_t list_length(const node* head_ptr){ const node *cursor; size_t count = 0; // step 1 for (cursor = head_ptr; cursor != NULL; cursor = cursor->link())

count++; // step 2 return count; // step 3}

Real code of list_length: List TraverseReal code of list_length: List Traverse

1.1. Initialize the Initialize the countcount to zero. to zero.2.2. Each time Each time cursorcursor points to a new points to a new

node, add 1 to node, add 1 to countcount..3.3. return return countcount..

10

15

7

nullhead_ptrcount

0

cursor

Page 29: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

size_t list_length(const node* head_ptr){ const node *cursor; size_t count = 0; // step 1 for (cursor = head_ptr; cursor != NULL; cursor = cursor->link())

count++; // step 2 return count; // step 3}

Real code of list_length: List TraverseReal code of list_length: List Traverse

1.1. Initialize the Initialize the countcount to zero. to zero.2.2. Each time Each time cursorcursor points to a new points to a new

node, add 1 to node, add 1 to countcount..3.3. return return countcount..

10

15

7

nullhead_ptrcount

1

cursor

Page 30: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

size_t list_length(const node* head_ptr){ const node *cursor; size_t count = 0; // step 1 for (cursor = head_ptr; cursor != NULL; cursor = cursor->link())

count++; // step 2 return count; // step 3}

Real code of list_length: List TraverseReal code of list_length: List Traverse

1.1. Initialize the Initialize the countcount to zero. to zero.2.2. Each time Each time cursorcursor points to a new points to a new

node, add 1 to node, add 1 to countcount..3.3. return return countcount..

10

15

7

nullhead_ptrcount

2

cursor

Page 31: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

size_t list_length(const node* head_ptr){ const node *cursor; size_t count = 0; // step 1 for (cursor = head_ptr; cursor != NULL; cursor = cursor->link())

count++; // step 2 return count; // step 3}

Real code of list_length: List TraverseReal code of list_length: List Traverse

1.1. Initialize the Initialize the countcount to zero. to zero.2.2. Each time Each time cursorcursor points to a new points to a new

node, add 1 to node, add 1 to countcount..3.3. return return countcount..

10

15

7

nullhead_ptrcount

3

cursor

Page 32: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

size_t list_length(const node* head_ptr){ const node *cursor; size_t count = 0; for (cursor = head_ptr; cursor != NULL; cursor = cursor->link())

count++; return count; // step 3}

Big-O of list_lengthBig-O of list_length

Big-O: O (n) if length is nBig-O: O (n) if length is n 10

15

7

nullhead_ptrcount

3

cursor

Page 33: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

size_t list_length(const node* head_ptr){ const node *cursor; size_t count = 0; for (cursor = head_ptr; cursor != NULL; cursor = cursor->link())

count++; return count;}

Is list_length works for an empty list?Is list_length works for an empty list?

cursor = head_ptr = NULLcursor = head_ptr = NULL

count = 0count = 0

count

0head_ptr

null

cursor

null

Page 34: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

The Workings of four functionsThe Workings of four functions

This lecture will show four functions:This lecture will show four functions: Compute the length of a linked list (code)Compute the length of a linked list (code) Insert a new node at the head (code)Insert a new node at the head (code) Insert a node at any location (pseudo-code)Insert a node at any location (pseudo-code) Delete a node from the head (pseudo-code)Delete a node from the head (pseudo-code)

Read Section 5.2 for other functions in the Read Section 5.2 for other functions in the ToolboxToolbox will be used in container classes bag and sequencewill be used in container classes bag and sequence

Page 35: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

void list_head_insert(node*& head_ptr, const node::value_type& entry);

Inserting a node at the HeadInserting a node at the Head

We want to add a new entry, 13, We want to add a new entry, 13, to the to the headhead of the linked list of the linked list shown here.shown here.

Note that head_ptr is a reference Note that head_ptr is a reference node pointernode pointer

10

15

7

nullhead_ptr

entry

13

Page 36: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Inserting a Node at the HeadInserting a Node at the Head

Create a new node, pointed to by a local variable insert_ptr.

10

15

77

nullhead_ptr

entry

13

insert_ptr

void list_head_insert(node*& head_ptr, const node::value_type& entry);

Page 37: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Inserting a Node at the HeadInserting a Node at the Head

insert_ptr = new node;

10

15

77

nullhead_ptr

entry

13

insert_ptr

void list_head_insert(node*& head_ptr, const node::value_type& entry);

Page 38: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Inserting a Node at the HeadInserting a Node at the Head

insert_ptr = new node; Place the data in the new

node's data field.

10

15

7

nullhead_ptr

entry

13

insert_ptr13

void list_head_insert(node*& head_ptr, const node::value_type& entry);

Page 39: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Inserting a Node at the HeadInserting a Node at the Head

insert_ptr = new node; insert_ptr->data = entry;

10

15

7

nullhead_ptr

entry

13

insert_ptr13?

What expression appears on the left side of the assignment statement ?

void list_head_insert(node*& head_ptr, const node::value_type& entry);

Page 40: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Inserting a Node at the HeadInserting a Node at the Head

insert_ptr = new node; insert_ptr->data = entry;

10

15

7

nullhead_ptr

entry

13

insert_ptr13

But data is a private variable, so cannot be accessed by a non-member function

void list_head_insert(node*& head_ptr, const node::value_type& entry);

Page 41: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Inserting a Node at the HeadInserting a Node at the Head

insert_ptr = new node; insert_ptr->data = entry;

10

15

7

nullhead_ptr

entry

13

insert_ptr13

But data is a private variable, so cannot be accessed by a non-member function

void list_head_insert(node*& head_ptr, const node::value_type& entry);

X

Page 42: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Inserting a Node at the HeadInserting a Node at the Head

insert_ptr = new node; insert_ptr->set_data(entry);

10

15

7

nullhead_ptr

entry

13

insert_ptr13

Instead, Set_data function is used since data_field is a private variable of the node class

void list_head_insert(node*& head_ptr, const node::value_type& entry);

Page 43: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Inserting a Node at the HeadInserting a Node at the Head

10

15

7

nullhead_ptr

entry

13

insert_ptr13

insert_ptr = new node; insert_ptr->set_data(entry); Connect the new node to the

front of the list.

void list_head_insert(node*& head_ptr, const node::value_type& entry);

Page 44: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Inserting a Node at the HeadInserting a Node at the Head

10

15

7

nullhead_ptr

entry

13

insert_ptr13

What will be the parameter ?

insert_ptr = new node; insert_ptr->set_data(entry); insert_ptr->set_link(head_ptr);?

void list_head_insert(node*& head_ptr, const node::value_type& entry);

Page 45: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Inserting a Node at the HeadInserting a Node at the Head

10

15

7

nullhead_ptr

entry

13

insert_ptr13

The new node is linked to the node that head_ptr is pointing to.

insert_ptr = new node; insert_ptr->set_data(entry); insert_ptr->set_link(head_ptr);

void list_head_insert(node*& head_ptr, const node::value_type& entry);

Page 46: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Inserting a Node at the HeadInserting a Node at the Head

10

15

7

nullhead_ptr

entry

13

insert_ptr13

insert_ptr = new node; insert_ptr->set_data(entry); insert_ptr->set_link(head_ptr); Make the head_ptr point to the new

head of the linked list.

void list_head_insert(node*& head_ptr, const node::value_type& entry);

Page 47: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Inserting a Node at the HeadInserting a Node at the Head

10

15

7

nullhead_ptr

entry

13

insert_ptr13

insert_ptr = new node; insert_ptr->set_data(entry); insert_ptr->set_link(head_ptr); head_ptr = insert_ptr;head_ptr = insert_ptr;

void list_head_insert(node*& head_ptr, const node::value_type& entry);

Page 48: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Inserting a Node at the HeadInserting a Node at the Head

insert_ptr = new node; insert_ptr->set_data(entry); insert_ptr->set_link(head_ptr); head_ptr = insert_ptr;head_ptr = insert_ptr;

10

15

7

nullhead_ptr

13

When the function returns, thelinked list has a new node at thehead, containing 13.

void list_head_insert(node*& head_ptr, const node::value_type& entry);

Page 49: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

void list_head_insert(node*& head_ptr, const node::value_type& entry){ node *insert_ptr;

insert_ptr = new node;

insert_ptr->set_data(entry);

insert_ptr->set_link(head_ptr);

head_ptr = insert_ptr;

}

Inserting a Node at the HeadInserting a Node at the Head

Linked List: O(1)

- cmp: Array: O(n)

What is the Big-O of

the head_insert function?

What is the Big-O of

the head_insert function?

Page 50: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

void list_head_insert(node*& head_ptr, const node::value_type& entry){ node *insert_ptr;

insert_ptr = new node;

insert_ptr->set_data(entry);

insert_ptr->set_link(head_ptr);

head_ptr = insert_ptr;

}

Inserting a Node at the HeadInserting a Node at the Head

Does the function work

correctly for the empty list ?

Page 51: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

void list_head_insert(node*& head_ptr, const node::value_type& entry){ node *insert_ptr;

insert_ptr = new node;

insert_ptr->set_data(entry);

insert_ptr->set_link(head_ptr);

head_ptr = insert_ptr;

}

Inserting a Node at the HeadInserting a Node at the Head

head_ptrentry

13 null

Does the function work

correctly for the empty list ?

Page 52: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

void list_head_insert(node*& head_ptr, const node::value_type& entry){ node *insert_ptr;

insert_ptr = new node;

insert_ptr->set_data(entry);

insert_ptr->set_link(head_ptr);

head_ptr = insert_ptr;

}

Inserting a Node at the FrontInserting a Node at the Front

head_ptrentry

13 nullinsert_ptr

13

Page 53: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

void list_head_insert(node*& head_ptr, const node::value_type& entry){ node *insert_ptr;

insert_ptr = new node;

insert_ptr->set_data(entry);

insert_ptr->set_link(head_ptr);

head_ptr = insert_ptr;

}

Inserting a Node at the HeadInserting a Node at the Head

head_ptrentry

13 nullinsert_ptr

13

null

Page 54: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

void list_head_insert(node*& head_ptr, const node::value_type& entry){ node *insert_ptr;

insert_ptr = new node;

insert_ptr->set_data(entry);

insert_ptr->set_link(head_ptr);

head_ptr = insert_ptr;

}

Inserting a Node at the HeadInserting a Node at the Head

head_ptrentry

13insert_ptr

13

null

Page 55: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

void list_head_insert(node*& head_ptr, const node::value_type& entry){ node *insert_ptr;

insert_ptr = new node;

insert_ptr->set_data(entry);

insert_ptr->set_link(head_ptr);

head_ptr = insert_ptr;

}

Inserting a Node at the HeadInserting a Node at the Head

head_ptr

13

null

When the functionreturns, the linked list

has one node,containing 13.

Page 56: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Caution!Caution!

Always make sure that your linked list functions work correctly with an empty list.

EMPTY LIST

Page 57: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

void list_head_insert(node*& head_ptr, const node::value_type& entry){ node *insert_ptr;

insert_ptr = new node;

insert_ptr->set_data(entry);

insert_ptr->set_link(head_ptr);

head_ptr = insert_ptr;

}

Inserting a Node at the HeadInserting a Node at the Head

Q: Can you give an implementation with ONLY a single statement?

Page 58: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

void list_head_insert(node*& head_ptr, const node::value_type& entry){ node *insert_ptr;

insert_ptr = new node(entry, head_ptr);

head_ptr = insert_ptr;

}

Inserting a Node at the HeadInserting a Node at the Head

YES, we can use the constructor with parameters!

Page 59: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

void list_head_insert(node*& head_ptr, const node::value_type& entry){

head_ptr = new node(entry, head_ptr);

}

Inserting a Node at the HeadInserting a Node at the Head

and assign the return pointer of new directly to the head pointer !

Page 60: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

The Workings of four functionsThe Workings of four functions

This lecture will show four functions:This lecture will show four functions: Compute the length of a linked list (code)Compute the length of a linked list (code) Insert a new node at the head (code)Insert a new node at the head (code) Insert a node at any location (pseudo-code)Insert a node at any location (pseudo-code) Delete a node from the head (pseudo-code)Delete a node from the head (pseudo-code)

Read Section 5.2 for other functions in the Read Section 5.2 for other functions in the ToolboxToolbox will be used in container classes bag and sequencewill be used in container classes bag and sequence

Page 61: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

Nodes are often inserted at places other than the front of a linked list.

There is a general pseudocode that you can follow for any insertion function. . .

Page 62: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

Determine whether the new node will be the first node in the linked list. If so, then there is only one step:

list_head_insert(head_ptr, entry);

Page 63: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

Determine whether the new node will be the first node in the Determine whether the new node will be the first node in the linked list. If so, then there is only one step:linked list. If so, then there is only one step:

The

func

tion

we

alre

ady

wro

te

The

func

tion

we

alre

ady

wro

te

list_head_insert(head_ptr, entry);

Page 64: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

Determine whether the new node will be the first node in the linked list. If so, then there is only one step:

list_head_insert(head_ptr, entry);

A pointerto the

head ofthe list

A pointerto the

head ofthe list

Page 65: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

Determine whether the new node will be the first node in the linked list. If so, then there is only one step:

list_head_insert(head_ptr, entry);

The data to put

in the new node

The data to put

in the new node

Page 66: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the

node which is just before the new node's position.

Page 67: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

15

10

7

nullhead_ptr

Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the

node which is just before the new node's position.

In this example, thenew node will bethe second node

In this example, thenew node will bethe second node

previous_ptr

Page 68: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

15

10

7

nullhead_ptr

Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the

node which is just before the new node's position

What is the name of this pointer ?

Look at the pointerwhich is in the node

*previous_ptr

Look at the pointerwhich is in the node

*previous_ptr

previous_ptr

Page 69: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

15

10

7

nullhead_ptr

Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the

node which is just before the new node's position

This pointer is calledprevious_ptr->link

This pointer is calledprevious_ptr->link

Always remember how Always remember how can you access link can you access link

previous_ptr

Page 70: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

15

10

7

nullhead_ptr

Otherwise (if the new node will not be first):Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the

node which is just before the new node's position

previous_ptr->linkpoints to the headof a smaller linkedlist, with 10 and 7

previous_ptr->linkpoints to the headof a smaller linkedlist, with 10 and 7

previous_ptr

Page 71: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

15

10

7

nullhead_ptr

Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the

node which is just before the new node's position.

The new node mustbe inserted at thehead of this small

linked list.

The new node mustbe inserted at thehead of this small

linked list.

13

Write one C++ statement which will do the insertion.

previous_ptr

Page 72: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

15

10

7

nullhead_ptr

Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the

node which is just before the new node's position.13

Write one C++ statement which will do the insertion.

previous_ptrlist_head_insert(previous_ptr->link, entry);

priv

ate

vari

able

?!!

priv

ate

vari

able

?!!

X

Page 73: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

15

10

7

nullhead_ptr

Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the

node which is just before the new node's position.13

More precisely, you need to use member function link() , and have three lines of code

previous_ptr

node *sl_head_ptr;sl_head_ptr = previous_ptr->link(); list_head_insert(sl_head_ptr, entry);previous_ptr->set_link(sl_head_ptr);

sl_head_ptr

Page 74: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

15

10

7

nullhead_ptr

Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the

node which is just before the new node's position.13

More precisely, you need to use member function link() , and have three lines of code

previous_ptr

node *sl_head_ptr;sl_head_ptr = previous_ptr->link(); list_head_insert(sl_head_ptr, entry);previous_ptr->set_link(sl_head_ptr);

sl_head_ptr

Page 75: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

15

10

7

nullhead_ptr

Otherwise (if the new node will not be first): Start by setting a pointer named previous_ptr to point to the

node which is just before the new node's position.13

More precisely, you need to use member function link() , and have three lines of code

previous_ptr

node *sl_head_ptr;sl_head_ptr = previous_ptr->link(); list_head_insert(sl_head_ptr, entry);previous_ptr->set_link(sl_head_ptr);

sl_head_ptr

Page 76: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

Determine whether the new node will be the first node in the linked list. If so, then there is only one step:

list_head_insert(head_ptr, entry);

Otherwise (if the new node will not be first): Set a pointer named previous_ptr to point to the node

which is just before the new node's position. Do the following :

node *sl_head_ptr;sl_head_ptr = previous_ptr->link(); list_head_insert(sl_head_ptr, entry);previous_ptr->set_link(sl_head_ptr);

Page 77: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Inserting NodesPseudocode for Inserting Nodes

The process of adding a new node in the middle of a list The process of adding a new node in the middle of a list ((only the step after previous_ptr has been setonly the step after previous_ptr has been set) can also be ) can also be incorporated as a separate function. This function is called incorporated as a separate function. This function is called list_insertlist_insert in the linked list toolkit of Section 5.2. in the linked list toolkit of Section 5.2.

Challenge yourself: Challenge yourself: The textbook actually gives you a different implementation (p 235, 4 The textbook actually gives you a different implementation (p 235, 4

lines of code)lines of code) Can you implement Can you implement list_insertlist_insert with just one line of code? with just one line of code?

Don’t use list_head_insert Don’t use list_head_insert See Self-Test Ex 16See Self-Test Ex 16

Page 78: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

The Workings of four functionsThe Workings of four functions

This lecture will show four functions:This lecture will show four functions: Compute the length of a linked list (code)Compute the length of a linked list (code) Insert a new node at the head (code)Insert a new node at the head (code) Insert a node at any location (pseudo-code)Insert a node at any location (pseudo-code) Delete a node from the head (pseudo-code)Delete a node from the head (pseudo-code)

Read Section 5.2 for other functions in the Read Section 5.2 for other functions in the ToolboxToolbox will be used in container classes bag and sequencewill be used in container classes bag and sequence

Page 79: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Pseudocode for Removing NodesPseudocode for Removing Nodes

Nodes often need to be removed from a linked list. As with insertion, there is a technique for removing

a node from the front of a list, and a technique for removing a node from elsewhere.

We’ll look at the pseudocode for removing a node from the head of a linked list.

Page 80: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Removing the Head NodeRemoving the Head Node

10 15

7

nullhead_ptr

13

Start by setting up a temporary pointer named remove_ptr to the head node.

remove_ptr

Page 81: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Removing the Head NodeRemoving the Head Node

10 15

7

nullhead_ptr

13

Set up Set up remove_ptr.. head_ptr = remove_ptr->link();

remove_ptr

Draw the change that this statement will make to the linked list.

Page 82: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Removing the Head NodeRemoving the Head Node

10 15

7

nullhead_ptr

13

Set up Set up remove_ptr.. head_ptr = remove_ptr->link();

remove_ptr

Page 83: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Removing the Head NodeRemoving the Head Node

Set up Set up remove_ptr.. head_ptr = remove_ptr->link; delete remove_ptr; // Return the node's memory to heap.

10 15

7

nullhead_ptr

13

remove_ptr

Page 84: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Removing the Head NodeRemoving the Head Node

Here’s what the linked list looks like after the removal finishes.

10 15

7

nullhead_ptr

Page 85: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

It is easy to insert a node at the front of a list. The linked list toolkit also provides a function for

inserting a new node elsewhere It is easy to remove a node at the front of a list. The linked list toolkit also provides a function for

removing a node elsewhere--you should read about this function and the other functions of the toolkit.

Summary Summary

Page 86: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Key points you need to knowKey points you need to know

Linked List Toolkit uses the node class which hasLinked List Toolkit uses the node class which has set and retrieve functionsset and retrieve functions

The functions in the Toolkit are not member The functions in the Toolkit are not member functions of the node classfunctions of the node class length, insert(2), remove(2), search, locate, copy,...length, insert(2), remove(2), search, locate, copy,... compare their Big-Os with similar functions for an compare their Big-Os with similar functions for an

arrayarray

They can be used in various container classes, They can be used in various container classes, such as bag, sequence, etc.such as bag, sequence, etc.

Toolkit Code

Page 87: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

Homework...Homework...

Self-Test Exercises (node)Self-Test Exercises (node) 1-121-12

Read after classRead after class Linked List ToolKit (Section 5.2)Linked List ToolKit (Section 5.2) Do Self-Test Ex 13 -25 Do Self-Test Ex 13 -25

Read before the next lectureRead before the next lecture Section 5.3- 5.4Section 5.3- 5.4

Programming Assignment 4Programming Assignment 4 Detailed guidelines online!Detailed guidelines online!

Page 88: CSC211 Data Structures Lecture 9 Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer Science Mount Holyoke College

THE ENDTHE END

Presentation copyright 1997, Addison Wesley Longman,For use with Data Structures and Other Objects Using C++by Michael Main and Walter Savitch.

Some artwork in the presentation is used with permission from Presentation Task Force(copyright New Vision Technologies Inc) and Corel Gallery Clipart Catalog (copyrightCorel Corporation, 3G Graphics Inc, Archive Arts, Cartesia Software, Image ClubGraphics Inc, One Mile Up Inc, TechPool Studios, Totem Graphics Inc).

Students and instructors who use Data Structures and Other Objects Using C++ are welcometo use this presentation however they see fit, so long as this copyright notice remainsintact.