Download - Data Structures - 06. Double Linked Lists
![Page 1: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/1.jpg)
Universidade Federal da ParaíbaCentro de Informática
Doubly Linked ListsLecture 8
1107186 – Estruturas de Dados
Prof. Christian Azambuja PagotCI / UFPB
![Page 2: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/2.jpg)
2Universidade Federal da ParaíbaCentro de Informática
Array x Single Linked Lists
● Arrays:– Searching an element: constant cost.
– Inserting a new element: linear cost (~n).
● Single Linked Lists:– Searching an element: linear cost (~n).
– Inserting a new element: may be constant.
![Page 3: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/3.jpg)
3Universidade Federal da ParaíbaCentro de Informática
Doubly Linked Lists
● Their elements (nodes) may be (and are likely to be) spread over the memory.
● Nodes are connected to others through two pointers:– One pointer to the next element.
– One pointer to the previous element.
● Have varying sizes.● Each position is referenced through a pointer.
![Page 4: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/4.jpg)
4Universidade Federal da ParaíbaCentro de Informática
The Costs of Doubly Linked Lists
● Inserting a new element?– Once you have a pointer to the current element,
the insertion after is constant.
nvalue
next
103
prev null
value
next
235
prev
value
next
98
null
prev
![Page 5: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/5.jpg)
5Universidade Federal da ParaíbaCentro de Informática
The Costs of Doubly Linked Lists
● Inserting a new element?– Once you have a pointer to the current element,
the insertion after is constant.
nvalue
next
103
prev null
value
next
235
prev
value
next
98
null
prev
value
next
103
?
prev ?
new
![Page 6: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/6.jpg)
6Universidade Federal da ParaíbaCentro de Informática
The Costs of Doubly Linked Lists
● Inserting a new element?– Once you have a pointer to the current element,
the insertion after is constant.
nvalue
next
103
prev null
value
next
235
prev
value
next
98
null
prev
value
next
103
prev ?
new
![Page 7: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/7.jpg)
7Universidade Federal da ParaíbaCentro de Informática
The Costs of Doubly Linked Lists
● Inserting a new element?– Once you have a pointer to the current element,
the insertion after is constant.
nvalue
next
103
prev null
value
next
235
prev
value
next
98
null
prev
value
next
103
prev
new
![Page 8: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/8.jpg)
8Universidade Federal da ParaíbaCentro de Informática
The Costs of Doubly Linked Lists
● Inserting a new element?– Once you have a pointer to the current element,
the insertion after is constant.
nvalue
next
103
prev null
value
next
235
prev
value
next
98
null
prev
value
next
103
prev
new
![Page 9: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/9.jpg)
9Universidade Federal da ParaíbaCentro de Informática
The Costs of Doubly Linked Lists
● Inserting a new element?– Once you have a pointer to the current element,
the insertion after is constant.
nvalue
next
103
prev null
value
next
235
prev
value
next
98
null
prev
value
next
103
prev
new
![Page 10: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/10.jpg)
10Universidade Federal da ParaíbaCentro de Informática
A Doubly Linked List Implementation
struct Node{
int value;struct Node* next;struct Node* prev;
};...
struct Node* n1;
n1 = (struct Node*) malloc (sizeof(struct Node));n1>value = 1;n1>prev = NULL; n1>next = NULL;
InsertAfterDLLElement(n1, 2);
C code excerpt: List nodestructure.
Pointer to a node.
Initializationof the 1st. node.
Insert elementafter node n1.
![Page 11: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/11.jpg)
11Universidade Federal da ParaíbaCentro de Informática
InsertAfterSLLElement(...)
void InsertAfterDLLElement(struct Node* n, int val){
struct Node* new;
new = (struct Node*) malloc (sizeof(struct Node));new>value = val;new>prev = n;new>next = n>next;n>next>prev = new;n>next = new;
}
C code excerpt:
![Page 12: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/12.jpg)
12Universidade Federal da ParaíbaCentro de Informática
List Descriptor
struct SLList{
struct Node* head;struct Node* tail;int size;
};
struct Node{
int value;struct Node* prev;struct Node* next;
};
C code excerpt:
● The descriptor contains a pointer to the head, a pointer to the tail, and the number of elements of the doubly linked list:
It can also contain important information about the list,
such as the length.
![Page 13: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/13.jpg)
13Universidade Federal da ParaíbaCentro de Informática
Application Example: Big Integers
● Suppose you have to implement a system capable to store very large positive integers, composed of hundreds or thousands of digits.
● Consider that this system must be able to sum two such numbers.
● Consider also that the system must check which, of two numbers, is the larger.
![Page 14: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/14.jpg)
14Universidade Federal da ParaíbaCentro de Informática
Application Example: Big Integers
● How does the check for the larger number works?– The number with more digits is the larger.
– If the number of digits is equal:● We must compare the corresponding digits of each
number, from left to right, until they are different. ● The number with the larger digit is the larger number.
![Page 15: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/15.jpg)
15Universidade Federal da ParaíbaCentro de Informática
Application Example: Big Integers
● How does the check for the larger number works?– Example:
1 2 3 41st number:
1 2 4 42nd number:
The 2nd number is larger.
![Page 16: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/16.jpg)
16Universidade Federal da ParaíbaCentro de Informática
Application Example: Big Integers
● How does the sum works?– Consider the following expression: 123 + 456
1 2 3
5 6 7+
6 9 0
1
![Page 17: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/17.jpg)
17Universidade Federal da ParaíbaCentro de Informática
A Doubly Linked List Implementation of Big Integers
● The number of digits may be large: – Digits will be represented by nodes in a linked list.
● We have to loop over the list from both directions:– The list will be doubly linked.
● Each loop must start at one end of the list:– There will be a list descriptor with pointers to the head
and tail of the list.
![Page 18: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/18.jpg)
18Universidade Federal da ParaíbaCentro de Informática
A Doubly Linked List Implementation of Big Integers
● We start by implementing the list descriptor and node:
struct DLList{
int size;struct Node* head;struct Node* tail;
};
struct Node{
int value;struct Node* prev;struct Node* next;
};...
C code excerpt:
![Page 19: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/19.jpg)
19Universidade Federal da ParaíbaCentro de Informática
A Doubly Linked List Implementation of Big Integers
● We need a function that inserts digits into the list
void InsertAtBeginningDLLElement(struct DLList* l, int val){
struct Node* new;
if (l>head == NULL){
l>head = (struct Node*) malloc (sizeof(struct Node));l>tail = l>head;l>head>value = val;l>head>prev = NULL;l>head>next = NULL;
}else...
}...
C code excerpt:
![Page 20: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/20.jpg)
20Universidade Federal da ParaíbaCentro de Informática
A Doubly Linked List Implementation of Big Integers
● We need a function that inserts digits into the list
void InsertAtBeginningDLLElement(struct DLList** l, int val){
... else{
new = (struct Node*) malloc (sizeof(struct Node));new>value = val;new>prev = NULL;new>next = l>head;l>head>prev = new;l>head = new;
}
l>size++;}...
C code excerpt:
![Page 21: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/21.jpg)
21Universidade Federal da ParaíbaCentro de Informática
A Doubly Linked List Implementation of Big Integers
● We need code that compares two integers:
struct DLList* l1;struct DLList* l2;
...
if (l1>size > l2>size)printf("l1 is bigger than l2.\n");
elseif (l1>size < l2>size)
printf("l2 is bigger than l1.\n");else
...
C code excerpt:
![Page 22: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/22.jpg)
22Universidade Federal da ParaíbaCentro de Informática
A Doubly Linked List Implementation of Big Integers
● We need code that compares two integers:else {
struct Node* n1 = l1>tail;struct Node* n2 = l2>tail;
while ((n1 != NULL) && (n1>value == n2>value)) {n1 = n1>prev;n2 = n2>prev;printf("[n1: %p] [n2: %p]\n", n1, n2);
}
if (n1 == NULL)printf("l1 and l2 are equal.\n");
elseif (n1>value > n2>value)
printf("l1 is bigger than l2.\n");else
printf("l2 is bigger than l1.\n");}
C code excerpt:
Short circuit!!!
A B A && B
F F FF V FV F FV V V
![Page 23: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/23.jpg)
23Universidade Federal da ParaíbaCentro de Informática
A Doubly Linked List Implementation of Big Integers
● We need code that sums two integers:
It is trivial and left as an exercise :)
![Page 24: Data Structures - 06. Double Linked Lists](https://reader033.vdocuments.site/reader033/viewer/2022042614/558defae1a28ab207e8b46e4/html5/thumbnails/24.jpg)
24Universidade Federal da ParaíbaCentro de Informática
Discussion
● Considering the doubly linked lists:– Which types of data structures would benefit from
doubly linked lists?
– Application examples.
Think about it !!!