Title: Linked Lists
1Linked Lists
- CSE1303 Part A
- Data Structures and Algorithms
2Overview
- Operations for Lists.
- Implementation of Linked Lists.
- Double Linked Lists.
3List Operations
- Go to a position in the list.
- Insert an item at a position in the list.
- Delete an item from a position in the list.
- Retrieve an item from a position.
- Replace an item at a position.
- Traverse a list.
4Linked List
Head
0
1
2
3
5ifndef LINKEDLISTH define LINKEDLISTH include
ltstdbool.hgt include node.h struct
LinkedListRec int count Node
headPtr typedef struct LinkedListRec
List void intializeList(List listPtr) bool
listEmpty(const List listPtr) Node
setPosition(const List listPtr, int
position) void insertItem(List listPtr, float
item, int position) float deleteNode(List
listPtr, int position) endif
6Initialize List
listPtr
addr of list
count
0
headPtr
NULL
void initializeList(List listPtr)
listPtr-gtheadPtr NULL listPtr-gtcount 0
7Set Position
- check if position is within range
- start with address of head node
- set count to 0
- while count is less than position
- follow link to next node
- increment count
- return address of current node
8Set Position
Head
0
2
1
2
position
9Node setPosition(const List listPtr, int
position) int i Node nodePtr
listPtr-gtheadPtr if (position lt 0 position
gt listPtr-gtcount) fprintf(stderr,
Invalid position\n) exit(1) else
for (i 0 i lt position i) nodePtr
nodePtr-gtnextPtr return
nodePtr
10Set Position
Head
0x30a8
0x2030
0x4000
2
position
0
i
0x4000
NodePtr
11Node setPosition(const List listPtr, int
position) int i Node nodePtr
listPtr-gtheadPtr if (position lt 0 position
gt listPtr-gtcount) fprintf(stderr,
Invalid position\n) exit(1) else
for (i 0 i lt position i) nodePtr
nodePtr-gtnextPtr return
nodePtr
12Node setPosition(const List listPtr, int
position) int i Node nodePtr
listPtr-gtheadPtr if (position lt 0 position
gt listPtr-gtcount) fprintf(stderr,
Invalid position\n) exit(1) else
for (i 0 i lt position i) nodePtr
nodePtr-gtnextPtr return
nodePtr
13Set Position
Head
0x30a8
0x2030
0x4000
2
position
0
i
0x4000
NodePtr
14Set Position
Head
0x30a8
0x2030
0x4000
2
position
1
i
0x2030
NodePtr
15Set Position
Head
0x30a8
0x2030
0x4000
2
position
2
i
0x30a8
NodePtr
16Insert
Head
0
2
1
If we insert it at position 0.
1
0
2
Head
17Insert
Head
0
2
1
If we insert it at position 0.
18Instead, suppose we insert it at position 1.
Head
1
0
2
19Instead, suppose we insert it at position 1.
Head
20void insertItem(List listPtr, float item, int
position) Node newNodePtr
makeNode(item) Node nodePtr NULL if
(position 0) newNodePtr-gtnextPtr
listPtr-gtheadPtr listPtr-gtheadPtr
newNodePtr else nodePtr
setPosition(listPtr, position-1)
newNodePtr-gtnextPtr nodePtr-gtnextPtr
nodePtr-gtnextPtr newNodePtr
listPtr-gtcount
21void insertItem(List listPtr, float item, int
position) Node newNodePtr
makeNode(item) Node nodePtr NULL if
(position 0) newNodePtr-gtnextPtr
listPtr-gtheadPtr listPtr-gtheadPtr
newNodePtr else nodePtr
setPosition(listPtr, position-1)
newNodePtr-gtnextPtr nodePtr-gtnextPtr
nodePtr-gtnextPtr newNodePtr
listPtr-gtcount
22void insertItem(List listPtr, float item, int
position) Node newNodePtr
makeNode(item) Node nodePtr NULL if
(position 0) newNodePtr-gtnextPtr
listPtr-gtheadPtr listPtr-gtheadPtr
newNodePtr else nodePtr
setPosition(listPtr, position-1)
newNodePtr-gtnextPtr nodePtr-gtnextPtr
nodePtr-gtnextPtr newNodePtr
listPtr-gtcount
23void insertItem(List listPtr, float item, int
position) Node newNodePtr
makeNode(item) Node nodePtr NULL if
(position 0) newNodePtr-gtnextPtr
listPtr-gtheadPtr listPtr-gtheadPtr
newNodePtr else nodePtr
setPosition(listPtr, position-1)
newNodePtr-gtnextPtr nodePtr-gtnextPtr
nodePtr-gtnextPtr newNodePtr
listPtr-gtcount
24void insertItem(List listPtr, float item, int
position) Node newNodePtr
makeNode(item) Node nodePtr NULL if
(position 0) newNodePtr-gtnextPtr
listPtr-gtheadPtr listPtr-gtheadPtr
newNodePtr else nodePtr
setPosition(listPtr, position-1)
newNodePtr-gtnextPtr nodePtr-gtnextPtr
nodePtr-gtnextPtr newNodePtr
listPtr-gtcount
25Inserting New List
0x30a8
Head
NULL
0
position
0x30a8
newNodePtr
26Inserting New List
0x30a8
Head
0
position
0x30a8
newNodePtr
27Inserting Start of List
Head
Head
0x30a8
0x2008
0x2000
0x2000
newNodePtr
0
position
28Inserting Start of List
Head
Head
0x30a8
0x2008
0x2000
0x2000
newNodePtr
0
position
29Inserting Start of List
Head
Head
0x30a8
0x2008
0x2000
0x2000
newNodePtr
0
position
30Inserting Inside the List
Head
0x3080
0x3050
0x2000
0x2000
newNodePtr
0
position
31Inserting Inside the List
Head
0x3080
0x3050
0x2000
0x2000
newNodePtr
0
position
32Inserting Inside the List
Head
0x3080
0x3050
0x2000
0x2000
newNodePtr
0
position
33Delete
Head
2
3
1
0
If we delete the Node at position 0.
34If we delete the Node at position 2.
Head
2
3
1
0
35If we delete the Node at position 2.
Head
2
36void deleteNode(List listPtr, int position)
Node oldNodePtr NULL Node nodePtr
NULL if (listPtr-gtcount gt 0 position lt
listPtr-gtcount) if (position 0)
oldNodePtr listPtr-gtheadPtr
listPtr-gtheadPtr oldNodePtr-gtnextPtr
else nodePtr setPosition(listPtr,
position - 1) oldNodePtr
nodePtr-gtnextPtr nodePtr-gtnextPtr
oldNodePtr-gtnextPtr
listPtr-gtcount-- free(oldNodePtr)
else fprintf(stderr, List is empty or
invalid position.\n) exit(1)
37void deleteNode(List listPtr, int position)
Node oldNodePtr NULL Node nodePtr
NULL if (listPtr-gtcount gt 0 position lt
listPtr-gtcount) if (position 0)
oldNodePtr listPtr-gtheadPtr
listPtr-gtheadPtr oldNodePtr-gtnextPtr
else nodePtr setPosition(listPtr,
position - 1) oldNodePtr
nodePtr-gtnextPtr nodePtr-gtnextPtr
oldNodePtr-gtnextPtr
listPtr-gtcount-- free(oldNodePtr)
else fprintf(stderr, List is empty or
invalid position.\n) exit(1)
38void deleteNode(List listPtr, int position)
Node oldNodePtr NULL Node nodePtr
NULL if (listPtr-gtcount gt 0 position lt
listPtr-gtcount) if (position 0)
oldNodePtr listPtr-gtheadPtr
listPtr-gtheadPtr oldNodePtr-gtnextPtr
else nodePtr setPosition(listPtr,
position - 1) oldNodePtr
nodePtr-gtnextPtr nodePtr-gtnextPtr
oldNodePtr-gtnextPtr
listPtr-gtcount-- free(oldNodePtr)
else fprintf(stderr, List is empty or
invalid position.\n) exit(1)
39void deleteNode(List listPtr, int position)
Node oldNodePtr NULL Node nodePtr
NULL if (listPtr-gtcount gt 0 position lt
listPtr-gtcount) if (position 0)
oldNodePtr listPtr-gtheadPtr
listPtr-gtheadPtr oldNodePtr-gtnextPtr
else nodePtr setPosition(listPtr,
position - 1) oldNodePtr
nodePtr-gtnextPtr nodePtr-gtnextPtr
oldNodePtr-gtnextPtr
listPtr-gtcount-- free(oldNodePtr)
else fprintf(stderr, List is empty or
invalid position.\n) exit(1)
40void deleteNode(List listPtr, int position)
Node oldNodePtr NULL Node nodePtr
NULL if (listPtr-gtcount gt 0 position lt
listPtr-gtcount) if (position 0)
oldNodePtr listPtr-gtheadPtr
listPtr-gtheadPtr oldNodePtr-gtnextPtr
else nodePtr setPosition(listPtr,
position - 1) oldNodePtr
nodePtr-gtnextPtr nodePtr-gtnextPtr
oldNodePtr-gtnextPtr
listPtr-gtcount-- free(oldNodePtr)
else fprintf(stderr, List is empty or
invalid position.\n) exit(1)
41Comparsion
- Linked Storage
- Unknown list size.
- Flexibility is needed.
- Contiguous Storage
- Known list size.
- Few insertions and deletions are made within the
list. - Random access
42Deleting 1st Node
Head
0x30a8
0x2030
0x4000
0
position
0x4000
NodePtr
43Deleting 1st Node
0x30a8
0x2030
0x4000
Head
0
position
0x4000
NodePtr
44Deleting 1st Node
0x30a8
0x2030
Head
0
position
0x4000
NodePtr
45Deleting Middle Node
Head
0x30a8
0x2030
0x4000
0
position
0x2030
NodePtr
46Deleting Middle Node
Head
0x30a8
0x2030
0x4000
0
position
0x2030
NodePtr
47Deleting Middle Node
Head
0x30a8
0x4000
0
position
0x2030
NodePtr
48Double Linked List Operations
- Go to a position in the list.
- Insert an item in a position in the list.
- Delete an item from a position in the list.
- Retrieve an item from a position.
- Replace an item at a position.
- Traverse a list, in both directions.
49Double Linked List
0
1
2
3
4
Current
50struct DoubleLinkNodeRec float
value struct DoubleLinkNodeRec
nextPtr struct DoubleLinkNodeRec
previousPtr typedef struct DoubleLinkNodeRec
Node struct DoubleLinkListRec int
count Node currentPtr int
position typedef struct DoubleLinkListRec
DoubleLinkList
51Insert at end
0x4000
0x3080
0x2030
0x2000
0x3080
0x2030
NULL
NULL
NULL
0x4000
0x3080
NULL
0x2030
Head
prevPtr
newPtr
0x2000
52Insert at end
0x4000
0x3080
0x2030
0x2000
0x3080
0x2030
0x2000
NULL
NULL
0x4000
0x3080
NULL
0x2030
Head
prevPtr
newPtr
0x2000
53Insert at end
0x4000
0x3080
0x2030
0x2000
0x3080
0x2030
0x2000
NULL
NULL
0x4000
0x3080
0x2030
0x2030
Head
prevPtr
newPtr
0x2000
54Insert inside the list
0x4000
0x3080
0x2030
0x3080
0x2030
NULL
NULL
0x4000
0x3080
0x2000
0x3080
Head
0x2000
prevPtr
NULL
newPtr
NULL
55Insert inside the list
0x4000
0x3080
0x2030
0x3080
0x2030
NULL
NULL
0x4000
0x3080
0x2000
0x3080
Head
0x2000
prevPtr
2030
newPtr
NULL
56Insert inside the list
0x4000
0x3080
0x2030
0x3080
0x2030
NULL
NULL
0x4000
0x3080
0x2000
0x3080
Head
0x2000
prevPtr
2030
newPtr
3080
57Insert inside the list
0x4000
0x3080
0x2030
0x3080
0x2030
NULL
NULL
0x4000
0x2000
0x2000
0x3080
Head
0x2000
prevPtr
2030
newPtr
3080
58Insert inside the list
0x4000
0x3080
0x2030
0x3080
0x2000
NULL
NULL
0x4000
0x2000
0x2000
0x3080
Head
0x2000
prevPtr
2030
newPtr
3080
59Delete from end
0x4000
0x3080
0x2030
0x3080
0x2030
NULL
NULL
0x4000
0x3080
Head
oldPtr
0x2030
60Delete from end
0x4000
0x3080
0x2030
0x3080
NULL
NULL
NULL
0x4000
0x3080
Head
oldPtr
0x2030
61Delete from end
0x4000
0x3080
0x3080
NULL
NULL
0x4000
Head
oldPtr
0x2030
62Delete from inside list
0x4000
0x3080
0x2030
0x3080
0x2030
NULL
NULL
0x4000
0x3080
Head
oldPtr
0x3080
63Delete from inside list
0x4000
0x3080
0x2030
0x2030
0x2030
NULL
NULL
0x4000
0x3080
Head
oldPtr
0x3080
64Delete from inside list
0x4000
0x3080
0x2030
0x2030
0x2030
NULL
NULL
0x4000
0x4000
Head
oldPtr
0x3080
65Delete from inside list
0x4000
0x2030
0x2030
NULL
NULL
0x4000
Head
oldPtr
0x3080
66Revision
- Linked List.
- Benefits of different implementations.
- Double Linked List.
Preparation
- Read Chapter 6 in Kruse et al.