70
AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri

AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

AULA 07ESTRUTURA DE DADOS

Lista ligada circular com nó cabeça

Norton T. Roman & Luciano A. Digiampietri

Page 2: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Lista ligadaNa última aula aprendemos como modelar egerenciar listas ligadas utilizando o que chamamosde implementação dinâmica.

- Vantagens: não precisamos gastar memória que nãoestamos usando e não precisamos gerenciar uma lista deelementos disponíveis.- Hoje adicionaremos duas características a esta estrutura:ela será circular (o último elemento apontará para oprimeiro) e possuirá um nó cabeça (um elemento inicial quesempre encabeçará a lista).

Page 3: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Lista ligadaNa última aula aprendemos como modelar egerenciar listas ligadas utilizando o que chamamosde implementação dinâmica.

- Vantagens: não precisamos gastar memória que nãoestamos usando e não precisamos gerenciar uma lista deelementos disponíveis.

- Hoje adicionaremos duas características a esta estrutura:ela será circular (o último elemento apontará para oprimeiro) e possuirá um nó cabeça (um elemento inicial quesempre encabeçará a lista).

Page 4: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Lista ligadaNa última aula aprendemos como modelar egerenciar listas ligadas utilizando o que chamamosde implementação dinâmica.

- Vantagens: não precisamos gastar memória que nãoestamos usando e não precisamos gerenciar uma lista deelementos disponíveis.- Hoje adicionaremos duas características a esta estrutura:ela será circular (o último elemento apontará para oprimeiro) e possuirá um nó cabeça (um elemento inicial quesempre encabeçará a lista).

Page 5: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Lista ligada circular com nó cabeça

Temos um ponteiro para o nó cabeça

Cada elemento indica seu sucessor e o último aponta para ocabeça

Como excluímos o elemento 8?

Como inserimos o elemento 1?

Page 6: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Lista ligada circular com nó cabeça

Temos um ponteiro para o nó cabeça

Cada elemento indica seu sucessor e o último aponta para ocabeça

Como excluímos o elemento 8?

Como inserimos o elemento 1?

Page 7: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Lista ligada circular com nó cabeça

Temos um ponteiro para o nó cabeça

Cada elemento indica seu sucessor e o último aponta para ocabeça

Como excluímos o elemento 8?

Como inserimos o elemento 1?

Page 8: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Lista ligada circular com nó cabeça

Temos um ponteiro para o nó cabeça

Cada elemento indica seu sucessor e o último aponta para ocabeça

Como excluímos o elemento 8?

Como inserimos o elemento 1?

Page 9: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Lista ligada circular com nó cabeça

Temos um ponteiro para o nó cabeça

Cada elemento indica seu sucessor e o último aponta para ocabeça

Como excluímos o elemento 8?

Como inserimos o elemento 1?

Page 10: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Modelagem#include <stdio.h>

#include <malloc.h>

typedef int bool;

typedef int TIPOCHAVE;

typedef struct {

TIPOCHAVE chave;

// outros campos...

} REGISTRO;

typedef struct tempRegistro {

REGISTRO reg;

struct tempRegistro* prox;

} ELEMENTO;

typedef ELEMENTO* PONT;

typedef struct {

PONT cabeca;

} LISTA;

Page 11: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Modelagem#include <stdio.h>

#include <malloc.h>

typedef int bool;

typedef int TIPOCHAVE;

typedef struct {

TIPOCHAVE chave;

// outros campos...

} REGISTRO;

typedef struct tempRegistro {

REGISTRO reg;

struct tempRegistro* prox;

} ELEMENTO;

typedef ELEMENTO* PONT;

typedef struct {

PONT cabeca;

} LISTA;

Page 12: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

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 13: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inicialização

Para inicializarmos nossa lista ligada circular e comnó cabeça, precisamos:

- Criar o nó cabeça;- A variável cabeca precisa apontar para ele;- E o nó cabeça apontará para ele mesmo comopróximo.

Page 14: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inicialização

Para inicializarmos nossa lista ligada circular e comnó cabeça, precisamos:

- Criar o nó cabeça;

- A variável cabeca precisa apontar para ele;- E o nó cabeça apontará para ele mesmo comopróximo.

Page 15: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inicialização

Para inicializarmos nossa lista ligada circular e comnó cabeça, precisamos:

- Criar o nó cabeça;- A variável cabeca precisa apontar para ele;

- E o nó cabeça apontará para ele mesmo comopróximo.

Page 16: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inicialização

Para inicializarmos nossa lista ligada circular e comnó cabeça, precisamos:

- Criar o nó cabeça;- A variável cabeca precisa apontar para ele;- E o nó cabeça apontará para ele mesmo comopróximo.

Page 17: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inicialização

void inicializarLista(LISTA* l) {

l->cabeca = (PONT) malloc(sizeof(ELEMENTO));

l->cabeca->prox = l->cabeca;

}

Page 18: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inicialização

void inicializarLista(LISTA* l) {

l->cabeca = (PONT) malloc(sizeof(ELEMENTO));

l->cabeca->prox = l->cabeca;

}

Page 19: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inicialização

void inicializarLista(LISTA* l) {

l->cabeca = (PONT) malloc(sizeof(ELEMENTO));

l->cabeca->prox = l->cabeca;

}

Page 20: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inicialização

void inicializarLista(LISTA* l) {

l->cabeca = (PONT) malloc(sizeof(ELEMENTO));

l->cabeca->prox = l->cabeca;

}

Page 21: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

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 para contar quantossão.

Page 22: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Retornar número de elementosint tamanho(LISTA* l) {

PONT end = l->cabeca->prox;

int tam = 0;

while (end != l->cabeca) {

tam++;

end = end->prox;

}

return tam;

}

Page 23: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Retornar número de elementosint tamanho(LISTA* l) {

PONT end = l->cabeca->prox;

int tam = 0;

while (end != l->cabeca) {

tam++;

end = end->prox;

}

return tam;

}

Page 24: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Retornar número de elementosint tamanho(LISTA* l) {

PONT end = l->cabeca->prox;

int tam = 0;

while (end != l->cabeca) {

tam++;

end = end->prox;

}

return tam;

}

Page 25: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Exibição/Impressão

Para exibir os elementos da estrutura precisaremositerar pelos elementos válidos e, por exemplo,imprimir suas chaves.Precisamos lembrar que o nó cabeça não é um doselementos válidos da nossa lista.

Page 26: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Exibição/Impressão

void exibirLista(LISTA* l) {

PONT end = l->cabeca->prox;

printf("Lista: \" ");

while (end != l->cabeca) {

printf("%i ", end->reg.chave);

end = end->prox;

}

printf("\"\n");

}

Page 27: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Exibição/Impressão

void exibirLista(LISTA* l) {

PONT end = l->cabeca->prox;

printf("Lista: \" ");

while (end != l->cabeca) {

printf("%i ", end->reg.chave);

end = end->prox;

}

printf("\"\n");

}

Page 28: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Exibição/Impressão

void exibirLista(LISTA* l) {

PONT end = l->cabeca->prox;

printf("Lista: \" ");

while (end != l->cabeca) {

printf("%i ", end->reg.chave);

end = end->prox;

}

printf("\"\n");

}

Page 29: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Buscar por elemento

A função de busca deverá:Receber uma chave do usuárioRetornar o endereço em que este elemento seencontra (caso seja encontrado)Retornar NULL caso não haja um registro comessa chave na lista

Podemos usar o nó cabeça como sentinela

Page 30: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Buscar por elemento

A função de busca deverá:Receber uma chave do usuárioRetornar o endereço em que este elemento seencontra (caso seja encontrado)Retornar NULL caso não haja um registro comessa chave na listaPodemos usar o nó cabeça como sentinela

Page 31: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca sequencial

PONT buscaSentinela(LISTA* l, TIPOCHAVE ch) {

PONT pos = l->cabeca->prox;

l->cabeca->reg.chave = ch;

while (pos->reg.chave != ch) pos = pos->prox;

if (pos != l->cabeca) return pos;

return NULL;

}

Page 32: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca sequencial

PONT buscaSentinela(LISTA* l, TIPOCHAVE ch) {

PONT pos = l->cabeca->prox;

l->cabeca->reg.chave = ch;

while (pos->reg.chave != ch) pos = pos->prox;

if (pos != l->cabeca) return pos;

return NULL;

}

Page 33: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca sequencial

PONT buscaSentinela(LISTA* l, TIPOCHAVE ch) {

PONT pos = l->cabeca->prox;

l->cabeca->reg.chave = ch;

while (pos->reg.chave != ch) pos = pos->prox;

if (pos != l->cabeca) return pos;

return NULL;

}

Page 34: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca sequencial

PONT buscaSentinela(LISTA* l, TIPOCHAVE ch) {

PONT pos = l->cabeca->prox;

l->cabeca->reg.chave = ch;

while (pos->reg.chave != ch) pos = pos->prox;

if (pos != l->cabeca) return pos;

return NULL;

}

Page 35: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca sequencial

PONT buscaSentinela(LISTA* l, TIPOCHAVE ch) {

PONT pos = l->cabeca->prox;

l->cabeca->reg.chave = ch;

while (pos->reg.chave != ch) pos = pos->prox;

if (pos != l->cabeca) return pos;

return NULL;

}

Page 36: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca sequencial - lista ordenada

// lista não precisa estar ordenada pelos valores das chavesPONT buscaSentinela(LISTA* l, TIPOCHAVE ch) {

PONT pos = l->cabeca->prox;l->cabeca->reg.chave = ch;while (pos->reg.chave ) pos = pos->prox;if () return pos;return NULL;

}

// lista ordenada pelos valores das chaves dos registrosPONT buscaSentinelaOrd(LISTA* l, TIPOCHAVE ch) {

PONT pos = l->cabeca->prox;l->cabeca->reg.chave = ch;while (pos->reg.chave ch) pos = pos->prox;if () return pos;return NULL;

}

Page 37: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca sequencial - lista ordenada// lista não precisa estar ordenada pelos valores das chavesPONT buscaSentinela(LISTA* l, TIPOCHAVE ch) {

PONT pos = l->cabeca->prox;l->cabeca->reg.chave = ch;while (pos->reg.chave != ch) pos = pos->prox;if (pos != l->cabeca) return pos;return NULL;

}

// lista ordenada pelos valores das chaves dos registrosPONT buscaSentinelaOrd(LISTA* l, TIPOCHAVE ch) {

PONT pos = l->cabeca->prox;l->cabeca->reg.chave = ch;while (pos->reg.chave < ch) pos = pos->prox;if (pos != l->cabeca && pos->reg.chave==ch) return pos;return NULL;

}

Page 38: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca sequencial - lista ordenada// lista não precisa estar ordenada pelos valores das chavesPONT buscaSentinela(LISTA* l, TIPOCHAVE ch) {

PONT pos = l->cabeca->prox;l->cabeca->reg.chave = ch;while (pos->reg.chave != ch) pos = pos->prox;if (pos != l->cabeca) return pos;return NULL;

}

// lista ordenada pelos valores das chaves dos registrosPONT buscaSentinelaOrd(LISTA* l, TIPOCHAVE ch) {

PONT pos = l->cabeca->prox;l->cabeca->reg.chave = ch;while (pos->reg.chave < ch) pos = pos->prox;if (pos != l->cabeca && pos->reg.chave==ch) return pos;return NULL;

}

Page 39: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca sequencial - lista ordenada// lista não precisa estar ordenada pelos valores das chavesPONT buscaSentinela(LISTA* l, TIPOCHAVE ch) {

PONT pos = l->cabeca->prox;l->cabeca->reg.chave = ch;while (pos->reg.chave != ch) pos = pos->prox;if (pos != l->cabeca) return pos;return NULL;

}

// lista ordenada pelos valores das chaves dos registrosPONT buscaSentinelaOrd(LISTA* l, TIPOCHAVE ch) {

PONT pos = l->cabeca->prox;l->cabeca->reg.chave = ch;while (pos->reg.chave < ch) pos = pos->prox;if (pos != l->cabeca && pos->reg.chave==ch) return pos;return NULL;

}

Page 40: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

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;Alocaremos memória para o novo elemento.Precisamos saber quem será o predecessor do elemento.

Page 41: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

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;

Alocaremos memória para o novo elemento.Precisamos saber quem será o predecessor do elemento.

Page 42: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

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;Alocaremos memória para o novo elemento.

Precisamos saber quem será o predecessor do elemento.

Page 43: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

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;Alocaremos memória para o novo elemento.Precisamos saber quem será o predecessor do elemento.

Page 44: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca - auxiliar

PONT buscaSeqExc(LISTA* l, TIPOCHAVE ch, PONT* ant) {*ant = l->cabeca;PONT atual = l->cabeca->prox;l->cabeca->reg.chave = ch;while (atual->reg.chave<ch) {

*ant = atual;atual = atual->prox;

}if (atual != l->cabeca && atual->reg.chave == ch) return atual;return NULL;

}

Page 45: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca - auxiliar

PONT buscaSeqExc(LISTA* l, TIPOCHAVE ch, PONT* ant) {*ant = l->cabeca;PONT atual = l->cabeca->prox;l->cabeca->reg.chave = ch;while (atual->reg.chave<ch) {

*ant = atual;atual = atual->prox;

}if (atual != l->cabeca && atual->reg.chave == ch) return atual;return NULL;

}

Page 46: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca - auxiliar

PONT buscaSeqExc(LISTA* l, TIPOCHAVE ch, PONT* ant) {*ant = l->cabeca;PONT atual = l->cabeca->prox;l->cabeca->reg.chave = ch;while (atual->reg.chave<ch) {

*ant = atual;atual = atual->prox;

}if (atual != l->cabeca && atual->reg.chave == ch) return atual;return NULL;

}

Page 47: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca - auxiliar

PONT buscaSeqExc(LISTA* l, TIPOCHAVE ch, PONT* ant) {*ant = l->cabeca;PONT atual = l->cabeca->prox;l->cabeca->reg.chave = ch;while (atual->reg.chave<ch) {

*ant = atual;atual = atual->prox;

}if (atual != l->cabeca && atual->reg.chave == ch) return atual;return NULL;

}

Page 48: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca - auxiliar

PONT buscaSeqExc(LISTA* l, TIPOCHAVE ch, PONT* ant) {*ant = l->cabeca;PONT atual = l->cabeca->prox;l->cabeca->reg.chave = ch;while (atual->reg.chave<ch) {

*ant = atual;atual = atual->prox;

}if (atual != l->cabeca && atual->reg.chave == ch) return atual;return NULL;

}

Page 49: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Busca - auxiliar

PONT buscaSeqExc(LISTA* l, TIPOCHAVE ch, PONT* ant) {*ant = l->cabeca;PONT atual = l->cabeca->prox;l->cabeca->reg.chave = ch;while (atual->reg.chave<ch) {

*ant = atual;atual = atual->prox;

}if (atual != l->cabeca && atual->reg.chave == ch) return atual;return NULL;

}

Page 50: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inserção ordenada - sem duplicaçãobool inserirElemListaOrd(LISTA* l, REGISTRO reg) {

PONT ant, i;

i = buscaSeqExc(l,reg.chave,&ant);

if (i != NULL) return false;

i = (PONT) malloc(sizeof(ELEMENTO));

i->reg = reg;

i->prox = ant->prox;

ant->prox = i;

return true;

}

Page 51: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inserção ordenada - sem duplicaçãobool inserirElemListaOrd(LISTA* l, REGISTRO reg) {

PONT ant, i;

i = buscaSeqExc(l,reg.chave,&ant);

if (i != NULL) return false;

i = (PONT) malloc(sizeof(ELEMENTO));

i->reg = reg;

i->prox = ant->prox;

ant->prox = i;

return true;

}

Page 52: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inserção ordenada - sem duplicaçãobool inserirElemListaOrd(LISTA* l, REGISTRO reg) {

PONT ant, i;

i = buscaSeqExc(l,reg.chave,&ant);

if (i != NULL) return false;

i = (PONT) malloc(sizeof(ELEMENTO));

i->reg = reg;

i->prox = ant->prox;

ant->prox = i;

return true;

}

Page 53: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inserção ordenada - sem duplicaçãobool inserirElemListaOrd(LISTA* l, REGISTRO reg) {

PONT ant, i;

i = buscaSeqExc(l,reg.chave,&ant);

if (i != NULL) return false;

i = (PONT) malloc(sizeof(ELEMENTO));

i->reg = reg;

i->prox = ant->prox;

ant->prox = i;

return true;

}

Page 54: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inserção ordenada - sem duplicaçãobool inserirElemListaOrd(LISTA* l, REGISTRO reg) {

PONT ant, i;

i = buscaSeqExc(l,reg.chave,&ant);

if (i != NULL) return false;

i = (PONT) malloc(sizeof(ELEMENTO));

i->reg = reg;

i->prox = ant->prox;

ant->prox = i;

return true;

}

Page 55: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Inserção ordenada - sem duplicaçãobool inserirElemListaOrd(LISTA* l, REGISTRO reg) {

PONT ant, i;

i = buscaSeqExc(l,reg.chave,&ant);

if (i != NULL) return false;

i = (PONT) malloc(sizeof(ELEMENTO));

i->reg = reg;

i->prox = ant->prox;

ant->prox = i;

return true;

}

Page 56: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

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, acerta os ponteirosenvolvidos e retorna true.Caso contrário, retorna false

Para esta função precisamos saber quem é opredecessor do elemento a ser excluído.

Page 57: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

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, acerta os ponteirosenvolvidos e retorna true.Caso contrário, retorna falsePara esta função precisamos saber quem é opredecessor do elemento a ser excluído.

Page 58: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Exclusão de um elemento

bool excluirElemLista(LISTA* l, TIPOCHAVE ch) {

PONT ant, i;

i = buscaSeqExc(l,ch,&ant);

if (i == NULL) return false;

ant->prox = i->prox;

free(i);

return true;

}

Page 59: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Exclusão de um elemento

bool excluirElemLista(LISTA* l, TIPOCHAVE ch) {

PONT ant, i;

i = buscaSeqExc(l,ch,&ant);

if (i == NULL) return false;

ant->prox = i->prox;

free(i);

return true;

}

Page 60: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Exclusão de um elemento

bool excluirElemLista(LISTA* l, TIPOCHAVE ch) {

PONT ant, i;

i = buscaSeqExc(l,ch,&ant);

if (i == NULL) return false;

ant->prox = i->prox;

free(i);

return true;

}

Page 61: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Exclusão de um elemento

bool excluirElemLista(LISTA* l, TIPOCHAVE ch) {

PONT ant, i;

i = buscaSeqExc(l,ch,&ant);

if (i == NULL) return false;

ant->prox = i->prox;

free(i);

return true;

}

Page 62: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Exclusão de um elemento

bool excluirElemLista(LISTA* l, TIPOCHAVE ch) {

PONT ant, i;

i = buscaSeqExc(l,ch,&ant);

if (i == NULL) return false;

ant->prox = i->prox;

free(i);

return true;

}

Page 63: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Exclusão de um elemento

bool excluirElemLista(LISTA* l, TIPOCHAVE ch) {

PONT ant, i;

i = buscaSeqExc(l,ch,&ant);

if (i == NULL) return false;

ant->prox = i->prox;

free(i);

return true;

}

Page 64: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Reinicialização da lista

Para reinicializar a estrutura, precisamos excluirtodos os elementos válidos e atualizar o campoprox do nó cabeça.

Page 65: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Reinicialização da lista

Para reinicializar a estrutura, precisamos excluirtodos os elementos válidos e atualizar o campoprox do nó cabeça.

Page 66: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Reinicialização da lista

void reinicializarLista(LISTA* l) {

PONT end = l->cabeca->prox;

while (end != l->cabeca) {

PONT apagar = end;

end = end->prox;

free(apagar);

}

l->cabeca->prox = l->cabeca;

}

Page 67: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Reinicialização da lista

void reinicializarLista(LISTA* l) {

PONT end = l->cabeca->prox;

while (end != l->cabeca) {

PONT apagar = end;

end = end->prox;

free(apagar);

}

l->cabeca->prox = l->cabeca;

}

Page 68: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Reinicialização da lista

void reinicializarLista(LISTA* l) {

PONT end = l->cabeca->prox;

while (end != l->cabeca) {

PONT apagar = end;

end = end->prox;

free(apagar);

}

l->cabeca->prox = l->cabeca;

}

Page 69: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

Reinicialização da lista

void reinicializarLista(LISTA* l) {

PONT end = l->cabeca->prox;

while (end != l->cabeca) {

PONT apagar = end;

end = end->prox;

free(apagar);

}

l->cabeca->prox = l->cabeca;

}

Page 70: AULA 07 ESTRUTURA DE DADOS · AULA 07 ESTRUTURA DE DADOS Lista ligada circular com nó cabeça Norton T. Roman & Luciano A. Digiampietri. Lista ligada Na última aula aprendemos como

AULA 07ESTRUTURA DE DADOS

Lista ligada circular com nó cabeça

Norton T. Roman & Luciano A. Digiampietri