aula 05 estrutura de dados · aula 05 estrutura de dados lista ligada (implementação estática)...

77
AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Upload: others

Post on 02-Apr-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

AULA 05ESTRUTURA DE DADOS

Lista ligada (implementação estática)

Norton T. Roman & Luciano A. Digiampietri

Page 2: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista linear sequencialNa última aula aprendemos listas linearessequenciais.Realizamos a inserção ordenada pela chave:

- A busca era feita de maneira eficiente (buscabinária);- Porém a inserção e a exclusão eram custosas,pois potencialmente precisariam deslocar várioselementos.

Page 3: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista linear sequencialNa última aula aprendemos listas linearessequenciais.Realizamos a inserção ordenada pela chave:

- A busca era feita de maneira eficiente (buscabinária);

- Porém a inserção e a exclusão eram custosas,pois potencialmente precisariam deslocar várioselementos.

Page 4: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista linear sequencialNa última aula aprendemos listas linearessequenciais.Realizamos a inserção ordenada pela chave:

- A busca era feita de maneira eficiente (buscabinária);- Porém a inserção e a exclusão eram custosas,pois potencialmente precisariam deslocar várioselementos.

Page 5: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada

Para evitar o deslocamento de elementos durante ainserção e a exclusão utilizaremos uma lista ligada:

- É uma estrutura linear (cada elemento possui no máximoum predecessor e um sucessor);- A ordem lógica dos elementos (a ordem “vista” pelousuário) não é a mesma ordem física (em memória principal)dos elementos.

- Cada elemento precisa indicar quem é o seu sucessor.

Page 6: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada

Para evitar o deslocamento de elementos durante ainserção e a exclusão utilizaremos uma lista ligada:

- É uma estrutura linear (cada elemento possui no máximoum predecessor e um sucessor);

- A ordem lógica dos elementos (a ordem “vista” pelousuário) não é a mesma ordem física (em memória principal)dos elementos.

- Cada elemento precisa indicar quem é o seu sucessor.

Page 7: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada

Para evitar o deslocamento de elementos durante ainserção e a exclusão utilizaremos uma lista ligada:

- É uma estrutura linear (cada elemento possui no máximoum predecessor e um sucessor);- A ordem lógica dos elementos (a ordem “vista” pelousuário) não é a mesma ordem física (em memória principal)dos elementos.

- Cada elemento precisa indicar quem é o seu sucessor.

Page 8: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada

Para evitar o deslocamento de elementos durante ainserção e a exclusão utilizaremos uma lista ligada:

- É uma estrutura linear (cada elemento possui no máximoum predecessor e um sucessor);- A ordem lógica dos elementos (a ordem “vista” pelousuário) não é a mesma ordem física (em memória principal)dos elementos.

- Cada elemento precisa indicar quem é o seu sucessor.

Page 9: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada (implementaçãoestática)

Chamaremos de lista ligada implementaçãoestática, porque nossos registros serãoarmazenados em um arranjo criado inicialmente.Adicionalmente, cada elemento da nossa lista teráum campo para indicar a posição (no arranjo) deseu sucessor.

Page 10: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada (ideia geral)

Temos um arranjo de elementos

Cada elemento indica seu sucessor

Como excluímos o elemento 8?

Como inserimos o elemento 1?

Page 11: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada (ideia geral)

Temos um arranjo de elementos

Cada elemento indica seu sucessor

Como excluímos o elemento 8?

Como inserimos o elemento 1?

Page 12: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada (ideia geral)

Temos um arranjo de elementos

Cada elemento indica seu sucessor

Como excluímos o elemento 8?

Como inserimos o elemento 1?

Page 13: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada (ideia geral)

Temos um arranjo de elementos

Cada elemento indica seu sucessor

Como excluímos o elemento 8?

Como inserimos o elemento 1?

Page 14: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada (ideia geral)

Temos um arranjo de elementos

Cada elemento indica seu sucessor

Como excluímos o elemento 8?

Como inserimos o elemento 1?

Page 15: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada (ideia geral)

Temos um arranjo de elementos

Cada elemento indica seu sucessor

Como excluímos o elemento 8?

Como inserimos o elemento 1?

Page 16: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada (ideia geral)

Precisamos tomar alguns cuidados:

Precisamos saber onde está o primeiro elemento;Precisamos saber quais são os elementosdisponíveis.

Page 17: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada (ideia geral)

Precisamos tomar alguns cuidados:Precisamos saber onde está o primeiro elemento;

Precisamos saber quais são os elementosdisponíveis.

Page 18: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Lista ligada (ideia geral)

Precisamos tomar alguns cuidados:Precisamos saber onde está o primeiro elemento;Precisamos saber quais são os elementosdisponíveis.

Page 19: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Modelagem

#define MAX 50

#define INVALIDO -1

typedef int TIPOCHAVE;

typedef struct{

TIPOCHAVE chave;

// outros campos...

} REGISTRO;

typedef struct{

REGISTRO reg;

int prox;

} ELEMENTO;

typedef struct {

ELEMENTO A[MAX];

int inicio;

int dispo;

} LISTA;

Page 20: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Modelagem

#define MAX 50

#define INVALIDO -1

typedef int TIPOCHAVE;

typedef struct{

TIPOCHAVE chave;

// outros campos...

} REGISTRO;

typedef struct{

REGISTRO reg;

int prox;

} ELEMENTO;

typedef struct {

ELEMENTO A[MAX];

int inicio;

int dispo;

} LISTA;

Page 21: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Modelagem

#define MAX 50

#define INVALIDO -1

typedef int TIPOCHAVE;

typedef struct{

TIPOCHAVE chave;

// outros campos...

} REGISTRO;

typedef struct{

REGISTRO reg;

int prox;

} ELEMENTO;

typedef struct {

ELEMENTO A[MAX];

int inicio;

int dispo;

} LISTA;

Page 22: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Modelagem

#define MAX 50

#define INVALIDO -1

typedef int TIPOCHAVE;

typedef struct{

TIPOCHAVE chave;

// outros campos...

} REGISTRO;

typedef struct{

REGISTRO reg;

int prox;

} ELEMENTO;

typedef struct {

ELEMENTO A[MAX];

int inicio;

int dispo;

} LISTA;

Page 23: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Modelagem

#define MAX 50

#define INVALIDO -1

typedef int TIPOCHAVE;

typedef struct{

TIPOCHAVE chave;

// outros campos...

} REGISTRO;

typedef struct{

REGISTRO reg;

int prox;

} ELEMENTO;

typedef struct {

ELEMENTO A[MAX];

int inicio;

int dispo;

} LISTA;

Page 24: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Modelagem

Page 25: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Funções de gerenciamentoImplementaremos funções para:

Inicializar a estruturaRetornar a quantidade de elementos válidosExibir os elementos da estruturaBuscar por um elemento na estruturaInserir elementos na estruturaExcluir elementos da estruturaReinicializar a estrutura

Page 26: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inicialização

Para inicializarmos nossa lista ligada, precisamos:- Colocar todos os elementos na “lista” dedisponíveis;- Acertar a variável dispo (primeiro itemdisponível);- Acertar a variável inicio (para indicar que não hánenhum item válido);

Page 27: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inicialização

void inicializarLista(LISTA* l) {

int i;

for (i=0; i<MAX-1; i++)

l->A[i].prox = i + 1;

l->A[MAX-1].prox=INVALIDO;

l->inicio=INVALIDO;

l->dispo=0;

}

Page 28: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inicialização

void inicializarLista(LISTA* l) {

int i;

for (i=0; i<MAX-1; i++)

l->A[i].prox = i + 1;

l->A[MAX-1].prox=INVALIDO;

l->inicio=INVALIDO;

l->dispo=0;

}

Page 29: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inicialização

void inicializarLista(LISTA* l) {

int i;

for (i=0; i<MAX-1; i++)

l->A[i].prox = i + 1;

l->A[MAX-1].prox=INVALIDO;

l->inicio=INVALIDO;

l->dispo=0;

}

Page 30: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inicialização

void inicializarLista(LISTA* l) {

int i;

for (i=0; i<MAX-1; i++)

l->A[i].prox = i + 1;

l->A[MAX-1].prox=INVALIDO;

l->inicio=INVALIDO;

l->dispo=0;

}

Page 31: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inicialização

void inicializarLista(LISTA* l) {

int i;

for (i=0; i<MAX-1; i++)

l->A[i].prox = i + 1;

l->A[MAX-1].prox=INVALIDO;

l->inicio=INVALIDO;

l->dispo=0;

}

Page 32: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Retornar número de elementos

Já que optamos por não criar um campo com onúmero de elementos na lista, precisaremospercorrer todos os elementos válidos para contarquantos são.

Page 33: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Retornar número de elementos

int tamanho(LISTA* l) {

int i = l->inicio;

int tam = 0;

while (i != INVALIDO) {

tam++;

i = l->A[i].prox;

}

return tam;

}

Page 34: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Retornar número de elementos

int tamanho(LISTA* l) {

int i = l->inicio;

int tam = 0;

while (i != INVALIDO) {

tam++;

i = l->A[i].prox;

}

return tam;

}

Page 35: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Retornar número de elementos

int tamanho(LISTA* l) {

int i = l->inicio;

int tam = 0;

while (i != INVALIDO) {

tam++;

i = l->A[i].prox;

}

return tam;

}

Page 36: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Retornar número de elementos

int tamanho(LISTA* l) {

int i = l->inicio;

int tam = 0;

while (i != INVALIDO) {

tam++;

i = l->A[i].prox;

}

return tam;

}

Page 37: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exibição/Impressão

Para exibir os elementos da estrutura precisaremositerar pelos elementos válidos e, por exemplo,imprimir suas chaves.

Page 38: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exibição/Impressão

void exibirLista(LISTA* l) {

int i = l->inicio;

printf("Lista: \" ");

while (i != INVALIDO) {

printf("%i ", l->A[i].reg.chave);

i = l->A[i].prox;

}

printf("\"\n");

}

Page 39: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Buscar por elemento

A função de busca deverá:Receber uma chave do usuárioRetornar a posição em que este elemento seencontra no arranjo (caso seja encontrado)Retornar INVALIDO caso não haja um registrocom essa chave na lista

Page 40: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Busca sequencial (lista ordenada)

int buscaSequencialOrd(LISTA* l, TIPOCHAVE ch) {

int i = l->inicio;

while (i != INVALIDO && l->A[i].reg.chave < ch)

i = l->A[i].prox;

if (i != INVALIDO && l->A[i].reg.chave == ch)

return i;

else return INVALIDO;

}

Page 41: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Busca sequencial (lista ordenada)

int buscaSequencialOrd(LISTA* l, TIPOCHAVE ch) {

int i = l->inicio;

while (i != INVALIDO && l->A[i].reg.chave < ch)

i = l->A[i].prox;

if (i != INVALIDO && l->A[i].reg.chave == ch)

return i;

else return INVALIDO;

}

Page 42: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Busca sequencial (lista ordenada)

int buscaSequencialOrd(LISTA* l, TIPOCHAVE ch) {

int i = l->inicio;

while (i != INVALIDO && l->A[i].reg.chave < ch)

i = l->A[i].prox;

if (i != INVALIDO && l->A[i].reg.chave == ch)

return i;

else return INVALIDO;

}

Page 43: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Busca sequencial (lista ordenada)

int buscaSequencialOrd(LISTA* l, TIPOCHAVE ch) {

int i = l->inicio;

while (i != INVALIDO && l->A[i].reg.chave < ch)

i = l->A[i].prox;

if (i != INVALIDO && l->A[i].reg.chave == ch)

return i;

else return INVALIDO;

}

Page 44: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Busca sequencial (lista ordenada)

int buscaSequencialOrd(LISTA* l, TIPOCHAVE ch) {

int i = l->inicio;

while (i != INVALIDO && l->A[i].reg.chave < ch)

i = l->A[i].prox;

if (i != INVALIDO && l->A[i].reg.chave == ch)

return i;

else return INVALIDO;

}

Page 45: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção de um elementoO usuário passa como parâmetro um registro a serinserido na lista

Realizaremos a inserção ordenada pelo valor da chave doregistro passado e não permitiremos a inserção deelementos repetidos;

Na inserção precisamos identificar entre quais elementos onovo elemento será inserido;O novo elemento será inserido no lugar do primeiro queestiver na lista de disponíveis.

Page 46: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção de um elementoO usuário passa como parâmetro um registro a serinserido na lista

Realizaremos a inserção ordenada pelo valor da chave doregistro passado e não permitiremos a inserção deelementos repetidos;Na inserção precisamos identificar entre quais elementos onovo elemento será inserido;

O novo elemento será inserido no lugar do primeiro queestiver na lista de disponíveis.

Page 47: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção de um elementoO usuário passa como parâmetro um registro a serinserido na lista

Realizaremos a inserção ordenada pelo valor da chave doregistro passado e não permitiremos a inserção deelementos repetidos;Na inserção precisamos identificar entre quais elementos onovo elemento será inserido;O novo elemento será inserido no lugar do primeiro queestiver na lista de disponíveis.

Page 48: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenadaQueremos inserir o 8

Ele será inserido na primeiraposição disponível (posiçãofísica)

Temos que descobrir entrequais elementos será inserido(ordem lógica)

Temos que acertar os“ponteiros”

Page 49: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenadaQueremos inserir o 8

Ele será inserido na primeiraposição disponível (posiçãofísica)

Temos que descobrir entrequais elementos será inserido(ordem lógica)

Temos que acertar os“ponteiros”

Page 50: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenadaQueremos inserir o 8

Ele será inserido na primeiraposição disponível (posiçãofísica)

Temos que descobrir entrequais elementos será inserido(ordem lógica)

Temos que acertar os“ponteiros”

Page 51: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenadaQueremos inserir o 8

Ele será inserido na primeiraposição disponível (posiçãofísica)

Temos que descobrir entrequais elementos será inserido(ordem lógica)

Temos que acertar os“ponteiros”

Page 52: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenada

Iniciaremos por uma função auxiliar que retira oprimeiro elemento da lista de disponíveis e retornasua posição no arranjo.

Page 53: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenada - função auxiliar

int obterNo(LISTA* l) {

int resultado = l->dispo;

if (l->dispo != INVALIDO)

l->dispo = l->A[l->dispo].prox;

return resultado;

}

Page 54: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenada - parte 1bool inserirElemListaOrd(LISTA* l, REGISTRO reg) {

if (l->dispo == INVALIDO) return false;

int ant = INVALIDO;

int i = l->inicio;

TIPOCHAVE ch = reg.chave;

while ((i != INVALIDO) && (l->A[i].reg.chave<ch)){

ant = i;

i = l->A[i].prox;

}

if (i!=INVALIDO && l->A[i].reg.chave==ch) return false;

Page 55: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenada - parte 1bool inserirElemListaOrd(LISTA* l, REGISTRO reg) {

if (l->dispo == INVALIDO) return false;

int ant = INVALIDO;

int i = l->inicio;

TIPOCHAVE ch = reg.chave;

while ((i != INVALIDO) && (l->A[i].reg.chave<ch)){

ant = i;

i = l->A[i].prox;

}

if (i!=INVALIDO && l->A[i].reg.chave==ch) return false;

Page 56: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenada - parte 1bool inserirElemListaOrd(LISTA* l, REGISTRO reg) {

if (l->dispo == INVALIDO) return false;

int ant = INVALIDO;

int i = l->inicio;

TIPOCHAVE ch = reg.chave;

while ((i != INVALIDO) && (l->A[i].reg.chave<ch)){

ant = i;

i = l->A[i].prox;

}

if (i!=INVALIDO && l->A[i].reg.chave==ch) return false;

Page 57: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenada - parte 1bool inserirElemListaOrd(LISTA* l, REGISTRO reg) {

if (l->dispo == INVALIDO) return false;

int ant = INVALIDO;

int i = l->inicio;

TIPOCHAVE ch = reg.chave;

while ((i != INVALIDO) && (l->A[i].reg.chave<ch)){

ant = i;

i = l->A[i].prox;

}

if (i!=INVALIDO && l->A[i].reg.chave==ch) return false;

Page 58: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenada - parte 1bool inserirElemListaOrd(LISTA* l, REGISTRO reg) {

if (l->dispo == INVALIDO) return false;

int ant = INVALIDO;

int i = l->inicio;

TIPOCHAVE ch = reg.chave;

while ((i != INVALIDO) && (l->A[i].reg.chave<ch)){

ant = i;

i = l->A[i].prox;

}

if (i!=INVALIDO && l->A[i].reg.chave==ch) return false;

Page 59: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenada - parte 2i = obterNo(l);

l->A[i].reg = reg;

if (ant == INVALIDO) {

l->A[i].prox = l->inicio;

l->inicio = i;

} else {

l->A[i].prox = l->A[ant].prox;

l->A[ant].prox = i;

}

return true;

}

Page 60: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenada - parte 2i = obterNo(l);

l->A[i].reg = reg;

if (ant == INVALIDO) {

l->A[i].prox = l->inicio;

l->inicio = i;

}

else {

l->A[i].prox = l->A[ant].prox;

l->A[ant].prox = i;

}

return true;

}

Page 61: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenada - parte 2i = obterNo(l);

l->A[i].reg = reg;

if (ant == INVALIDO) {

l->A[i].prox = l->inicio;

l->inicio = i;

} else {

l->A[i].prox = l->A[ant].prox;

l->A[ant].prox = i;

}

return true;

}

Page 62: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Inserção ordenada - parte 2i = obterNo(l);

l->A[i].reg = reg;

if (ant == INVALIDO) {

l->A[i].prox = l->inicio;

l->inicio = i;

} else {

l->A[i].prox = l->A[ant].prox;

l->A[ant].prox = i;

}

return true;

}

Page 63: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elementoO usuário passa a chave do elemento que ele querexcluir

Se houver um elemento com esta chave na lista,“exclui este elemento” da lista de elementosválidos e o insere na lista de disponíveis.Adicionalmente, acerta os ponteiros envolvidos eretorna true.Caso contrário, retorna false

Page 64: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elementobool excluirElemLista(LISTA* l, TIPOCHAVE ch) {

int ant = INVALIDO;int i = l->inicio;while ((i != INVALIDO) && (l->A[i].reg.chave<ch)) {

ant = i;i = l->A[i].prox;

}if (i==INVALIDO || l->A[i].reg.chave!=ch) return false;if (ant == INVALIDO) l->inicio = l->A[i].prox;else l->A[ant].prox = l->A[i].prox;devolverNo(l,i);return true;

}

Page 65: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elementobool excluirElemLista(LISTA* l, TIPOCHAVE ch) {

int ant = INVALIDO;int i = l->inicio;while ((i != INVALIDO) && (l->A[i].reg.chave<ch)) {

ant = i;i = l->A[i].prox;

}

if (i==INVALIDO || l->A[i].reg.chave!=ch) return false;if (ant == INVALIDO) l->inicio = l->A[i].prox;else l->A[ant].prox = l->A[i].prox;devolverNo(l,i);return true;

}

Page 66: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elementobool excluirElemLista(LISTA* l, TIPOCHAVE ch) {

int ant = INVALIDO;int i = l->inicio;while ((i != INVALIDO) && (l->A[i].reg.chave<ch)) {

ant = i;i = l->A[i].prox;

}if (i==INVALIDO || l->A[i].reg.chave!=ch) return false;

if (ant == INVALIDO) l->inicio = l->A[i].prox;else l->A[ant].prox = l->A[i].prox;devolverNo(l,i);return true;

}

Page 67: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elementobool excluirElemLista(LISTA* l, TIPOCHAVE ch) {

int ant = INVALIDO;int i = l->inicio;while ((i != INVALIDO) && (l->A[i].reg.chave<ch)) {

ant = i;i = l->A[i].prox;

}if (i==INVALIDO || l->A[i].reg.chave!=ch) return false;if (ant == INVALIDO) l->inicio = l->A[i].prox;

else l->A[ant].prox = l->A[i].prox;devolverNo(l,i);return true;

}

Page 68: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elementobool excluirElemLista(LISTA* l, TIPOCHAVE ch) {

int ant = INVALIDO;int i = l->inicio;while ((i != INVALIDO) && (l->A[i].reg.chave<ch)) {

ant = i;i = l->A[i].prox;

}if (i==INVALIDO || l->A[i].reg.chave!=ch) return false;if (ant == INVALIDO) l->inicio = l->A[i].prox;else l->A[ant].prox = l->A[i].prox;

devolverNo(l,i);return true;

}

Page 69: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elementobool excluirElemLista(LISTA* l, TIPOCHAVE ch) {

int ant = INVALIDO;int i = l->inicio;while ((i != INVALIDO) && (l->A[i].reg.chave<ch)) {

ant = i;i = l->A[i].prox;

}if (i==INVALIDO || l->A[i].reg.chave!=ch) return false;if (ant == INVALIDO) l->inicio = l->A[i].prox;else l->A[ant].prox = l->A[i].prox;devolverNo(l,i);

return true;}

Page 70: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elementobool excluirElemLista(LISTA* l, TIPOCHAVE ch) {

int ant = INVALIDO;int i = l->inicio;while ((i != INVALIDO) && (l->A[i].reg.chave<ch)) {

ant = i;i = l->A[i].prox;

}if (i==INVALIDO || l->A[i].reg.chave!=ch) return false;if (ant == INVALIDO) l->inicio = l->A[i].prox;else l->A[ant].prox = l->A[i].prox;devolverNo(l,i);return true;

}

Page 71: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elemento - funçãoauxiliar

Desejamos devolver um elemento para a lista dedisponíveis

Em que posição da lista iremos colocar esseelemento?Na que é mais fácil de inserir: no início

Page 72: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elemento - funçãoauxiliar

Desejamos devolver um elemento para a lista dedisponíveis

Em que posição da lista iremos colocar esseelemento?

Na que é mais fácil de inserir: no início

Page 73: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elemento - funçãoauxiliar

Desejamos devolver um elemento para a lista dedisponíveis

Em que posição da lista iremos colocar esseelemento?Na que é mais fácil de inserir: no início

Page 74: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elemento - funçãoauxiliar

void devolverNo(LISTA* l, int j) {

l->A[j].prox = l->dispo;

l->dispo = j;

}

Page 75: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Reinicialização da lista

Para reinicializar a estrutura basta chamarmos afunção de inicialização.

Page 76: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

Reinicialização da lista

void reinicializarLista(LISTA* l) {

inicializarLista(l);

}

Page 77: AULA 05 ESTRUTURA DE DADOS · AULA 05 ESTRUTURA DE DADOS Lista ligada (implementação estática) Norton T. Roman & Luciano A. Digiampietri

AULA 05ESTRUTURA DE DADOS

Lista ligada (implementação estática)

Norton T. Roman & Luciano A. Digiampietri