• No results found

Chapter 16

N/A
N/A
Protected

Academic year: 2021

Share "Chapter 16"

Copied!
61
0
0

Loading.... (view fulltext now)

Full text

(1)

Chapter 16

Linked Structures

Dale/Weems/Headington

(2)

Chapter 16 Topics

Meaning of a Linked List

Meaning of a Dynamic Linked List

Traversal, Insertion and Deletion of Elements in a Dynamic Linked List

Specification of a Dynamic Linked Sorted List

Insertion and Deletion of Elements in a

Dynamic Linked Sorted List

(3)

What is a List?

 A list is a varying-length, linear

collection of homogeneous elements.

 linear means each list element (except

the first) has a unique predecessor, and

each element (except the last) has a

(4)

To implement the List ADT

The programmer must

1) choose a concrete data representation for the list, and

2) implement the list operations

(5)

Array-Based Sorted List Operations

Transformers

Insert

Delete

Observers

IsEmpty

IsFull

change state

observe state

(6)

Array-based class SortedList

IsFull Length

Delete IsEmpty

Insert

Private data:

length

data [ 0 ]

[ 1 ]

[ 2 ]

(7)

// SPECIFICATION FILE ARRAY-BASED SORTED LIST ( slist.h ) const int MAX_LENGTH = 50 ;

typedef int ItemType ; class SortedList

{

public : // public member functions SortedList ( ) ; // constructor

bool IsEmpty ( ) const ;

bool IsFull ( ) const ;

int Length ( ) const ; // returns length of list void Insert ( ItemType item ) ;

void Delete ( ItemType item ) ;

bool IsPresent( ItemType item ) const ;

void Print ( ) ;

(8)

How to Implement a List

use a built-in array stored in contiguous

memory locations, implementing operations Insert and Delete by moving list items around in the array, as needed

use a linked list (to avoid excessive data

movement from insertions and deletions) not

necessarily stored in contiguous memory

(9)

Implementation

Possibilities for a List ADT

List

Linked list Built-in array

Built-in

(10)

A Linked List

a linked list is a list in which the order of the components is determined by an explicit link member in each node

the nodes are struct s--each node contains

a component member and also a link member

that gives the location of the next node in the

list

(11)

Dynamic Linked List

head “Ted” “Irv” “Lee”

in a dynamic linked list, nodes are linked

together by pointers, and an external pointer

(or head pointer) points to the first node in

the list

(12)

Nodes can be located anywhere in memory

the link member holds the memory address of the next node in the list

head 3000 “Ted” 5000 “Irv” 2000 “Lee” NULL

3000 5000 2000

(13)

// Type DECLARATIONS struct NodeType {

char info;

NodeType* link;

}

typedef NodeType* NodePtr;

// Variable DECLARATIONS NodePtr head;

NodePtr ptr;

Declarations for a

Dynamic Linked List

(14)

Pointer Dereferencing and Member Selection

. info . link ‘A’ 6000 ptr

ptr

ptr

. info . link ‘A’ 6000

*ptr

(15)

ptr is a pointer to a node

. info . link ‘A’ 6000 ptr

ptr

(16)

*ptr is the entire node pointed to by ptr

ptr

. info . link ‘A’ 6000

*ptr

(17)

ptr->info

is a node member

ptr

. info . link

ptr->info

(*ptr).info // equivalent

‘A’ 6000

(18)

ptr->link

is a node member

ptr

. info . link

ptr->link

(*ptr).link // equivalent

‘A’ 6000

(19)

Traversing a

Dynamic Linked List

//PRE: head points to a dynamic linked list ptr = head ;

ptr

3000 “Ted” 5000 “Irv” 2000 “Lee” NULL

3000 5000 2000

head

(20)

//PRE: head points to a dynamic linked list ptr = head ;

ptr 3000

3000 “Ted” 5000 “Irv” 2000 “Lee” NULL

3000 5000 2000 head

Traversing a

Dynamic Linked List

(21)

//PRE: head points to a dynamic linked list ptr = head ;

ptr 3000

3000 “Ted” 5000 “Irv” 2000 “Lee” NULL

3000 5000 2000 head

Traversing a

Dynamic Linked List

(22)

//PRE: head points to a dynamic linked list ptr = head ;

ptr 3000

3000 “Ted” 5000 “Irv” 2000 “Lee” NULL

3000 5000 2000 head

Traversing a

Dynamic Linked List

(23)

//PRE: head points to a dynamic linked list ptr = head ;

ptr 5000

3000 “Ted” 5000 “Irv” 2000 “Lee” NULL

3000 5000 2000 head

Traversing a

Dynamic Linked List

(24)

//PRE: head points to a dynamic linked list ptr = head ;

ptr 5000

3000 “Ted” 5000 “Irv” 2000 “Lee” NULL

3000 5000 2000 head

Traversing a

Dynamic Linked List

(25)

//PRE: head points to a dynamic linked list ptr = head ;

ptr 5000

3000 “Ted” 5000 “Irv” 2000 “Lee” NULL

3000 5000 2000 head

Traversing a

Dynamic Linked List

(26)

//PRE: head points to a dynamic linked list ptr = head ;

ptr 2000

3000 “Ted” 5000 “Irv” 2000 “Lee” NULL

3000 5000 2000 head

Traversing a

Dynamic Linked List

(27)

//PRE: head points to a dynamic linked list ptr = head ;

ptr 2000

3000 “Ted” 5000 “Irv” 2000 “Lee” NULL

3000 5000 2000 head

Traversing a

Dynamic Linked List

(28)

//PRE: head points to a dynamic linked list ptr = head ;

ptr 2000

3000 “Ted” 5000 “Irv” 2000 “Lee” NULL

3000 5000 2000 head

Traversing a

Dynamic Linked List

(29)

//PRE: head points to a dynamic linked list ptr = head ;

ptr NULL

3000 “Ted” 5000 “Irv” 2000 “Lee” NULL

3000 5000 2000 head

Traversing a

Dynamic Linked List

(30)

//PRE: head points to a dynamic linked list ptr = head ;

ptr NULL

3000 “Ted” 5000 “Irv” 2000 “Lee” NULL

3000 5000 2000 head

Traversing a

Dynamic Linked List

(31)

Using Operator new

If memory is available in an area called the free store (or heap), operator new allocates the requested object, and returns a pointer to the memory allocated.

The dynamically allocated object exists until the

delete operator destroys it.

(32)

Inserting a Node at the Front of a List

char item = ‘B’;

NodePtr location;

location = new NodeType;

location->info = item;

location->link = head;

head = location;

item ‘B’

(33)

Inserting a Node at the Front of a List

char item = ‘B’;

NodePtr location;

location = new NodeType;

location->info = item;

location->link = head;

head = location;

item ‘B’

(34)

Inserting a Node at the Front of a List

char item = ‘B’;

NodePtr location;

location = new NodeType;

location->info = item;

location->link = head;

head = location;

item ‘B’

(35)

Inserting a Node at the Front of a List

char item = ‘B’;

NodePtr location;

location = new NodeType;

location->info = item;

location->link = head;

head = location;

item ‘B’

(36)

Inserting a Node at the Front of a List

char item = ‘B’;

NodePtr location;

location = new NodeType;

location->info = item;

location->link = head;

head = location;

item ‘B’

(37)

Inserting a Node at the Front of a List

char item = ‘B’;

NodePtr location;

location = new NodeType;

location->info = item;

location->link = head;

head = location;

item ‘B’

(38)

The object currently pointed to by the pointer is deallocated, and the pointer is considered

undefined. The object’s memory is returned to the free store.

Using Operator delete

(39)

Deleting the First Node from the List

NodePtr tempPtr;

item = head->info;

tempPtr = head;

head = head->link;

delete tempPtr;

item

(40)

Deleting the First Node from the List

NodeType * tempPtr;

item = head->info;

tempPtr = head;

head = head->link;

delete tempPtr;

item ‘B’

(41)

Deleting the First Node from the List

NodeType * tempPtr;

item = head->info;

tempPtr = head;

head = head->link;

delete tempPtr;

item ‘B’

(42)

Deleting the First Node from the List

NodeType * tempPtr;

item = head->info;

tempPtr = head;

head = head->link;

delete tempPtr;

item ‘B’

(43)

Deleting the First Node from the List

NodeType * tempPtr;

item = head->info;

tempPtr = head;

head = head->link;

delete tempPtr;

item ‘B’

(44)

What is a List?

a list is a varying-length, linear

collection of homogeneous elements

linear means each list element (except the first) has a unique predecessor, and each element (except the last) has a

unique successor

(45)

ADT SortedList2 Operations

Transformers

InsertTop

Insert

DeleteTop

Delete

Observers

Print

change state

observe state

(46)

// SPECIFICATION FILE DYNAMIC-LINKED SORTED LIST( slist2.h )

typedef int ItemType ; // Type of each component // is simple type or string type struct NodeType

{

ItemType item ; // Pointer to person’s name NodeType* link ; // link to next node in list } ;

struct NodeType

(47)

// SPECIFICATION FILE DYNAMIC-LINKED SORTED LIST( slist2.h ) class SortedList2

{

public :

bool IsEmpty ( ) const ; void Print ( ) const ;

void InsertTop ( /* in */ ItemType item ) ; void Insert ( /* in */ ItemType item ) ;

void DeleteTop ( /* out */ ItemType& item ) ; void Delete ( /* in */ ItemType item );

SortedList2 ( ) ; // Constructor

~SortedList2 ( ) ; // Destructor

(48)

class SortedList2

Print

~SortedList2

InsertTop SortedList2

IsEmpty

‘C’ ‘L’ ‘X’

Private data:

head

(49)

Insert Algorithm

what will be the algorithm to Insert an item into its proper place in a sorted linked list?

that is, for a linked list whose elements are

maintained in ascending order?

(50)

Insert algorithm for SortedList2

find proper position for the new element in the sorted list using two pointers prevPtr and currPtr, where prevPtr trails behind currPtr

obtain a node for insertion and place item

in it

(51)

Implementing SortedList2 Member Function Insert

// DYNAMIC LINKED LIST IMPLEMENTATION (slist2.cpp)

void SortedList2 :: Insert ( /* in */ ItemType item )

// PRE: item is assigned && List components in ascending order // POST: item is in List && List components in ascending order {

. . .

(52)

Inserting ‘S’ into a Sorted List

‘C’ ‘L’ ‘X’

Private data:

head

prevPtr currPtr

(53)

Finding Proper Position for ‘S’

‘C’ ‘L’ ‘X’

Private data:

head

prevPtr currPtr

NULL

(54)

‘C’ ‘L’ ‘X’

Private data:

head

prevPtr currPtr

Finding Proper Position for ‘S’

(55)

‘C’ ‘L’ ‘X’

Private data:

head

prevPtr currPtr

Finding Proper Position for ‘S’

(56)

‘C’ ‘L’ ‘X’

Private data:

head

prevPtr currPtr

Inserting ‘S’ into Proper Position

(57)

// IMPLEMENTATION DYNAMIC-LINKED SORTED LIST (slist2.cpp)

SortedList2 ::SortedList2 ( ) // Constructor // Post: head == NULL

{

head = NULL ; }

SortedList2 :: ~SortedList2 ( ) // Destructor // Post: All linked nodes deallocated

{

ItemType temp ;

(58)

void SortedList2 :: Insert( /* in */ ItemType item )

// Pre: item is assigned && list components in ascending order // Post: new node containing item is in its proper place

// && list components in ascending order { NodePtr currPtr ;

NodePtr prevPtr ; NodePtr location ;

location = new NodeType ; newNodePtr->link = item ; prevPtr = NULL ;

currPtr = head ;

while ( currPtr != NULL && item > currPtr->info )

{ prevPtr = currPtr ; // advance both pointers

currPtr = currPtr->link ; }

location->link = currPtr ; // insert new node here

(59)

void SortedList2 :: DeleteTop ( /* out */ ItemType& item )

// Pre: list is not empty && list elements in ascending order // Post: item == element of first list node @ entry

// && node containing item is no longer in linked list // && list elements in ascending order

{

NodePtr tempPtr = head ;

// obtain item and advance head item = head->info ;

head = head->link ;

(60)

void SortedList2 :: Delete ( /* in */ ItemType item )

// Pre: list is not empty && list elements in ascending order // && item == component member of some list node

// Post: item == element of first list node @ entry

// && node containing first occurrence of item is no longer // in linked list && list elements in ascending order

{ NodePtr delPtr ;

NodePtr currPtr ; // Is item in first node?

if ( item == head->info )

{ delPtr = head ; // If so, delete first node head = head->link ;

}

else {// search for item in rest of list currPtr = head ;

while ( currPtr->link->info != item )

currPtr = currPtr->link ;

(61)

class SortedList2

Print

~SortedList2

InsertTop SortedList2

IsEmpty

‘C’ ‘L’ ‘X’

Private data:

head

References

Related documents

Each entry of the node table contains an address of a node in that leader’s cluster as well as a list of the neighboring cluster leaders with which that node is able to

The last node points to NULL Declaring a Linked list In C language a linked list would be implemented using structure and pointers struct LinkedList int data.. Creating nodes

A doubly linked list is like a linked list, but each node also has a previous field, which points to the nodes predecessor..

[8] A doubly linked list contains nodes which, in addition to a pointer storing the address of the next node, ha ve a pointer which stores the address of the previous node in

Linked List – sequence of nodes arranged one after another, with each node connected to the next by a “link” (like a chain). •••• each node is an

Including tokyo city as osaka guide looks great side trip to find the local and from.. Clearly demonstrates the time and transfer to set up

Finally, this theory of other hemisphere recruitment also sheds light on the frequent neuroimaging finding after TBI showing greater involvement of the right hemisphere

differ between sentences spoken by advanced German learners and native speakers of English, with the exception of meanC (overall shorter C intervals in the utterances of L2