Linked Lists. Contents. Steven J. Zeil. July 31, Linked Lists: the Basics 4

Similar documents
Linked Lists. Contents. Steven J. Zeil. July 31, Linked Lists: the Basics 3

Copying Data. Contents. Steven J. Zeil. November 13, Destructors 2

Operator Overloading

Operator Overloading

Chapter 17: Linked Lists

Encapsulation. Contents. Steven Zeil. July 17, Encapsulation Encapsulation in C Classes 4. 3 Hiding Attributes 8

A C++ Class Designer s Checklist

Defensive Programming

Chapter 17: Linked Lists

Unit Testing. Contents. Steven Zeil. July 22, Types of Testing 2. 2 Unit Testing Scaffolding Drivers Stubs...

Unit Testing. Steven Zeil. July 22, Types of Testing 2. 2 Unit Testing Scaffolding Drivers Stubs...

CSCE 110 PROGRAMMING FUNDAMENTALS

2. List Implementations (a) Class Templates (b) Contiguous (c) Simply Linked (d) Simply Linked with Position Pointer (e) Doubly Linked

CSCE 110 PROGRAMMING FUNDAMENTALS

The combination of pointers, structs, and dynamic memory allocation allow for creation of data structures

Patterns: Working with Arrays

Lab 2: ADT Design & Implementation

Java - First Impressions for a C++ Programmer

Traversing Trees with Iterators

Traversing Trees with Iterators

Linked Lists. Linked list: a collection of items (nodes) containing two components: Data Address (link) of the next node in the list

Linked Lists. Linked list: a collection of items (nodes) containing two components: Data Address (link) of the next node in the list

Common Modifications of Class Members

EECE.3220: Data Structures Spring 2017

Advanced Linked Lists. Doubly Linked Lists Circular Linked Lists Multi- Linked Lists

Common Modifications of Class Members

Common Modifications of Class Members

CS32 Discussion Week 3

CSE 143. Linked Lists. Linked Lists. Manipulating Nodes (1) Creating Nodes. Manipulating Nodes (3) Manipulating Nodes (2) CSE 143 1

CpSc212 Goddard Notes Chapter 10. Linked Lists

Sharing Pointers and Garbage Collection

Data Structures (CS301) LAB

CS32 Discussion Sec.on 1B Week 2. TA: Zhou Ren

CMPT 225. Lecture 6 linked list

Lecture Notes CPSC 122 (Fall 2014) Today Quiz 7 Doubly Linked Lists (Unsorted) List ADT Assignments Program 8 and Reading 6 out S.

CS24 Week 4 Lecture 1

Ashish Gupta, Data JUET, Guna

Programming. Lists, Stacks, Queues

CA341 - Comparative Programming Languages

Linked List using a Sentinel

Jordan University of Science & Technology Department of Computer Science CS 211 Exam #1 (23/10/2010) -- Form A

Binary Search Trees. Contents. Steven J. Zeil. July 11, Definition: Binary Search Trees The Binary Search Tree ADT...

Set Implementation Version 1

! A data structure representing a list. ! A series of dynamically allocated nodes. ! A separate pointer (the head) points to the first

Implementation. Learn how to implement the List interface Understand the efficiency trade-offs between the ArrayList and LinkedList implementations

Assignment 4: SkipList

Part of the Picture: Simulation

Programming II (CS300)

Doubly-Linked Lists

Chapter 20: Binary Trees

CS32 - Week 2. Umut Oztok. July 1, Umut Oztok CS32 - Week 2

Data Structure Series

! Determine if a number is odd or even. ! Determine if a number/character is in a range. - 1 to 10 (inclusive) - between a and z (inclusive)

Object Oriented Programming COP3330 / CGS5409

LAB 5, THE HIDDEN DELIGHTS OF LINKED LISTS

UNIT IV 4 LINKED LIST

class Polynomial { public: Polynomial(const string& N = "no name", const vector<int>& C = vector<int>());... };

CS 215 Fundamentals of Programming II Spring 2018 Project 5

Introduction to Programming in C Department of Computer Science and Engineering

l Determine if a number is odd or even l Determine if a number/character is in a range - 1 to 10 (inclusive) - between a and z (inclusive)

Linear Structures. Linear Structure. Implementations. Array details. List details. Operations 2/10/2013

Short Notes of CS201

Spring 2008 Data Structures (CS301) LAB

Dynamic Data Structures

CS201 - Introduction to Programming Glossary By

III. Classes (Chap. 3)

Linked Lists. Gaddis Ch. 17. CS 2308 :: Spring 2016 Molly O'Neil

CMSC 341 Lecture 7 Lists

Queue Implementations

+ Abstract Data Types

! Determine if a number is odd or even. ! Determine if a number/character is in a range. ! Assign a category based on ranges (wind speed)

A collision is said to occur when two or more keys hash to the same index location.

Motivation for Templates

Linked List in Data Structure. By Prof. B J Gorad, BECSE, M.Tech CST, PHD(CSE)* Assistant Professor, CSE, SITCOE, Ichalkaranji,Kolhapur, Maharashtra

The Memory Manager Project

Homework Assignment #1

IV. Stacks. A. Introduction 1. Consider the 4 problems on pp (1) Model the discard pile in a card game. (2) Model a railroad switching yard

Data Structures and Algorithms

Linked Lists and other Dynamic Data Structures

The time and space are the two measure for efficiency of an algorithm.

The Structure of a C++ Program

Linear Structures. Linear Structure. Implementations. Array details. List details. Operations 4/18/2013

Lists, Stacks, and Queues. (Lists, Stacks, and Queues ) Data Structures and Programming Spring / 50

C++ - Lesson 2 This is a function prototype. a' is a function that takes an integer array argument and returns an integer pointer.

ECE 2035 Programming HW/SW Systems Spring problems, 5 pages Exam Three 8 April Your Name (please print clearly)

Due Date: See Blackboard

CS350: Data Structures. Doubly Linked Lists

Data Structures & Algorithms

Programming II (CS300)

Implementing an abstract datatype. Linked lists and queues

03/31/03 Lab 7. Linked Lists

#ifndef DOUBLE_LIST /* this string SHOULD NOT previously exist */ #define DOUBLE_LIST

MULTIMEDIA COLLEGE JALAN GURNEY KIRI KUALA LUMPUR

P.G.TRB - COMPUTER SCIENCE. c) data processing language d) none of the above

Largest Online Community of VU Students

CS 106X, Lecture 16 More Linked Lists

Solution for Data Structure

Class and Function Templates

Motivation for Templates. Class and Function Templates. One Way to Look at Templates...

Due Date: See Blackboard

Transcription:

Steven J. Zeil July 31, 2013 Contents 1 Linked Lists: the Basics 4 1

2 Coding for Linked Lists 8 2.1 Traversing a Linked List............................... 12 2.2 Searching a Linked List................................ 16 2.3 Adding to a Linked List................................ 25 2.3.1 addinorder.................................. 33 2.3.2 addafter.................................... 41 2.4 Removing from a Linked List............................ 45 2.4.1 remove..................................... 49 2.5 Copying and Clean-up................................ 51 3 Variations: Headers with First and Last 83 3.0.1 First-Last Header Algorithms........................ 88 4 Variations: Doubly-Linked Lists 106 CS333 2

4.1 Doubliy-Linked List Algorithms.......................... 112 CS333 3

1 Linked Lists: the Basics Sequences: arrays Consider the abstraction: a sequence of elements CS333 4

Main/Subpr Memory Heap Arrays (and vectors) work by storing elements of a sequence contiguously in memory Easy to access elements by number array Allen Baker Jones Smith Inserting things into the middle is slow and awkward............................... Sequences: Linked Lists CS333 5

Main/Subpr Memory Heap Head Current Prev Baker Allen Jones Smith Linked lists store each element in a distinct node. Nodes are linked by pointers. Accessing elements by number is slow and awkward Easy to insert things into the middle............................... Linked List Nodes CS333 6

A linked list node: struct LinkedListNode DataType data ; LinkedListNode * next ; ; LinkedListNode * firstnode ; A linked list consists of a number of nodes. Each node provides a data field and a next pointer................................ Basic List Operations CS333 7

We traverse move from node to node by tracing the pointers. We insert new nodes by working from the node prior to the insertion point. We remove nodes by moving the previous pointer "around" the unwanted node................................ 2 Coding for Linked Lists The Data Types We need two data types to build a linked list: The nodes CS333 8

struct LListNode Data data ; LListNode<Data>* next ; LListNode ( ) next = 0 ; LListNode ( const Data& d, LListNode<Data>* nxt = 0) : data (d ), next ( nxt ) ; I m doing this as a template so it can be easily re-used CS333 9

The actual kind of data stored is not particularly important And the header struct LListHeader LListNode<Data>* f i r s t ; LListHeader ( ) ;. ; provides the starting point for the list............................... CS333 10

I am treating these as utilities, not full-fledged ADTs We would use these to build "proper" ADTs like BidCollection So I m not going to be as picky about encapsulation and providing operators as I would usually be Example: Using the LListHeader c l ass BidderCollection int s i z e ; LListHeader <Bidder> l i s t ; public : CS333 11

typedef LListNode<Bidder >* Position ; / * * * Create a c o l l e c t i o n capable of holding any number of items * / BidderCollection ( ) ;................................ In the sections that follow, we will look both at how we would use the linked list (in BidderCollection and BidCollection) and how we would implement it. 2.1 Traversing a Linked List Traversing a Linked List CS333 12

c l ass BidderCollection. / / Print the c o l l e c t i o n void print ( std : : ostream& out ) const ; / / Comparison operators bool operator== ( const BidderCollection &) const ; bool operator< ( const BidderCollection &) const ; ; All of these require us to walk the list, one node at a time. We use a pointer to a node to denote our current position We advance to the next position by getting the link field out of that node................................ CS333 13

Printing a collection - while loop / / Print the c o l l e c t i o n void BidderCollection : : print ( std : : ostream& out ) const out << s i z e << " " ; Position current = l i s t. f i r s t ; while ( current! = NULL) out << " " ; current >data. print ( out ) ; out << "\n" ; current = current >next ; out << " " ; CS333 14

............................... Printing a collection - for loop / / Print the c o l l e c t i o n void BidderCollection : : print ( std : : ostream& out ) const out << s i z e << " " ; for ( Position current = l i s t. f i r s t ; current! = NULL; current = current >next ) out << " " ; current >data. print ( out ) ; out << "\n" ; CS333 15

out << " " ;............................... 2.2 Searching a Linked List Searching a Linked List To support: c l ass BidderCollection. Position findbidder ( std : : s t r i n g name) const ; / / Returns the position where a bidder matching / / the given name can be found, or null i f no CS333 16

/ / bidder with that name e x i s t s. we do a traversal but stop early if we find what we are looking for................................ findbidder / * * * Find the index of the bidder with the given name. I f no such bidder e x i s t s, * return null. * / BidderCollection : : Position BidderCollection : : findbidder ( std : : s t r i n g name) const for ( Position current = l i s t. f i r s t ; current!= NULL; current = current >next ) CS333 17

i f (name == current >data. getname ( ) ) return current ; return NULL;............................... Searching Linked Lists As a general utility, we might try to provide: struct LListHeader LListNode<Data>* f i r s t ; CS333 18

. / / Search f o r a value. Returns null i f not found LListNode<Data>* find ( const Data& value ) const ; / / Search an ordered l i s t f o r a value. Returns null i f not found LListNode<Data>* findordered ( const Data& value ) const ;............................... Searching Unordered Linked Lists / / Search f o r a value. Returns null i f not found LListNode<Data>* LListHeader <Data > : : find ( const Data& value ) const CS333 19

LListNode<Data>* current = f i r s t ; while ( current! = NULL && value! = current >data ) current = current >l i n k ; return current ;............................... Searching Ordered Linked Lists / / Search an ordered l i s t f o r a value. Returns null i f not found LListNode<Data>* LListHeader <Data > : : findordered ( const Data& value ) const CS333 20

LListNode<Data>* current = f i r s t ; while ( current! = NULL && value > current >data ) current = current >l i n k ; i f ( current! = NULL && value == current >data ) return current ; else return NULL;............................... findbidder (alternate) / * * * Find the index of the bidder with the given name. I f no such bidder e x i s t s, * return null. CS333 21

* / BidderCollection : : Position BidderCollection : : findbidder ( std : : s t r i n g name) const Bidder searchfor (name, 0. 0 ) ; return l i s t. find ( searchfor ) ; (works only because............................... bool Bidder : : operator== ( const Bidder& b) const return name == b. name; CS333 22

bool Bidder : : operator< ( const Bidder& b) const i f (name < b.name) return true ; else return f a l s e ; compare only by name). Walking Two Lists at Once Although not really a search, the relational operator code is similar, in that we do a traversal with a possible early exit. But now we have to walk two lists: // Comparison operators CS333 23

bool BidderCollection::operator== (const BidderCollection& bc) const if (size == bc.size) Position current = list.first; Position bcurrent = bc.list.first; while (current!= NULL) if (!(current->data == bcurrent->data)) return false; current = current->next; bcurrent = bcurrent->next; return true; CS333 24

else return false;............................... 2.3 Adding to a Linked List Adding to a Linked List void BidderCollection : : add ( const Bidder& value ) could be implemented as void BidderCollection : : add ( const Bidder& value ) / / Adds t h i s bidder CS333 25

/ / Pre : getsize ( ) < getmaxsize ( ) l i s t. addtoend ( value ) ; ++ s i z e ;............................... add functions struct LListHeader LListNode<Data>* f i r s t ; CS333 26

LListHeader ( ) ; void addtofront ( const Data& value ) ; void addtoend ( const Data& value ) ; / / Add value in sorted order. / / Pre : a l l e x i s t i n g values are already ordered void addinorder ( const Data& value ) ;. Let s look at how to do addtoend first................................ addtoend CS333 27

void LListHeader<Data>::addToEnd (const Data& value) LListNode<Data>* newnode = new LListNode<Data>(value, NULL); if (first == NULL) first = newnode; else // Move to last node LListNode<Data>* current = first; while (current->next!= NULL) current = current->next; CS333 28

// Link after that node current->next = newnode;............................... addtoend Example CS333 29

list: first: E.g. Suppose we have a list containing "Adams", "Baker", & "Davis", and we are going to add "Chen". We create a new node. Adams Baker Davis newnode: Chen void LListHeader <Data > : : addtoend ( const Data& value ) LListNode<Data>* newnode = new LListNode<Data >( value, NULL) ; CS333 30

If the list is not empty, we will have to find a pointer to the last node currently in the list.. i f ( f i r s t == NULL) f i r s t = newnode; else / / Move to l a s t node. LListNode<Data>* current = f i r s t ; list: Adams current: newnode: first: Baker Davis Chen CS333 31

list: first:. / / Move to l a s t node LListNode<Data>* current = f i r s t ; while ( current >next! = NULL) current = current >next ;. Eventually we find it. Adams current: newnode: Baker Davis Chen CS333 32

and then link in the new node.. while ( current >next! = NULL) current = current >next ; list: Adams first: Davis / / Link a f t e r that node current >next = newnode;............................... current: newnode: Baker Chen 2.3.1 addinorder addinorder CS333 33

void LListHeader<Data>::addInOrder (const Data& value) if (first == NULL) first = new LListNode<Data>(value, NULL); else LListNode<Data>* current = first; LListNode<Data>* prev = NULL; while (current!= NULL && value > current->data) prev = current; current = current->next; // Add between prev and current CS333 34

if (prev == NULL) addtofront (value); else addafter (prev, value);............................... addinorder Example Again, suppose we have a list containing "Adams", "Baker", & "Davis", and we are going to add "Chen". void LListHeader <Data > : : addinorder ( const Data& value ) CS333 35

i f ( f i r s t == NULL) f i r s t = new LListNode<Data >( value, NULL) ; else LListNode<Data>* current = f i r s t ; LListNode<Data>* prev = NULL;. CS333 36

list: first: Start by setting up two position pointers. Adams Davis prev will point one position in front of current. current: Baker prev: CS333 37

list: first: Adams Baker Davis Move forward till prev and current bracket the place where we want to insert the new data. current: prev:. while ( current! = NULL && value > current >data ) prev = current ; current = current >next ; CS333 38

CS333 39

Found it! list: first: Adams current: Baker Davis. // Add between prev and current if (prev == NULL) addtofront (value); else addafter (prev, value); prev: Now we just add the new data after the prev position. And that s one of the functions we need to implement anyway. CS333 40

............................... 2.3.2 addafter addafter list: first: Starting from here Adams Davis Baker afterthis: void LListHeader <Data > : : addafter ( LListNode<Data>* afterthis, const Data& value CS333 41

LListNode<Data>* newnode = new LListNode<Data >( value, afterthis >next ) ; afterthis >next = newnode;............................... addafter 2 CS333 42

list: first: Create the new node: Adams Davis Baker afterthis: newnode: Chen void LListHeader <Data > : : addafter ( LListNode<Data>* afterthis, const Data& value LListNode<Data>* newnode = new LListNode<Data >( value, afterthis >next ) ; afterthis >next = newnode; CS333 43

Notice that it is created with its link field already pointing to the correct place. That s not magic we just passed the appropriate value to the node constructor................................ addafter 3 void LListHeader <Data > : : addafter ( LListNode<Data>* afterthis, const Data& value LListNode<Data>* newnode = new LListNode<Data >( value, afterthis >next ) ; CS333 44

list: first: Then change the link from the afterthis node. Adams Davis Baker And we re done! afterthis: newnode:............................... Chen 2.4 Removing from a Linked List Removing from a Linked List CS333 45

void LListHeader <Data > : : removeafter ( LListNode<Data>* afterthis ) LListNode<Data>* toremove = afterthis >next ; afterthis >next = toremove >next ; delete toremove ; list: first: Starting here. Adams Davis Baker afterthis: CS333 46

list: first: Get a pointer to the node we actually want to remove. Adams Baker Davis afterthis: toremove: CS333 47

list: first: Make the earlier node point around the one we want to remove. Adams Baker Davis afterthis: toremove: CS333 48

list: first: Then delete the unwanted node. Adams Baker Davis afterthis: toremove:............................... 2.4.1 remove remove CS333 49

void LListHeader <Data > : : remove ( LListNode<Data>* here ) i f ( here == f i r s t ) LListNode<Data>* a f t e r = f i r s t >next ; delete f i r s t ; f i r s t = a f t e r ; else LListNode<Data>* prev = f i r s t ; while ( prev >next! = here ) prev = prev >next ; prev >next = here >next ; CS333 50

delete here ; Basically removeafter preceded by a traversal................................ 2.5 Copying and Clean-up Copying BidderCollection : : BidderCollection ( const BidderCollection& bc ) : s i z e ( bc. s i z e ) l i s t. append( bc. l i s t ) ; CS333 51

BidderCollection& BidderCollection : : operator= ( const BidderCollection& bc ) i f ( t h i s!= &bc ) l i s t. clear ( ) ; s i z e = bc. s i z e ; l i s t. append( bc. l i s t ) ; return * this ;............................... CS333 52

append // Add all values from another list onto the end of this one void LListHeader<Data>::append (const LListHeader<Data>& list) // Move to last node LListNode<Data>* last = first; while (last->next!= NULL) last = last->next; // Append new nodes onto end of list const LListNode<Data>* current = list.first; while (current!= NULL) CS333 53

LListNode<Data>* newnode = new LListNode<Data>(current->data, NULL); if (last!= NULL) last->next = newnode; last = newnode; current = current->next; void LListHeader<Data>::append (const LListHeader<Data>& list) // Move to last node LListNode<Data>* last = first; if (last!= NULL) CS333 54

while (last->next!= NULL) last = last->next; // Append new nodes onto end of list const LListNode<Data>* current = list.first; while (current!= NULL) LListNode<Data>* newnode = new LListNode<Data>(current->data, NULL); if (last!= NULL) last->next = newnode; else first = newnode; last = newnode; current = current->next; CS333 55

A traversal to the end of the current list, followed by repeated "addtoend" equivalents................................ Collection Destructor BidderCollection : : ~ BidderCollection ( ) l i s t. clear ( ) ;............................... CS333 56

clear void LListHeader <Data > : : clear ( ) LListNode<Data>* current = f i r s t ; LListNode<Data>* nxt = NULL; while ( current! = NULL) nxt = current >next ; delete current ; current = nxt ; f i r s t = NULL;............................... CS333 57

Be careful when deleting Only "trick" here is that we cant do the usual current = current >next ; at the end of the loop, because we will have already deleted the node that contains next................................ Example: The List-based Collection #ifndef BIDDERCOLLECTION_H #define BIDDERCOLLECTION_H #include "bidders.h" #include <iostream> CS333 58

#include "sllistutils.h" // // Bidders Registered for auction // class BidderCollection int size; LListHeader<Bidder> list; public: CS333 59

typedef LListNode<Bidder>* Position; /** * Create a collection capable of holding any number of items */ BidderCollection (); // Big 3 BidderCollection (const BidderCollection&); BidderCollection& operator= (const BidderCollection&); ~BidderCollection (); CS333 60

// Access to attributes int getsize() const return size; // Access to individual elements const Bidder& get(position index) const; Bidder& get(position index); Position getfirst() const; bool more (Position afterthis) const; Position getnext(position afterthis) const; CS333 61

// Collection operations void add (const Bidder& value); // Adds this bidder to the collection at an unspecified position. //Pre: getsize() < getmaxsize() void remove (Position); // Remove the item at the indicated position CS333 62

Position findbidder (std::string name) const; // Returns the position where a bidde mathcing the given // name can be found, or null if no bidder with that name exists. /** * Read all items from the indicated file */ void readbidders (std::string filename); // Print the collection void print (std::ostream& out) const; CS333 63

// Comparison operators bool operator== (const BidderCollection&) const; bool operator< (const BidderCollection&) const; ; inline std::ostream& operator<< (std::ostream& out, const BidderCollection& b) b.print(out); return out; CS333 64

#endif The above code makes use of some utility functions for singly-linked lists: #ifndef SLLISTUTILS_H #define SLLISTUTILS_H #include <cstdlib> // for NULL /** CS333 65

* Utility operations for singly linked lists * */ struct LListNode Data data; LListNode<Data>* next; LListNode() next = 0; CS333 66

LListNode (const Data& d, LListNode<Data>* nxt = 0) : data(d), next(nxt) ; struct LListHeader LListNode<Data>* first; LListHeader(); void addtofront (const Data& value); CS333 67

void addtoend (const Data& value); // Add value after the indicated position void addafter (LListNode<Data>* afterthis, const Data& value); // Add value before the indicated position void addbefore (LListNode<Data>* beforethis, const Data& value); // Add value in sorted order. //Pre: all existing values are already ordered void addinorder (const Data& value); // Remove value at the indicated position void remove (LListNode<Data>* here); CS333 68

// Add value after the indicated position void removeafter (LListNode<Data>* afterthis); // Search for a value. Returns null if not found LListNode<Data>* find (const Data& value) const; // Search an ordered list for a value. Returns null if not found LListNode<Data>* findordered (const Data& value) const; // Empty the list void clear(); CS333 69

; LListHeader<Data>::LListHeader() : first(null) void LListHeader<Data>::addToFront (const Data& value) LListNode<Data>* newnode = new LListNode<Data>(value, first); CS333 70

first = newnode; void LListHeader<Data>::addToEnd (const Data& value) LListNode<Data>* newnode = new LListNode<Data>(value, NULL); if (first == NULL) first = newnode; else // Move to last node CS333 71

LListNode<Data>* current = first; while (current->next!= NULL) current = current->next; // Link after that node current->next = newnode; // Add value after the indicated position void LListHeader<Data>::addAfter (LListNode<Data>* afterthis, const Data& v LListNode<Data>* newnode = new LListNode<Data>(value, afterthis->next); CS333 72

afterthis->next = newnode; // Add value before the indicated position void LListHeader<Data>::addBefore (LListNode<Data>* beforethis, const Data& if (beforethis == first) addtofront (value); else // Move to front of beforethis LListNode<Data>* current = first; while (current->next!= beforethis) CS333 73

current = current->next; // Link after that node addafter (current, value); // Add value in sorted order. //Pre: all existing values are already ordered void LListHeader<Data>::addInOrder (const Data& value) if (first == NULL) first = new LListNode<Data>(value, NULL); CS333 74

else LListNode<Data>* current = first; LListNode<Data>* prev = NULL; while (current!= NULL && value < current->data) prev = current; current = current->next; // Add between prev and current if (prev == NULL) addtofront (value); else addafter (prev, value); CS333 75

// Add all values from another list onto the end of this one void LListHeader<Data>::append (const LListHeader<Data>& list) // Move to last node LListNode<Data>* last = first; while (last->next!= NULL) last = last->next; // Append new nodes onto end of list CS333 76

const LListNode<Data>* current = list.first; while (current!= NULL) LListNode<Data>* newnode = new LListNode<Data>(current->data, NULL); if (last!= NULL) last->next = newnode; last = newnode; // Remove value at the indicated position void LListHeader<Data>::remove (LListNode<Data>* here) CS333 77

if (here == first) LListNode<Data>* after = first->next; delete first; first = after; else LListNode<Data>* prev = first; while (prev->next!= here) prev = prev->next; prev->next = here->next; delete here; CS333 78

// Remove value after the indicated position void LListHeader<Data>::removeAfter (LListNode<Data>* afterthis) LListNode<Data>* toremove = afterthis->next; afterthis->next = toremove->next; delete toremove; CS333 79

// Search for a value. Returns null if not found LListNode<Data>* LListHeader<Data>::find (const Data& value) const LListNode<Data>* current = first; while (current!= NULL && value!= current->data) current = current->next; return current; // Search an ordered list for a value. Returns null if not found LListNode<Data>* LListHeader<Data>::findOrdered (const Data& value) const CS333 80

LListNode<Data>* current = first; while (current!= NULL && value < current->data) current = current->next; if (current!= NULL && value == current->data) return current; else return NULL; void LListHeader<Data>::clear() LListNode<Data>* current = first; LListNode<Data>* nxt = NULL; CS333 81

while (current!= NULL) nxt = current->next; delete current; current = nxt; first = NULL; #endif............................... CS333 82

3 Variations: Headers with First and Last Adding on Either End Adding to (either) end of a list is very common, but compare the amount of work required: void LListHeader <Data > : : addtofront ( const Data& value ) LListNode<Data>* newnode = new LListNode<Data >( value, f i r s t ) ; f i r s t = newnode; void LListHeader <Data > : : addtoend ( const Data& value ) CS333 83

LListNode<Data>* newnode = new LListNode<Data >( value, NULL) ; i f ( f i r s t == NULL) f i r s t = newnode; else / / Move to l a s t node LListNode<Data>* current = f i r s t ; while ( current >next! = NULL) current = current >next ; / / Link a f t e r that node current >next = newnode; CS333 84

............................... Adding a Last Pointer We can simplify by adding a second pointer in the header: CS333 85

struct LListHeader list: first: last: LListNode<Data>* first; LListNode<Data>* last; Adams Davis LListHeader();................................ Baker Look at the Change void LListHeader <Data > : : addtofront ( const Data& value ) F i r s t Last Header Algorith CS333 86

LListNode<Data>* newnode = new LListNode<Data >( value, f i r s t ) ; f i r s t = newnode; i f ( l a s t == NULL) l a s t = f i r s t ; void LListHeader <Data > : : addtoend ( const Data& value ) LListNode<Data>* newnode = new LListNode<Data >( value, NULL) ; i f ( l a s t == NULL) f i r s t = l a s t = newnode; CS333 87

else l a s t >next = newnode; l a s t = newnode;............................... 3.0.1 First-Last Header Algorithms #ifndef SLLISTUTILS_H #define SLLISTUTILS_H #include <cstdlib> // for NULL CS333 88

/** * Utility operations for singly linked lists * * Variant: header has first and last pointers * */ struct LListNode CS333 89

Data data; LListNode<Data>* next; LListNode() next = 0; LListNode (const Data& d, LListNode<Data>* nxt = 0) : data(d), next(nxt) ; struct LListHeader CS333 90

LListNode<Data>* first; LListNode<Data>* last; LListHeader(); void addtofront (const Data& value); void addtoend (const Data& value); // Add value after the indicated position void addafter (LListNode<Data>* afterthis, const Data& value); // Add value before the indicated position void addbefore (LListNode<Data>* beforethis, const Data& value); CS333 91

// Add value in sorted order. //Pre: all existing values are already ordered void addinorder (const Data& value); // Append all nodes from another list onto the end of this one void append (const LListHeader<Data>& list); // Remove value at the indicated position void remove (LListNode<Data>* here); // Add value after the indicated position void removeafter (LListNode<Data>* afterthis); CS333 92

// Search for a value. Returns null if not found LListNode<Data>* find (const Data& value) const; // Search an ordered list for a value. Returns null if not found LListNode<Data>* findordered (const Data& value) const; // Empty the list void clear(); ; CS333 93

LListHeader<Data>::LListHeader() : first(null), last(null) void LListHeader<Data>::addToFront (const Data& value) LListNode<Data>* newnode = new LListNode<Data>(value, first); first = newnode; if (last == NULL) last = first; CS333 94

void LListHeader<Data>::addToEnd (const Data& value) LListNode<Data>* newnode = new LListNode<Data>(value, NULL); if (last == NULL) first = last = newnode; else last->next = newnode; last = newnode; CS333 95

// Add value after the indicated position void LListHeader<Data>::addAfter (LListNode<Data>* afterthis, const Data& value) LListNode<Data>* newnode = new LListNode<Data>(value, afterthis->nex afterthis->next = newnode; if (afterthis == last) last = newnode; // Add value before the indicated position CS333 96

void LListHeader<Data>::addBefore (LListNode<Data>* beforethis, const Data& value) if (beforethis == first) addtofront (value); else // Move to front of beforethis LListNode<Data>* current = first; while (current->next!= beforethis) current = current->next; // Link after that node addafter (current, value); CS333 97

// Add value in sorted order. //Pre: all existing values are already ordered void LListHeader<Data>::addInOrder (const Data& value) if (first == NULL) first = last = new LListNode<Data>(value, NULL); else LListNode<Data>* current = first; LListNode<Data>* prev = NULL; CS333 98

while (current!= NULL && value > current->data) prev = current; current = current->next; // Add between prev and current if (prev == NULL) addtofront (value); else addafter (prev, value); // Add all values from another list onto the end of this one CS333 99

void LListHeader<Data>::append (const LListHeader<Data>& list) const LListNode<Data>* current = list.first; while (current!= NULL) addtoend (current->data); current = current->next; // Remove value at the indicated position CS333 100

void LListHeader<Data>::remove (LListNode<Data>* here) if (here == first) LListNode<Data>* after = first->next; delete first; first = after; else LListNode<Data>* prev = first; while (prev->next!= here) prev = prev->next; prev->next = here->next; CS333 101

if (here == last) last = prev; delete here; // Add value after the indicated position void LListHeader<Data>::removeAfter (LListNode<Data>* afterthis) LListNode<Data>* toremove = afterthis->next; afterthis->next = toremove->next; CS333 102

if (toremove == last) last = afterthis; delete toremove; // Search for a value. Returns null if not found LListNode<Data>* LListHeader<Data>::find (const Data& value) const LListNode<Data>* current = first; while (current!= NULL && value!= current->data) current = current->next; return current; CS333 103

// Search an ordered list for a value. Returns null if not found LListNode<Data>* LListHeader<Data>::findOrdered (const Data& value) co LListNode<Data>* current = first; while (current!= NULL && value > current->data) current = current->next; if (current!= NULL && value == current->data) return current; else return NULL; CS333 104

void LListHeader<Data>::clear() LListNode<Data>* current = first; LListNode<Data>* nxt = NULL; while (current!= NULL) nxt = current->next; delete current; current = nxt; first = last = NULL; CS333 105

#endif 4 Variations: Doubly-Linked Lists Doubly-Linked Lists CS333 106

By modifying the node structure: struct DListNode Data data; DListNode<Data>* prev; DListNode<Data>* next; list: Adams first: last: Davis DListNode() next = prev = 0; DListNode (const Data& d, DListNode<Data>* prv = 0, DListNode<Data>* n : data(d), next(nxt), prev(prv) ; CS333 107 Baker

we can Move backwards as well as forward in the list by following theprev pointers Easily add in front of a node............................... addbefore: Singly Linked CS333 108

void LListHeader <Data > : : addbefore ( LListNode<Data>* beforethis, const Data& value ) i f ( beforethis == f i r s t ) addtofront ( value ) ; list: first: else last: / / Move to f ro nt of beforethis Adams LListNode<Data>* current = f i r s t ; while ( current >next! = beforethis ) Baker current = current >next ; Davis / / Link a f t e r that node addafter ( current, value ) ; CS333 109

............................... addbefore: Doubly Linked CS333 110

void DListHeader<Data > : : addbefore ( DListNode<Data>* beforethis, const Data& value ) list: first: i f ( beforethis == f i r s t ) addtofront ( value ) ; last: else Adams / / Move to f ro nt of beforethis DListNode<Data>* current = beforethis >prev ; Baker / / Link a f t e r that node addafter ( current, value ) ;............................... Davis CS333 111

4.1 Doubliy-Linked List Algorithms #ifndef DLLISTUTILS_H #define DLLISTUTILS_H #include <cstdlib> // for NULL /** * Utility operations for doubly linked lists * * Variant: header has first and last pointers * */ CS333 112

struct DListNode Data data; DListNode<Data>* prev; DListNode<Data>* next; DListNode() next = prev = 0; DListNode (const Data& d, DListNode<Data>* prv = 0, DListNode<Data>* : data(d), next(nxt), prev(prv) CS333 113

; struct DListHeader DListNode<Data>* first; DListNode<Data>* last; DListHeader(); void addtofront (const Data& value); void addtoend (const Data& value); CS333 114

// Add value after the indicated position void addafter (DListNode<Data>* afterthis, const Data& value); // Add value before the indicated position void addbefore (DListNode<Data>* beforethis, const Data& value); // Add value in sorted order. //Pre: all existing values are already ordered void addinorder (const Data& value); // Remove value at the indicated position void remove (DListNode<Data>* here); CS333 115

// Add value after the indicated position void removeafter (DListNode<Data>* afterthis); // Search for a value. Returns null if not found DListNode<Data>* find (const Data& value) const; // Search an ordered list for a value. Returns null if not found DListNode<Data>* findordered (const Data& value) const; // Empty the list void clear(); CS333 116

; DListHeader<Data>::DListHeader() : first(null), last(null) void DListHeader<Data>::addToFront (const Data& value) DListNode<Data>* newnode = new DListNode<Data>(value, NULL, first); if (first == NULL) CS333 117

first = last = newnode; else first->prev = newnode; first = newnode; void DListHeader<Data>::addToEnd (const Data& value) DListNode<Data>* newnode = new DListNode<Data>(value, last, NULL); if (last == NULL) CS333 118

first = last = newnode; else last->next = newnode; last = newnode; // Add value after the indicated position void DListHeader<Data>::addAfter (DListNode<Data>* afterthis, const Data& value) CS333 119

DListNode<Data>* newnode = new DListNode<Data>(value, afterthis, afterthis->next); if (afterthis == last) last = newnode; else afterthis->next->prev = newnode; afterthis->next = newnode; // Add value before the indicated position CS333 120

void DListHeader<Data>::addBefore (DListNode<Data>* beforethis, const Data& value) if (beforethis == first) addtofront (value); else // Move to front of beforethis DListNode<Data>* current = beforethis->prev; // Link after that node addafter (current, value); CS333 121

// Add value in sorted order. //Pre: all existing values are already ordered void DListHeader<Data>::addInOrder (const Data& value) if (first == NULL) first = last = new DListNode<Data>(value, NULL, NULL); else DListNode<Data>* current = first; DListNode<Data>* prev = NULL; while (current!= NULL && value < current->data) CS333 122

prev = current; current = current->next; // Add between prev and current if (prev == NULL) addtofront (value); else addafter (prev, value); // Remove value at the indicated position void DListHeader<Data>::remove (DListNode<Data>* here) CS333 123

if (here == first) DListNode<Data>* after = first->next; delete first; first = after; else DListNode<Data>* prev = here->prev; prev->next = here->next; here->prev = prev; if (here == last) last = prev; CS333 124

delete here; // Add value after the indicated position void DListHeader<Data>::removeAfter (DListNode<Data>* afterthis) DListNode<Data>* toremove = afterthis->next; afterthis->next = toremove->next; if (afterthis->next!= NULL) afterthis->next->prev = afterthis; CS333 125

if (toremove == last) last = afterthis; delete toremove; // Search for a value. Returns null if not found DListNode<Data>* DListHeader<Data>::find (const Data& value) const DListNode<Data>* current = first; while (current!= NULL && value!= current->data) current = current->next; return current; CS333 126

// Search an ordered list for a value. Returns null if not found DListNode<Data>* DListHeader<Data>::findOrdered (const Data& value) co DListNode<Data>* current = first; while (current!= NULL && value < current->data) current = current->next; if (current!= NULL && value == current->data) return current; else return NULL; CS333 127

void DListHeader<Data>::clear() DListNode<Data>* current = first; DListNode<Data>* nxt = NULL; while (current!= NULL) nxt = current->next; delete current; current = nxt; first = last = NULL; CS333 128

#endif CS333 129