• Nenhum resultado encontrado

Estruturas de Dados / Programação 2 Listas Encadeadas

N/A
N/A
Protected

Academic year: 2022

Share "Estruturas de Dados / Programação 2 Listas Encadeadas"

Copied!
7
0
0

Texto

(1)

Estruturas de Dados / Programação 2 Listas Encadeadas

Márcio Ribeiro

[email protected] twitter.com/marciomribeiro

Arrays

What are the advantages of arrays?

What are the disadvantages of arrays?

Please, take 3 minutes to discuss with your friend about the above ques>ons

Let’s take a look on the memory alloca2on…

Can we create an array of 10 posi>ons?

Free Allocated

Unfortunately we can’t…

Arrays require con>guous posi>ons!

That’s why we can access any posi>on randomly!

*v v[5]

v[9]

v[7]

*(v+i)

What happens if we access a non-valid posi2on?

It depends on the language…

In C, some unknown value is recovered

In Java, an error is raised (the bounds are checked!)

a[119] = ?

Imagine that we MUST use an array with 10 posi2ons!

Is there anything in C language that can help us?

(2)

Linked List

Introduc2on

You probably men>oned pointers

And you are right!

Now, we will study a linear data structure (just like the known arrays) named Linked Lists

Linked Lists

Pointers are used to link each node of our list

We traverse the list by using the pointers

Rectangle = Node

Arrow = Pointer

No need to be con2nuous… Can’t do *(v+i)

We cannot guarantee that it will be con>nuous!

Free Allocated

Our Linked list Pointer

Linked Lists are Dynamic Data Structures! They grow

as we want!

This way, there is no direct access!

We navigate throughout the list by using the pointers…

But… where are the data?

Only pointers were presented so far…

What each node should store?

Take 3 minutes to discuss these ques>ons

(3)

In this par>cular case, this struct seems useless!

Each node should also contain the data we want to manipulate by inser>ng, removing, searching etc!

struct node { node *next;

};

Node: data + pointer

2 5 9

struct node { int item;

node *next;

};

Abstract Data Type:

Linked List

Linked List ADT

node* create_linked_list();

node* add(node *head, int item);

node* search(node *head, int item);

node* remove(node *head, int item);

int is_empty(node *head);

void print_linked_list(node *head);

Crea>ng a Linked List: return a pointer that points to NULL

This will be useful to navigate throughout the Linked List Let’s implement the TAD…

node* create_linked_list() {

return NULL;

}

int is_empty(node *head) {

return (head == NULL);

}

Adding elements… (at the beginning)

node* add(node *head, int item) {

node *new_node = (node*) malloc(sizeof(node));

new_node->item = item;

new_node->next = head;

return new_node;

}

2 5 9

3

(4)

Inser>ng 5 elements and then prin>ng the list Client code…

int main() {

node* list = create_linked_list();

list = add(list, 3);

list = add(list, 9);

list = add(list, 27);

list = add(list, 81);

list = add(list, 243);

printf("Complete list: \n");

print_linked_list(list);

}

Exercise 1: write the print_linked_list func2on

void print_linked_list(node *head) {

while (head != NULL) { printf("%d\n", head->item);

head = head->next;

} }

Exercise 2: complete the search func2on

node* search(node *head, int item) {

while (head != NULL) { if (head->item == item) { return head;

}

head = head->next;

}

return NULL;

}

Exercise 3: write the remove func2on

node* remove(node *head, int item) {

node *previous = NULL;

node *current = head;

while (current != NULL && current->item != item) { previous = current;

current = current->next;

}

if (current == NULL) { return head;

}

if (previous == NULL) { head = current->next;

} else {

previous->next = current->next;

}

free(current);

return head;

}

2 5 9

Exercise 4: write the print_linked_list func2on recursively

void print_linked_list(node *head) {

if (!is_empty(head)) { printf("%d\n", head->item);

print_linked_list(head->next);

} }

Only integers?!

What about a "Generic" List?!

(5)

2 5 9

Passenger Passenger Passenger

Student Student Student

struct node { ???????????

node *next;

};

struct node { void *item;

node *next;

};

*void Can hold the address

of an y type!

We can assign a p oint er o f an y type to a void pointe r!

void *v;

int *i;

int ivar;

char chvar;

float fvar;

passenger * passenger;

v = &ivar;

v = &chvar;

v = &fvar;

v = &passenger;

i = &ivar;

i = &chvar;

i = &fvar;

node* search(node *head, void *item) {

while (head != NULL) { if (head->item == item) { return head;

}

head = head->next;

}

return NULL;

}

int integers_equals(void *item1, void *item2) {

return (*((int*) item1) == *((int*) item2));

}

int strings_equals(void *item1, void *item2) {

return !strcmp(item1, item2);

}

node* search(node *head, void *item,

int (*equal)(void *item1, void *item2)) { {

while (head != NULL) {

if ((*equal) (head->item, item)) { return head;

}

head = head->next;

}

return NULL;

}

search(list_of_integers, &i, integers_equals);

search(list_of_strings, "IC-UFAL", strings_equals);

search(list_of_passengers, passenger, passengers_equals);

search(list_of_students, student, students_equals);

void print_linked_list_of_integers(node *head) {

while (head != NULL) {

printf("%d\n", *((int*) head->item));

head = head->next;

} }

void print_linked_list_of_strings(node *head) {

while (head != NULL) {

printf("%s\n", (char*) head->item);

head = head->next;

} }

(6)

Efficiency

Linked Lists versus Arrays

Get

Array = O(1)

Linked List = O(n)

Insert

Array = O(n)

Linked List = O(1)

What can we conclude?

Insert / Delete

Insert

Beginning: O(1)

Middle: O(n)

Delete

Beginning: O(1)

Middle: O(n)

Application

198503985129385723857398256982173 458923754987236408126409262748237 640283650892365908237590328759083 658314658315609348759034759180638 756981276358637490534190857698134 658716827356872365862301985690283 175098263958687346501983659827390 586908126358762786817631876786128 736468392093856891081273646437828 237665738291837678329173657382198 736573281827356738201283659832609 516983569028365908236590827359872

How to represent?

long long int?

(7)

1 9 8

………

………

………

………

………

………

………

………

………

8 7 2

5

9

References

Chapter 10 Chapter 3

Referências

Documentos relacionados

O controle da dor como um presente hipnótico é algo que você pode usar para ajudar alguém se livrar de uma dor de cabeça, por exemplo. É realmente mais de uma ferramenta

Para a representação desse tecido, optou-se por fazer apenas o neurônio (fig. 11A), porque é um dos principais componentes do tecido nervoso e constituem esse tecido com

Este artigo explora redes altamente interconectadas e estáticas, apresentando uma relação entre a quantidade de nós, número de usuários e número de conexões – ou

Para tanto, a pesquisa em textos escritos e imagéticos fontes primárias, secundárias e em redes sociais, Orkut e Facebook, ricos de informações sobre o perfil de consumo, círculo

As crianças com dificuldades escolares, mesmo sem distúrbios de aprendizagem, são de alto risco para desordens do processamento auditivo, recente estudo verificou que as

Diante da evolução nas transações entre entidades, principalmente, pelo advento da globalização e pelos recentes escândalos de grandes empresas, como o caso Enron discutido

Ora, dessa forma implica-se que o prestador de serviço suporte o ônus tributário duplamente, o que é um claro abuso no exercício do poder de tributar.” (MACHADO,

The main objective of this thesis is to investigate, through the analyses of Pause Protocol 3 verbalizations and reading comprehension questions, whether the