Title: Lecture A9 Linked Lists
1Lecture A9Linked 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.
4Comparsion
- Linked Storage
- Unknown list size.
- Flexibility is needed.
- Contiguous Storage
- Known list size.
- Few insertions and deletions are made within the
list. - Random access
5Linked List
Head
0
1
2
3
6ifndef 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
7Initialize List
listPtr
addr of list
count
0
headPtr
NULL
void initializeList(List listPtr)
listPtr-gtheadPtr NULL listPtr-gtcount 0
8Set 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
9Set Position
Head
0
2
1
2
position
10Node 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
11Set Position
Head
0x30a8
0x2030
0x4000
2
position
0
i
0x4000
NodePtr
12Set Position
Head
0x30a8
0x2030
0x4000
2
position
0
i
0x4000
NodePtr
13Set Position
Head
0x30a8
0x2030
0x4000
2
position
1
i
0x2030
NodePtr
14Set Position
Head
0x30a8
0x2030
0x4000
2
position
2
i
0x30a8
NodePtr
15Insert
Head
0
2
1
If we insert it at position 0.
1
0
2
Head
16Insert
Head
0
2
1
If we insert it at position 0.
17Instead, suppose we insert it at position 1.
Head
1
0
2
18Instead, suppose we insert it at position 1.
Head
19void 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
20Inserting New List
0x30a8
Head
NULL
0
position
0x30a8
newNodePtr
21Inserting New List
0x30a8
Head
0
position
0x30a8
newNodePtr
22Inserting Start of List
Head
Head
0x30a8
0x2008
0x2000
0x2000
newNodePtr
0
position
23Inserting Start of List
Head
Head
0x30a8
0x2008
0x2000
0x2000
newNodePtr
0
position
24Inserting Start of List
Head
Head
0x30a8
0x2008
0x2000
0x2000
newNodePtr
0
position
25Inserting Inside the List
Head
0x3080
0x3050
NodePtr
0x3080
0x2000
0x2000
newNodePtr
1
position
26Inserting Inside the List
Head
0x3080
0x3050
NodePtr
0x3080
0x2000
0x2000
newNodePtr
1
position
27Inserting Inside the List
Head
0x3080
0x3050
NodePtr
0x3080
0x2000
0x2000
newNodePtr
1
position
28Delete
Head
2
3
1
0
If we delete the Node at position 0.
29If we delete the Node at position 2.
Head
2
3
1
0
30If we delete the Node at position 2.
Head
2
31void 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)
32Deleting 1st Node
Head
0x30a8
0x2030
0x4000
0
position
0x4000
NodePtr
33Deleting 1st Node
0x30a8
0x2030
0x4000
Head
0
position
0x4000
NodePtr
34Deleting 1st Node
0x30a8
0x2030
Head
0
position
0x4000
NodePtr
35Deleting Middle Node
Head
0x30a8
0x2030
0x4000
1
position
0x2030
NodePtr
0x2030
OldNodePtr
36Deleting Middle Node
Head
0x30a8
0x2030
0x4000
1
position
0x2030
NodePtr
0x2030
OldNodePtr
37Deleting Middle Node
Head
0x30a8
0x4000
1
position
0x2030
NodePtr
0x2030
OldNodePtr
38Double 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.
39Double Linked List
0
1
2
3
4
Current
40struct 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
41Insert at end
0x4000
0x3080
0x2030
0x2000
0x3080
0x2030
NULL
NULL
NULL
0x4000
0x3080
NULL
0x2030
currentPtr
prevPtr
newPtr
0x2000
42Insert at end
0x4000
0x3080
0x2030
0x2000
0x3080
0x2030
0x2000
NULL
NULL
0x4000
0x3080
NULL
0x2030
currentPtr
prevPtr
newPtr
0x2000
43Insert at end
0x4000
0x3080
0x2030
0x2000
0x3080
0x2030
0x2000
NULL
NULL
0x4000
0x3080
0x2030
0x2030
currentPtr
prevPtr
newPtr
0x2000
44Insert inside the list
0x4000
0x3080
0x2030
0x3080
0x2030
NULL
NULL
0x4000
0x3080
0x2000
0x3080
currentPtr
0x2000
prevPtr
NULL
newPtr
NULL
45Insert inside the list
0x4000
0x3080
0x2030
0x3080
0x2030
NULL
NULL
0x4000
0x3080
0x2000
0x3080
currentPtr
0x2000
prevPtr
2030
newPtr
NULL
46Insert inside the list
0x4000
0x3080
0x2030
0x3080
0x2030
NULL
NULL
0x4000
0x3080
0x2000
0x3080
currentPtr
0x2000
prevPtr
2030
newPtr
3080
47Insert inside the list
0x4000
0x3080
0x2030
0x3080
0x2030
NULL
NULL
0x4000
0x2000
0x2000
0x3080
currentPtr
0x2000
prevPtr
2030
newPtr
3080
48Insert inside the list
0x4000
0x3080
0x2030
0x3080
0x2000
NULL
NULL
0x4000
0x2000
0x2000
0x3080
currentPtr
0x2000
prevPtr
2030
newPtr
3080
49Delete from end
0x4000
0x3080
0x2030
0x3080
0x2030
NULL
NULL
0x4000
0x3080
oldPtr
0x2030
currentPtr
0x3080
prevPtr
50Delete from end
0x4000
0x3080
0x2030
0x3080
NULL
NULL
NULL
0x4000
0x3080
oldPtr
0x2030
currentPtr
0x3080
prevPtr
51Delete from end
0x4000
0x3080
0x3080
NULL
NULL
0x4000
oldPtr
0x2030
currentPtr
0x3080
prevPtr
52Delete from inside list
0x4000
0x3080
0x2030
0x3080
0x2030
NULL
NULL
0x4000
0x3080
oldPtr
0x3080
currentPtr
0x4000
prevPtr
53Delete from inside list
0x4000
0x3080
0x2030
0x2030
0x2030
NULL
NULL
0x4000
0x3080
oldPtr
0x3080
currentPtr
0x4000
prevPtr
54Delete from inside list
0x4000
0x3080
0x2030
0x2030
0x2030
NULL
NULL
0x4000
0x4000
oldPtr
0x3080
currentPtr
0x4000
prevPtr
55Delete from inside list
0x4000
0x2030
0x2030
NULL
NULL
0x4000
oldPtr
0x3080
Head
currentPtr
0x4000
prevPtr
56Revision
- Linked List.
- Benefits of different implementations.
- Double Linked List.
Preparation
- Read Chapter 6 in Kruse et al.