51
Linked List - I

Linked List - I. Abstract Data Type (ADT) ADT is a data type whose properties (domain and operations) are specified independently of any particular implementation

  • View
    223

  • Download
    0

Embed Size (px)

Citation preview

Linked List - I

Abstract Data Type (ADT)

• ADT is a data type whose properties (domain and operations) are specified independently of any particular implementation. – Logical (or ADT) level: abstract view of

the domain and operations. – Implementation level: specific

representation of the structure to hold the data items, and the coding for operations.

4 Basic Kinds of ADT Operations

• Constructor/Destructor – creates/deletes a new instance (object) of an ADT.

• Transformer -- changes the state of one or more of the data values of an instance.

• Observer -- allows us to observe the state of one or more of the data values of an instance without changing them.

• Iterator -- allows us to process all the components in a data structure sequentially.

List

• Linear relationship Each element except the first has a unique predecessor, and each element except the last has a unique successor.

• Length The number of items in a list; the length can vary over time.

Class ShoppingListclass ShoppingList{public :

int LengthIs ( ) const ; void RetrieveItem (int pos) ;void InsertItem (const Item& item, int pos ) ; void RemoveItem (int pos);void DeleteAll ( );

private :int size ; Node *front ;

} ;

Singly Linked List Diagram

Pointer to front node

A B C NULL

Nodes

Data carried in node Pointer to next node

Class Node

A

Item item; Node *link;

class Node {public: Node(Item i){item = i};private: Item item; Node *link;};

Insert an item/node into shopping list?Delete an item/node?

Front Insert Example (1 of 6)

front

A B C

item link item link item link

prev cur pos

0

anItem

D? ?

void ShoppingList::insert(const Item & anItem, int pos) { Node *prev, //ignore prev ptr for the FrontInsert example

*cur; Inserting D at position 0

size

3

Front Insert Example (2 of 6)

front

A B C

item link item link item link

cur pos

0

anItem

D?

assert(pos >= 0 && pos <= size); size++;

size

4

Front Insert Example (3 of 6)

front

A B C

item link item link item link

cur pos

0

anItem

D

if (pos == 0) { // Inserting at the front cur = front;

size

4

Front Insert Example (4 of 6)

front

A B C

item link item link item link

cur pos

0

anItem

D

front = new Node(anItem);

size

4

D

item link

?

Front Insert Example (5 of 6)

front

A B C

item link item link item link

cur pos

0

anItem

D

front->link = cur;

size

4

D

item link

Front Insert Example (6 of 6)

front

A B C

item link item link item link

return; }

size

4

D

item link

Empty Insert Example (1 of 6)

size

cur pos

0

anItem

A?

void ShoppingList::insert(const Item & anItem, int pos) { Node *prev, //ignore prev for EmptyInsert example

*cur; Inserting A at position 0 in empty list

front

0

Empty Insert Example (2 of 6)

size

cur pos

0

anItem

A?

assert(pos >= 0 && pos <= size); size++;

front

1

Empty Insert Example (3 of 6)

size

cur pos

0

anItem

A

if (pos == 0) { // Inserting at the front cur = front;

front

1

Empty Insert Example (4 of 6)

size

cur pos

0

anItem

A

front = new Node(anItem);

front

1

A

item link

?

Empty Insert Example (5 of 6)

size

cur pos

0

anItem

A

front->link = cur;

front

1

A

item link

Empty Insert Example (6 of 6)

size

return; }

front

1

A

item link

Middle Insert Example (1 of 8)void ShoppingList::insert(const Item & anItem, int pos) { Node *prev, *cur; Inserting D at position 2

front

A B C

item link item link item link

prev cur pos

2

anItem

D? ?

size

3

Middle Insert Example (2 of 8) assert(pos >= 0 && pos <= size); size++;

front

A B C

item link item link item link

prev cur pos

2

anItem

D? ?

size

4

Middle Insert Example (3 of 8) prev = NULL; cur = front;

front

A B C

item link item link item link

prev cur pos

2

anItem

D

size

4

Middle Insert Example (4 of 8) while (pos > 0) { prev = cur; cur = cur->link; pos--; }

First Iteration

front

A B C

item link item link item link

prev cur pos

1

anItem

D

size

4

Middle Insert Example (5 of 8) while (pos > 0) { prev = cur; cur = cur->link; pos--; }

Second Iteration

front

A B C

item link item link item link

prev cur pos

0

anItem

D

size

4

Middle Insert Example (6 of 8) prev->link = new Node(anItem);

front

A B C

item link item link item link

prev cur pos

0

anItem

D

size

4

D ?

item link

Middle Insert Example (7 of 8) prev->link->link = cur;

front

A B C

item link item link item link

prev cur pos

0

anItem

D

size

4

D

item link

Middle Insert Example (8 of 8)}

front

A B C

item link item link item link

size

4

D

item link

End Insert Example (1 of 8)void ShoppingList::insert(const Item & anItem, int pos) { Node *prev, *cur; Inserting D at position 3

front

A B C

item link item link item link

prev cur pos

3

anItem

D? ?

size

3

End Insert Example (2 of 8) assert(pos >= 0 && pos <= size); size++;

front

A B C

item link item link item link

prev cur pos

3

anItem

D? ?

size

4

End Insert Example (3 of 8) prev = 0; cur = front;

front

A B C

item link item link item link

prev cur pos

3

anItem

D0

size

4

End Insert Example (4 of 8) while (pos > 0) { prev = cur; cur = cur->link; pos--; }

First Iteration

front

A B C

item link item link item link

prev cur pos

2

anItem

D

size

4

End Insert Example (5 of 8) while (pos > 0) { prev = cur; cur = cur->link; pos--; }

Second Iteration

front

A B C

item link item link item link

prev cur pos

1

anItem

D

size

4

End Insert Example (6 of 8) while (pos > 0) { prev = cur; cur = cur->link; pos--; }

Third Iteration

front

A B C

item link item link item link

prev cur pos

0

anItem

D

size

4

End Insert Example (7 of 8) prev->link = new Node(anItem); prev->link->link = cur;

front

A B C

item link item link item link

prev cur pos

0

anItem

D

size

4

D

item link

End Insert Example (8 of 8) }

front

A B C

item link item link item link

size

4

D

item link

void ShoppingList::insert(const Item & anItem, int pos) { Node *prev, *cur; assert(pos >= 0 && pos <= size); size++; if (pos == 0) { // Inserting at the front cur = front; front = new Node(anItem); front->link = cur; return; } prev = NULL; cur = front; while (pos > 0) { prev = cur; cur = cur->link; pos--; } prev->link = new Node(anItem); prev->link->link = cur;}

Remove Example (1 of 7)void ShoppingList::remove(int pos) { Node *cur, *prev; Removing at position 1

front

A B C

item link item link item link

prev cur pos

1? ?

size

3

Remove Example (2 of 7) assert(pos >= 0 && pos < size); size--;

front

A B C

item link item link item link

prev cur pos

1? ?

size

2

Remove Example (3 of 7) prev = NULL; cur = front;

front

A B C

item link item link item link

prev cur pos

1

size

2

Remove Example (4 of 7) while (pos > 0) { prev = cur; cur = cur->link; pos--; }

front

A B C

item link item link item link

prev cur pos

0

size

2

First iteration

Delete the node pointed by cur

Remove Example (5 of 7) prev->link = cur->link;

front

A B C

item link item link item link

prev cur pos

0

size

2

Remove Example (6 of 7) delete cur;

front

A B C

item link item link item link

prev cur pos

0

size

2

Remove Example (7 of 7)}

front

A C

item link item link

size

2

Delete All Example (1 of 8)void ShoppingList::deleteAll() { Node *kil;

front

A B C

item link item link item link

kil

?

size

3

Delete All Example (2 of 8) while (front != NULL) { kil = front; front = front->link;

A B C

item link item link item link

kil

frontsize

3

First iteration

Delete All Example (3 of 8) kil->link = NULL; delete kil; }

A B C

item link item link item link

kil

frontsize

3

First iteration

Delete All Example (4 of 8) while (front != NULL) { kil = front; front = front->link;

B C

item link item link

kil

frontsize

3

Second iteration

Delete All Example (5 of 8) kil->link = NULL; delete kil; }

B C

item link item link

kil

frontsize

3

Second iteration

Delete All Example (6 of 8) while (front != NULL) { kil = front; front = front->link;

C

item link

kil

frontsize

3

Third iteration

Delete All Example (7 of 8) kil->link = 0; delete kil; }

C

item link

kil

frontsize

3

Third iteration

0

Delete All Example (8 of 8) size = 0;}

frontsize

0