• Nenhum resultado encontrado

AULA 8

N/A
N/A
Protected

Academic year: 2022

Share "AULA 8"

Copied!
32
0
0

Texto

(1)

Melhores momentos

AULA 8

(2)

Listas encadeadas

Uma lista encadeada (= linked list = lista ligada) é uma sequência de células; cada célula contém um objeto de algum tipo e o endereço da célula seguinte.

Ilustração de uma lista encadeada ( sem cabeça)

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

conteudo prox conteudo prox conteudo prox conteudo prox conteudo prox

ini

(3)

Estrutura de uma lista encadeada em C

struct celula { int conteudo;

struct celula *prox;

typedef struct }; celula Celula;

Celula *ini;

/* inicialmente a lista esta vazia */

ini = NULL;

00000000 00000000 11111111 11111111

ini

(4)

Imprime conteúdo de uma lista

Esta função imprime o conteudo de cada célula de uma lista encadeada ini.

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

ini

void imprima (Celula *ini) { Celula *p;

for (p=ini; p != NULL; p=p->prox) printf("%d \ n", p->conteudo);

}

(5)

Busca em uma lista encadeada

Esta função recebe um inteiro x e uma lista ini. A função devolve o endereço de uma célula que contém x. Se tal célula não existe, a função devolve NULL.

Celula* busca (int x, Celula *ini) { Celula *p;

p = ini;

while (p != NULL && p->conteudo != x) p = p->prox;

return p;

}

(6)

AULA 9

(7)

Mais listas encadeadas em C

PF 4, S 3.3

http://www.ime.usp.br/pf/algoritmos/aulas/lista.html

(8)

Inserção no início de uma lista encadeada

Cria uma célula para guardar um elemento x e insere esta célula no início da lista ini.

void insere (int x; Celula *ini) { Celula nova; ERRADO!

nova.conteudo = x;

nova.prox = ini;

ini = &nova;

}

A estrutura nova é uma variável automática.

Ela será devolvida ao sistema no nal da execução da

função.

(9)

Inserção no início de uma lista encadeada

Cria uma célula para guardar um elemento x e insere esta célula no início da lista ini.

void insere (int x; Celula *ini) { Celula *nova;

nova = mallocc(sizeof(Celula));

nova->conteudo = x;

nova->prox = ini;

ini = nova; ERRADO!

} Mesmo erro! O parâmetro ini é uma variável local

(=automática) que começa inicializada. Ela será

devolvida ao sistema. . .

(10)

Inserção no início de uma lista encadeada

Cria uma célula para guardar um elemento x e insere esta célula no início da lista ini.

Celula *insere (int x; Celula *ini) { Celula *nova;

nova = mallocc(sizeof(Celula));

nova->conteudo = x;

nova->prox = ini;

return nova;

} Certo! Exemplos de chamadas da função ini = insere(11,ini);

ini = insere(valor+3,ini);

(11)

Inserção no início de uma lista encadeada

Cria uma célula para guardar um elemento x e insere esta célula no início da lista ini.

void insere (int x; Celula **ini) { Celula *nova;

nova = mallocc(sizeof(Celula));

nova->conteudo = x;

nova->prox = *ini;

*ini = nova;

} Certo! Exemplos de chamadas da função insere(11,&ini);

insere(valor+3,&ini);

(12)

Inserção no início de uma lista encadeada

Cria uma célula para guardar um elemento x e insere esta célula no início da lista ini.

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

ini

nova

?

(13)

Inserção no início de uma lista encadeada

Cria uma célula para guardar um elemento x e insere esta célula no início da lista ini.

00000000 00000000 11111111 11111111 0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111 0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111 00000000

00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

ini

nova

? ?

(14)

Inserção no início de uma lista encadeada

Cria uma célula para guardar um elemento x e insere esta célula no início da lista ini.

00000000 00000000 11111111 11111111 0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111 00000000

00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000

1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

ini

x

nova

?

(15)

Inserção no início de uma lista encadeada

Cria uma célula para guardar um elemento x e insere esta célula no início da lista ini.

00000000 00000000 11111111 11111111 0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111 00000000

00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000

1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

ini

x

nova

(16)

Inserção no início de uma lista encadeada

Cria uma célula para guardar um elemento x e insere esta célula no início da lista ini.

00000000 00000000 11111111 11111111 0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000

1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

ini

x

nova

(17)

Remoção em uma lista encadeada

Recebe o endereço p de uma célula de uma lista encadeada e remove da lista a celula p->prox.

A função supõe que p != NULL e p->prox != NULL.

void remove (Celula *p) { Celula *morta;

morta = p->prox;

p->prox = morta->prox;

free(morta);

}

(18)

Remoção em uma lista encadeada

Recebe o endereço p de uma célula de uma lista encadeada e remove da lista a celula p->prox.

A função supõe que p != NULL e p->prox != NULL.

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 00000000

00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

p morta

ini

?

(19)

Remoção em uma lista encadeada

Recebe o endereço p de uma célula de uma lista encadeada e remove da lista a celula p->prox.

A função supõe que p != NULL e p->prox != NULL.

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 00000000

00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

p morta

ini

(20)

Remoção em uma lista encadeada

Recebe o endereço p de uma célula de uma lista encadeada e remove da lista a celula p->prox.

A função supõe que p != NULL e p->prox != NULL.

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 00000000

00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

p morta

ini

(21)

Remoção em uma lista encadeada

Recebe o endereço p de uma célula de uma lista encadeada e remove da lista a celula p->prox.

A função supõe que p != NULL e p->prox != NULL.

00000000 00000000 11111111 11111111 00000000

00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

morta

?

ini

p

(22)

Listas encadeadas com cabeça

O conteúdo da primeira célula é irrelevante: ela serve apenas para marcar o início da lista. A primeira célula é a cabeca (= head cell = dummy cell) da lista.

A primeira célula está sempre no mesmo lugar na memória, mesmo que a lista que vazia.

Se ini->prox == NULL se e somente se a lista está vazia.

Ilustração de uma lista encadeada com cabeca

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000

1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111

conteudo prox conteudo prox conteudo prox conteudo prox

ini cabeca prox

(23)

Estrutura de uma lista com cabeça

struct celula { int conteudo;

struct celula *prox;

typedef struct }; celula Celula;

Celula *ini, cabeca;

/* inicialmente a lista esta vazia */

cabeca.prox = NULL;

ini = &cabeca;

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000

1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111

ini cabeca prox

(24)

Estrutura de uma lista com cabeça

struct celula { int conteudo;

struct celula *prox;

typedef struct }; celula Celula;

Celula *ini;

/* inicialmente a lista esta vazia */

ini = malloc(sizeof(Celula));

ini->prox = NULL;

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000

1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111

ini cabeca prox

(25)

Imprime conteúdo de uma lista com cabeça

Esta função imprime o conteudo de cada célula de uma lista encadeada com cabeca ini.

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000

1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111

conteudo prox conteudo prox conteudo prox conteudo prox ini cabeca prox

void imprima (Celula *ini) { Celula *p;

for (p=ini->prox; p != NULL; p=p->prox) printf("%d \ n", p->conteudo);

}

(26)

Busca em uma lista com cabeça

Esta função recebe um inteiro x e uma lista ini. A função devolve o endereço de uma célula que contém x. Se tal célula não existe, a função devolve NULL.

Celula* busca (int x, Celula *ini) { Celula *p;

p = ini->prox;

while (p != NULL && p->conteudo != x) p = p->prox;

return p;

}

(27)

Inserção no início de uma lista com cabeça

Cria uma célula para guardar um elemento x e insere esta célula no início da lista com cabeça ini.

void insere (int x; Celula *ini) { Celula *nova;

nova = mallocc(sizeof(Celula));

nova->conteudo = x;

nova->prox = ini->prox;

ini->prox= nova;

}

(28)

Inserção no início de uma lista com cabeça

Cria uma célula para guardar um elemento x e insere esta célula no início da lista com cabeça ini.

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000

1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111

ini

nova

cabeca

?

(29)

Inserção no início de uma lista com cabeça

Cria uma célula para guardar um elemento x e insere esta célula no início da lista com cabeça ini.

00000000 00000000 11111111 11111111 0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111 00000000

00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000

1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111

ini

nova

cabeca

? ?

(30)

Inserção no início de uma lista com cabeça

Cria uma célula para guardar um elemento x e insere esta célula no início da lista com cabeça ini.

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000

1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111 0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

ini

nova

cabeca

?

x

(31)

Inserção no início de uma lista com cabeça

Cria uma célula para guardar um elemento x e insere esta célula no início da lista com cabeça ini.

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000

1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111 0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

ini

nova

cabeca

x

(32)

Inserção no início de uma lista com cabeça

Cria uma célula para guardar um elemento x e insere esta célula no início da lista com cabeça ini.

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111 0000000

0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111

00000000 00000000 11111111 11111111

0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000

1111111 1111111 1111111 1111111 1111111 1111111 1111111 1111111

00000000 00000000 11111111 11111111 0000000 0000000 0000000 0000000 1111111 1111111 1111111 1111111

ini

nova

cabeca

x

Referências

Documentos relacionados

A obstrução da junção ureteropélvica (JUP) é definida como um processo de restrição ao fluxo urinário da pelve renal para o ureter e, conforme o grau de

Frequentemente vêm-se bacilos dentro e ao redor dos núcleos do tecido conjuntivo (Estampa X, Fig. 8), portanto, embora não seja visível o corpo da célula, temos a concluir que

Como 0 Projeto Integrado visa destacar, tanto no trabalho cHnico-terapeutico, quanto no de pesquisa, a questao do sentido/significacao, e como nos sujeitos cerebro- lesados 0 que

Oferece opções avançadas para classificação de dados, tais como: Cor da Fonte ou cor da célula, etc. Insere ou

Elas são proc essadas no córtex pré-frontal e incluem: controle executivo e inibitório; capacidade de abstração; atenção; concentração; plan ejamento; flexibilidade;

Crie uma classe Aluno, contendo um atributo ArrayList para floats que corresponde ao histórico de notas de um aluno.A classe terá como métodos:.. • Construtor, instanciando

78 Figura 3.27 Padrão de difração de pós obtido para o complexo ácido nalidíxico:Zn através (a) de síntese por solução, em comparação com os difractogramas

· Indicações sobre cuidados médicos urgentes e tratamentos especiais necessários Não existe mais nenhuma informação relevante disponível.. 5 Medidas de combate