listas lineares ordenadas -...

83
José Augusto Baranauskas Departamento de Física e Matemática – FFCLRP-USP [email protected] http://dfm.ffclrp.usp.br/~augusto Algoritmos e Estruturas de Dados I Listas Lineares Ordenadas Listas Lineares Ordenadas Nesta apresentação será apresentado o ADT lista linear ordenada Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre os elementos que compõem a lista e que deve ser respeitada

Upload: others

Post on 07-Aug-2020

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

José Augusto BaranauskasDepartamento de Física e Matemática – FFCLRP-USP

[email protected]://dfm.ffclrp.usp.br/~augusto

Algoritmos eEstruturas de Dados I

Listas Lineares OrdenadasListas Lineares Ordenadas

Nesta apresentação será apresentado o ADT lista linear ordenadaUma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre os elementos que compõem a lista e que deve ser respeitada

Page 2: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

2

IntroduçãoIntrodução

Na apresentação anterior comentamos brevemente que os algoritmos de listas podem ser melhorados em termos de eficiência e simplicidade, fazendo-se uso do elemento sentinelaEsta técnica simples é válida para ambas implementações (contígua e encadeada) tanto para listas lineares como listas lineares ordenadas

Page 3: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

3

OrganizaçãoOrganização

Definição do ADT Lista OrdenadaEspecificação

Operações sobre o ADT Lista Ordenada, utilizando pré- e pós-condições

ImplementaçãoEstática (contígua, deixada como exercício)Dinâmica (encadeada)

Page 4: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

4

DefiniçãoDefinição

Uma lista linear ordenada é uma lista linear de nelementos [a1, a2, ..., ai, ..., an]

O primeiro elemento da lista é a1O segundo elemento da lista é a2...O i-ésimo elemento da lista é ai...O último elemento da lista é an

Na qual há uma relação de ordem (<, <=, >, >=) entre os elementos:

Ordem crescente: a1 < a2 < ... < an-1 < an ou a1 <= a2 <= ... <= an-1<= anOrdem decrescente: a1 > a2 > ... > an-1 > an ou a1 >= a2 >= ... >= an-1 >= an

Trataremos de listas em ordem crescente, sem nenhum prejuízo de generalidade

Page 5: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

5

EspecificaçãoEspecificação

Operações:CriaçãoDestruiçãoStatusOperações BásicasOutras Operações

Page 6: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

6

CriaçãoCriação

OrderedList::OrderedList();pré-condição: nenhumapós-condição: Lista é criada e iniciada como vazia

Page 7: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

7

DestruiçãoDestruição

OrderedList::~OrderedList();pré-condição: Lista já tenha sido criadapós-condição: Lista é destruída, liberando espaço ocupado pelo seus elementos

Page 8: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

8

StatusStatus

bool OrderedList::Empty();pré-condição: Lista já tenha sido criadapós-condição: função retorna true se a Lista está vazia; false caso contrário

Page 9: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

9

StatusStatus

bool OrderedList::Full();pré-condição: Lista já tenha sido criadapós-condição: função retorna true se a Lista está cheia; false caso contrário

Page 10: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

10

Operações BásicasOperações Básicas

void OrderedList::Insert(ListEntry x);pré-condição: Lista já tenha sido criada, não está cheiapós-condição: O item x é armazenado em ordem na Lista

O tipo ListEntry depende da aplicação e pode variar

desde um simples caracter ounúmero até uma struct ouclass com muitos campos

Page 11: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

11

Operações BásicasOperações Básicas

void OrderedList::Delete(ListEntry x);pré-condição: Lista já tenha sido criada, não está vazia e o item x pertence à listapós-condição: O item x é removido da Lista, mantendo-a ordenada

Page 12: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

12

Operações BásicasOperações Básicas

int OrderedList::Search(ListEntry x);pré-condição: Lista já tenha sido criadapós-condição: Retorna a posição p da Lista em que x foi encontrado 1 ≤ p ≤ n, onde né o número de entradas na Lista; caso exista mais de um x na Lista, retorna o primeiro encontrado; retorna zero caso xnão pertença à Lista

Page 13: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

13

Outras OperaçõesOutras Operações

void OrderedList::Clear();pré-condição: Lista já tenha sido criadapós-condição: todos os itens da Lista são descartados e ela torna-se uma Lista vazia

Page 14: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

14

Outras OperaçõesOutras Operações

int OrderedList::Size();pré-condição: Lista já tenha sido criadapós-condição: função retorna o número de itens na Lista

Page 15: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

15

Implementação EncadeadaImplementação Encadeada

Por razões de eficiência, introduziremos uma variável privada nos campos do objeto chamada sentinel, que será alocada no construtor e liberado no destruidorAlém disso, ao invés de iniciarmos

head = NULL; head

Page 16: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

16

Implementação EncadeadaImplementação Encadeada

Por razões de eficiência, introduziremos uma variável privada nos campos do objeto chamada sentinel, que será alocada no construtor e liberado no destruidorAlém disso, ao invés de iniciarmos

head = NULL;Utilizaremos:

head = sentinel;

head

sentinel

head

Page 17: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

17

Implementação EncadeadaImplementação Encadeada

As entradas de uma lista são colocadas em um estrutura (ListNode) que contém um campo com o valor existente na lista (Entry) e outro campo é um apontador para o próximo elemento na lista (NextNode)

4 8 10

4 8 10

Campo de dados(Entry)

Campo de ligação(NextNode)

Nó(ListNode)

Page 18: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

18

Implementação EncadeadaImplementação Encadeada

Nós precisamos armazenar o início da lista...

8

Campo de dados(Entry)

Campo de ligação(NextNode)

Nó(ListNode)

head

Um ponteiro armazenao início da lista

4 10

4 8 10

Page 19: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

19

Implementação EncadeadaImplementação Encadeada

Nós precisamos armazenar o início da lista e o sentinela...

8

Campo de dados(Entry)

Campo de ligação(NextNode)

Nó(ListNode)

head

Um ponteiro armazenao elemento sentinela

4 10

4 8 10

sentinel

Page 20: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

20

Implementação EncadeadaImplementação Encadeada

...e um contador que indica a quantidade de elementos na lista

8

Campo de dados(Entry)

Campo de ligação(NextNode)

Nó(ListNode)

head

4 10

4 8 10

sentinel

3 count

Page 21: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

21

QuestãoQuestão

Utilize estas idéias para escrever uma declaração de tipo que poderia implementar uma lista encadeada. A declaração deve ser um objeto com dois campos de dados

Você tem 5 minutospara escrever a declaração

Page 22: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

22

Uma SoluçãoUma Soluçãoclass OrderedList{ public:

OrderedList();~OrderedList();void Insert(int x);void Delete(int x);int Search(int x);bool Empty();bool Full();

private:// declaração de tiposstruct ListNode{ int Entry; // tipo de dado colocado na lista

ListNode *NextNode; // ligação para próximo elemento na lista};typedef ListNode *ListPointer;

// declaração de camposListPointer head, sentinel; // início da lista e sentinelaint count; // número de elementos

};

Page 23: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

23

Uma SoluçãoUma Soluçãoclass OrderedList{ public:

OrderedList();~OrderedList();void Insert(int x);void Delete(int x);int Search(int x);bool Empty();bool Full();

private:// declaração de tiposstruct ListNode{ int Entry; // tipo de dado colocado na lista

ListNode *NextNode; // ligação para próximo elemento na lista};typedef ListNode *ListPointer;

// declaração de camposListPointer head, sentinel; // início da lista e sentinelaint count; // número de elementos

};

Observe que o tipoListEntry nesse caso éum inteiro

Page 24: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

24

Construtor Construtor

OrderedList::OrderedList()

A Lista deve iniciar vazia, cuja convenção é apontar parao elemento sentinela

head

OrderedList::OrderedList()

{

...

}

sentinel

Page 25: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

25

Construtor Construtor

OrderedList::OrderedList()

A Lista deve iniciar vazia, cuja convenção é apontar parao elemento sentinela

head

OrderedList::OrderedList()

{

sentinel = new ListNode;

...

}

sentinel

Page 26: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

26

Construtor Construtor

OrderedList::OrderedList()

A Lista deve iniciar vazia, cuja convenção é apontar parao elemento sentinela

head

OrderedList::OrderedList()

{

sentinel = new ListNode;

head = sentinel;

count = 0;

}

sentinel

Page 27: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

27

Destruidor Destruidor

OrderedList::~OrderedList()

O destruidor deve retirar todos os elementos da lista enquanto ela não estiver vazia.Lembre-se que atribuir NULL a head não libera o espaço alocado anteriormente eque o elemento sentinela também deve ser liberado!

OrderedList::~OrderedList(){ ListPointer q;

while (head != sentinel){ q = head;

head = head->NextNode;delete q;

}delete sentinel;

}

head4

sentinel

Page 28: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

28

Status: Status: EmptyEmpty

bool OrderedList::Empty()

Lembre-se que a lista iniciavazia, com head = sentinel...

bool OrderedList::Empty()

{

return (head == sentinel);

}

head

sentinel

Page 29: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

29

Status: Status: FullFull

bool OrderedList::Full()

...e que não há limite quanto ao númeromáximo de elementos da lista

bool OrderedList::Full()

{

return false;

}

head4

sentinel

Page 30: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

30

Inserção Após um ElementoInserção Após um Elemento

A inserção de um elemento designado por uma variável ponteiro q que deve ser inserido em uma lista após o elemento apontado por p

p

... ...

q

4 8 10

9

Page 31: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

31

Inserção Após um ElementoInserção Após um Elemento

A inserção de um elemento designado por uma variável ponteiro q que deve ser inserido em uma lista após o elemento apontado por p

q->NextNode = p->NextNode;

p

... ...

q

4 8 10

9

Page 32: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

32

Inserção Após um ElementoInserção Após um Elemento

A inserção de um elemento designado por uma variável ponteiro q que deve ser inserido em uma lista após o elemento apontado por p

q->NextNode = p->NextNode;p->NextNode = q;

p

... ...

q

4 8 10

9

Page 33: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

33

Inserção Antes de um ElementoInserção Antes de um Elemento

A inserção de um elemento x designado por uma variável ponteiro q que deve ser inserido em uma lista antes do elemento apontado por p

p

... ...

q

4 8 10

x 7

Page 34: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

34

Inserção Antes de um ElementoInserção Antes de um Elemento

A inserção de um elemento x designado por uma variável ponteiro q que deve ser inserido em uma lista antes do elemento apontado por p

*q = *p;

p

... ...

q

4 8 10

8x 7

Page 35: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

35

Inserção Antes de um ElementoInserção Antes de um Elemento

A inserção de um elemento x designado por uma variável ponteiro q que deve ser inserido em uma lista antes do elemento apontado por p

*q = *p;p->Entry = x;

p

... ...

q

4 7 10

8x 7

Page 36: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

36

Inserção Antes de um ElementoInserção Antes de um Elemento

A inserção de um elemento x designado por uma variável ponteiro q que deve ser inserido em uma lista antes do elemento apontado por p

*q = *p;p->Entry = x;p->NextNode = q;

p

... ...

q

4 7 10

8x 7

Page 37: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

37

Operações Básicas: Operações Básicas: InsertInsert

Entretanto, se a inserção ocorrer no sentinela (no início...

p

7

sentinel

head

q

Page 38: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

38

Operações Básicas: Operações Básicas: InsertInsert

Entretanto, se a inserção ocorrer no sentinela (no início...

p->NextNode = q;

p

7

sentinel

head

q

Page 39: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

39

Operações Básicas: Operações Básicas: InsertInsert

Entretanto, se a inserção ocorrer no sentinela (no início...

p->NextNode = q;sentinel = q;

p

7head

q

sentinel

Page 40: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

40

Operações Básicas: Operações Básicas: InsertInsert

Entretanto, se a inserção ocorrer no sentinela (no início ou no fim)

p->NextNode = q;sentinel = q;

p

4 8 10

sentinel

head

12

q

Page 41: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

41

Operações Básicas: Operações Básicas: InsertInsert

Entretanto, se a inserção ocorrer no sentinela (no início ou no fim)

p->NextNode = q;sentinel = q;

p

4 8 10

sentinel

head

12

q

Page 42: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

42

Operações Básicas: Operações Básicas: InsertInsert

Entretanto, se a inserção ocorrer no sentinela (no início ou no fim)

p->NextNode = q;sentinel = q;

p

4 8 10head

12

q

sentinel

Page 43: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

43

Ponto de InserçãoPonto de Inserção

Para encontrarmos a posição onde um novo elemento xdeve ser inserido é simples, com o uso de sentinela

4 8 10

x 7

sentinel

head

Page 44: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

44

Ponto de InserçãoPonto de Inserção

Para encontrarmos a posição onde um novo elemento xdeve ser inserido é simples, com o uso de sentinela

sentinel->Entry = x;

4 8 10

x 7

sentinel

head

7

Page 45: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

45

Ponto de InserçãoPonto de Inserção

Para encontrarmos a posição onde um novo elemento xdeve ser inserido é simples, com o uso de sentinela

sentinel->Entry = x;p = head;

4 8 10

x 7

sentinel

head

p

7

Page 46: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

46

Ponto de InserçãoPonto de Inserção

Para encontrarmos a posição onde um novo elemento xdeve ser inserido é simples, com o uso de sentinela

sentinel->Entry = x;p = head;while(p->Entry < x)

p = p->NextNode;

p

4 8 10

x 7

sentinel

head

7

Page 47: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

47

Ponto de InserçãoPonto de Inserção

Note que o fragmento de código encontra o sentinela se a lista estiver vazia ou o número inserido tem valor maior do que qualquer outro elemento da lista ordenada

sentinel->Entry = x;p = head;while(p->Entry < x)

p = p->NextNode;

x 7

sentinel

head

Page 48: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

48

Ponto de InserçãoPonto de Inserção

Note que o fragmento de código encontra o sentinela se a lista estiver vazia ou o número inserido tem valor maior do que qualquer outro elemento da lista ordenada

sentinel->Entry = x;p = head;while(p->Entry < x)

p = p->NextNode;

7

x 7

sentinel

head

Page 49: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

49

Ponto de InserçãoPonto de Inserção

Note que o fragmento de código encontra o sentinela se a lista estiver vazia ou o número inserido tem valor maior do que qualquer outro elemento da lista ordenada

sentinel->Entry = x;p = head;while(p->Entry < x)

p = p->NextNode;

p

7

x 7

sentinel

head

Page 50: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

50

Ponto de InserçãoPonto de Inserção

Note que o fragmento de código encontra o sentinela se a lista estiver vazia ou o número inserido tem valor maiordo que qualquer outro elemento da lista ordenada

sentinel->Entry = x;p = head;while(p->Entry < x)

p = p->NextNode;

4 8 10

x 12

sentinel

head

Page 51: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

51

Ponto de InserçãoPonto de Inserção

Note que o fragmento de código encontra o sentinela se a lista estiver vazia ou o número inserido tem valor maiordo que qualquer outro elemento da lista ordenada

sentinel->Entry = x;p = head;while(p->Entry < x)

p = p->NextNode;

4 8 10

x 12

sentinel

head

12

Page 52: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

52

Ponto de InserçãoPonto de Inserção

Note que o fragmento de código encontra o sentinela se a lista estiver vazia ou o número inserido tem valor maiordo que qualquer outro elemento da lista ordenada

sentinel->Entry = x;p = head;while(p->Entry < x)

p = p->NextNode;

4 8 10

x 12

sentinel

head

12

p

Page 53: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

53

Ponto de InserçãoPonto de Inserção

Note que o fragmento de código encontra o sentinela se a lista estiver vazia ou o número inserido tem valor maiordo que qualquer outro elemento da lista ordenada

sentinel->Entry = x;p = head;while(p->Entry < x)

p = p->NextNode;

p

4 8 10

x 12

sentinel

head

12

Page 54: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

54

Ponto de InserçãoPonto de Inserção

Note que o fragmento de código encontra o sentinela se a lista estiver vazia ou o número inserido tem valor maiordo que qualquer outro elemento da lista ordenada

sentinel->Entry = x;p = head;while(p->Entry < x)

p = p->NextNode;

4 8 10

x 12

sentinel

head

12

p

Page 55: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

55

Ponto de InserçãoPonto de Inserção

Note que o fragmento de código encontra o sentinela se a lista estiver vazia ou o número inserido tem valor maiordo que qualquer outro elemento da lista ordenada

sentinel->Entry = x;p = head;while(p->Entry < x)

p = p->NextNode;

4 8 10

x 12

sentinel

head

12

p

Page 56: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

56

Operações Básicas: Operações Básicas: InsertInsert

void OrderedList::Insert(int x){ ListPointer p, q;

// Buscar local de inserçãosentinel->Entry = x;p = head;while(p->Entry < x)

p = p->NextNode;

q = new ListNode;if(q == NULL){ cout << “Memória insuficiente”;abort();

}

if(p == sentinel){ p->NextNode = q;

sentinel = q;}else{ *q = *p;

p->Entry = x;p->NextNode = q;

}count++;

}

Page 57: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

57

Operações Básicas: Operações Básicas: DeleteDelete

Diferentemente da estratégia adotada na inserção, na qual apenas um ponteiro percorre a lista ordenada até encontrar o ponto de inserção, a operação de remoção requer o percurso na lista ordenada com dois ponteirosSeja p um ponteiro que fica sempre uma posição atrás do ponteiro q na lista ordenadaApós encontrar os dois ponteiros p e q é trivial remover um elemento (ou mesmo inserir, deixado como exercício)

Page 58: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

58

Exemplo: Dois Ponteiros e Busca Exemplo: Dois Ponteiros e Busca do Elemento x=9do Elemento x=9

q

O ponteiro p fica sempre uma posição atrás de q

8head

4 10

sentinel

p

Page 59: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

59

Exemplo: Dois Ponteiros e Busca Exemplo: Dois Ponteiros e Busca do Elemento x=9do Elemento x=9

q

8head

4 10

sentinel

p

9

O ponteiro p fica sempre uma posição atrás de q

Page 60: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

60

Exemplo: Dois Ponteiros e Busca Exemplo: Dois Ponteiros e Busca do Elemento x=9do Elemento x=9

q

8head

4 10

sentinel

p

9

O ponteiro p fica sempre uma posição atrás de q

Page 61: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

61

Exemplo: Dois Ponteiros e Busca Exemplo: Dois Ponteiros e Busca do Elemento x=9do Elemento x=9

q

8head

4 10

sentinel

p

9

O ponteiro p fica sempre uma posição atrás de q

Page 62: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

62

Operações Básicas: Operações Básicas: DeleteDelete

Uma vez encontrados o ponteiro q(elemento a ser removido) e p o ponteiro para o nó precedente

p

... ...

q

Page 63: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

63

Operações Básicas: Operações Básicas: DeleteDelete

Uma vez encontrados o ponteiro q(elemento a ser removido) e p o ponteiro para o nó precedente

p->NextNode = q->NextNode;...

p

... ...

q

Page 64: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

64

Operações Básicas: Operações Básicas: DeleteDelete

Uma vez encontrados o ponteiro q(elemento a ser removido) e p o ponteiro para o nó precedente

p->NextNode = q->NextNode;delete q;

p

... ...

q

Page 65: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

65

Operações Básicas: Operações Básicas: DeleteDelete

Entretanto, se a remoção ocorrer no início da lista

head

...

qp

Page 66: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

66

Operações Básicas: Operações Básicas: DeleteDelete

Entretanto, se a remoção ocorrer no início da lista

head = q->NextNode;

head

...

qp

Page 67: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

67

Operações Básicas: Operações Básicas: DeleteDelete

Entretanto, se a remoção ocorrer no início da lista

head = q->NextNode;delete q;

head

...

qp

Page 68: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

68

Operações Básicas: Operações Básicas: DeleteDelete

void OrderedList::Delete(int x){ ListPointer p=NULL, q=head;

// Buscar local de remoçãosentinel->Entry = x;while(q->Entry < x){ p = q;

q = q->NextNode;}

// Encontrou x?if (q->Entry != x || q == sentinel){ cout << “Elemento inexistente”;abort();

}

// Local de remoçãoif(q == head) head = q->NextNode;

elsep->NextNode = q->NextNode;

delete q;count = count - 1;

}

Page 69: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

69

Operações Básicas: Operações Básicas: SearchSearch

A operação de busca é simples, considerando o uso de sentinela, como no caso da inserçãoO elemento x a ser pesquisado deve ser colocado no campo de dados do sentinelaA busca do elemento x dá-se do início da lista ordenada e prossegue até que um elemento maior ou igual a x seja encontradoHá três situações possíveis

(i) Um elemento maior do que x foi encontrado, mas não igual a x(ii) Elemento x foi encontrado como sendo sentinela(iii) Elemento x foi encontrado como parte da lista

Somente no último caso considera-se que o elemento de pesquisa x foi encontrado na lista ordenada

Page 70: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

70

Operações Básicas: Operações Básicas: SearchSearch(i) Um elemento maior do que (i) Um elemento maior do que xx foi encontrado, mas foi encontrado, mas não igual a não igual a xx

q

8head

4 10

sentinel

7

x 7A busca continua enquanto o

elemento atual < x

Page 71: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

71

Operações Básicas: Operações Básicas: SearchSearch(i) Um elemento maior do que (i) Um elemento maior do que xx foi encontrado, mas foi encontrado, mas não igual a não igual a xx

q

8head

4 10

sentinel

7

x 7A busca continua enquanto o

elemento atual < x

Note que um elemento maior do que x foi

encontrado, mas não igual a x.

Neste caso, a busca não teve sucesso.

Page 72: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

72

Operações Básicas: Operações Básicas: SearchSearch(ii) Elemento (ii) Elemento xx encontrado como sentinelaencontrado como sentinela

q

8head

4 10

sentinel

12

x 12A busca continua enquanto o

elemento atual < x

Page 73: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

73

Operações Básicas: Operações Básicas: SearchSearch(ii) Elemento (ii) Elemento xx encontrado como sentinelaencontrado como sentinela

q

8head

4 10

sentinel

12

x 12A busca continua enquanto o

elemento atual < x

Page 74: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

74

Operações Básicas: Operações Básicas: SearchSearch(ii) Elemento (ii) Elemento xx encontrado como sentinelaencontrado como sentinela

q

8head

4 10

sentinel

12

x 12A busca continua enquanto o

elemento atual < x

Page 75: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

75

Operações Básicas: Operações Básicas: SearchSearch(ii) Elemento (ii) Elemento xx encontrado como sentinelaencontrado como sentinela

sentinel

8head

4 10

q

x 12A busca continua enquanto o

elemento atual < x

Note que um elemento igual a x foi

encontrado, mas é o sentinela.

Neste caso, a busca não teve sucesso.

12

Page 76: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

76

Operações Básicas: Operações Básicas: SearchSearch(iii) Elemento (iii) Elemento xx encontrado como parte da listaencontrado como parte da lista

q

8head

4 10

sentinel

8

x 8A busca continua enquanto o

elemento atual < x

Page 77: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

77

Operações Básicas: Operações Básicas: SearchSearch(iii) Elemento (iii) Elemento xx encontrado como parte da listaencontrado como parte da lista

q

8head

4 10

sentinel

8

x 8A busca continua enquanto o

elemento atual < x

Note que um elemento igual a x foi encontrado

e não é o sentinela.Neste caso, a busca

teve sucesso!

Page 78: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

78

Operações Básicas: Operações Básicas: SearchSearch

int OrderedList::Search(int x){ int posicao=1;ListPointer q=head;

sentinel->Entry = x;while (q->Entry < x) { q = q->NextNode;

posicao++;}

if (q->Entry != x || q == sentinel)return 0;

elsereturn posicao;

}

Page 79: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

79

Busca com InserçãoBusca com Inserção

Em muitos problemas é interessante considerar a situação em que se um elemento não se encontra na lista então ele deve ser inserido; caso contrário, um contador deve ser atualizadoUm exemplo típico é a contagem do número de palavras em um textoPara tanto, nossa estrutura de dados será estendida para a seguinte definição

struct ListNode{ string Entry; // chave

int count; // contadorListNode *NextNode;

};

Page 80: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

80

Busca com InserçãoBusca com Inserçãovoid OrderedList::SearchInsert(int x){ ListPointer p, q;

// Buscar elemento ou local de inserçãosentinel->Entry = x;p = head;while(p->Entry < x)

p = p->NextNode;

if(p != sentinel && p->Entry == x)p->count++; // encontrou

else{ // não encontrou, inserir

q = new ListNode;if(q == NULL){ cout << “Memória insuficiente”;

abort();}

if(p == sentinel){ p->NextNode = q;

sentinel = q;}else{ *q = *p;

p->Entry = x;p->NextNode = q;

}p->count = 1;count++;

}}

Page 81: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

81

ExercíciosExercícios

Implemente as demais operações em listas

Clear()Size()

Page 82: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

82

Solução Solução ClearClear//SizeSize

Note que o código é diferente do destruidor, já que o sentinela deve permanecer

void OrderedList::Clear(){ ListPointer q;

while (head != sentinel){ q = head;

head = head->NextNode;delete q;

}count = 0;

}

int OrderedList::Size(){

return count;}

Page 83: Listas Lineares Ordenadas - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Listas-Ordenadas.pdf · Uma lista linear ordenada, ou simplesmente lista ordenada há uma ordem entre

83

Considerações FinaisConsiderações Finais

A maior parte das operações em listas encadeadas de tamanho n (ordenadas ou não) tem tempo O(1)

Busca, inserção ou remoção têm tempo O(n) com ou sem uso de sentinelas

Veremos nas próximas aulas estruturas de dados não lineares, as árvores, que possuem características que permitem melhorar os tempos de busca, inserção ou remoção