Data Structures - 06. Double Linked Lists

24
Universidade Federal da Paraíba Centro de Informática Doubly Linked Lists Lecture 8 1107186 – Estruturas de Dados Prof. Christian Azambuja Pagot CI / UFPB

description

Slide da cadeira de Estrutura de Dados, ministrado pelo Prof. Dr. Christian Pagot, na Universidade Federal da Paraíba.

Transcript of Data Structures - 06. Double Linked Lists

Page 1: Data Structures - 06. Double Linked Lists

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 !!!