aula 03 estrutura de dados · 2016-05-30 · aula 03 estrutura de dados lista linear sequencial...

48
AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Upload: others

Post on 03-Jul-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

AULA 03ESTRUTURA DE DADOS

Lista linear sequencial

Norton T. Roman & Luciano A. Digiampietri

Page 2: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Lista linearEstrutura de dados na qual cada elemento éprecedido por um elemento e sucedido por outro(exceto o primeiro que não tem predecessor e oúltimo que não tem sucessor).Os elementos estão em uma dada ordem (porexemplo, a ordem de inclusão ou ordenados poruma chave).

Page 3: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Lista linear sequencial

É uma lista linear na qual a ordem lógica doselementos (a ordem “vista” pelo usuário) é a mesmaordem física (em memória principal) dos elementos.Isto é, elementos vizinhos na lista estarão emposições vizinhas de memória.

Page 4: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Lista linear sequencial

Modelagem:Modelaremos usando um arranjo de registros;Registros conterão as informações de interessedo usuário;Nosso arranjo terá um tamanho fixo econtrolaremos o número de elementos com umavariável adicional.

Page 5: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Modelagem

#define MAX 50

typedef int TIPOCHAVE;

typedef struct{

TIPOCHAVE chave;

// outros campos...

} REGISTRO;

typedef struct {

REGISTRO A[MAX];

int nroElem;

} LISTA;

Page 6: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial 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 7: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inicialização

Para inicializar uma estrutura qualquer, precisamospensar nos valores adequados para cada um doscampos de nossa estrutura

Para inicializar uma lista sequencial já criada pelousuário, só precisamos colocar o valor 0 (zero) nonúmero de elementos válidos

Page 8: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inicialização

Para inicializar uma estrutura qualquer, precisamospensar nos valores adequados para cada um doscampos de nossa estrutura

Para inicializar uma lista sequencial já criada pelousuário, só precisamos colocar o valor 0 (zero) nonúmero de elementos válidos

Page 9: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inicialização

void inicializarLista(LISTA l) {

l.nroElem = 0;

}

Há algum problema com este código?Qual a diferença entre os códigos?

void inicializarLista(LISTA* l) {

l->nroElem = 0;

}

Page 10: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inicialização

void inicializarLista(LISTA l) {

l.nroElem = 0;

}

Há algum problema com este código?

Qual a diferença entre os códigos?

void inicializarLista(LISTA* l) {

l->nroElem = 0;

}

Page 11: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inicialização

void inicializarLista(LISTA l) {

l.nroElem = 0;

}

Há algum problema com este código?Qual a diferença entre os códigos?

void inicializarLista(LISTA* l) {

l->nroElem = 0;

}

Page 12: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inicialização

void inicializarLista(LISTA l) {

l.nroElem = 0;

}

Há algum problema com este código?Qual a diferença entre os códigos?

void inicializarLista(LISTA* l) {

l->nroElem = 0;

}

Page 13: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inicialização

void inicializarLista(LISTA l) {

l.nroElem = 0;

}

Há algum problema com este código?Qual a diferença entre os códigos?

void inicializarLista(LISTA* l) {

l->nroElem = 0;

}

Page 14: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inicialização

void inicializarLista(LISTA l) {

l.nroElem = 0;

}

Há algum problema com este código?Qual a diferença entre os códigos?

void inicializarLista(LISTA* l) {

l->nroElem = 0;

}

Page 15: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inicialização

void inicializarLista(LISTA l) {

l.nroElem = 0;

}

Há algum problema com este código?Qual a diferença entre os códigos?

void inicializarLista(LISTA* l) {

l->nroElem = 0;

}

Page 16: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Retornar número de elementos

Para esta estrutura basta retornar o valor do camponroElem

Page 17: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Retornar número de elementos

int tamanho(LISTA* l) {

return l->nroElem;

}

Page 18: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial 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 19: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Exibição/Impressão

void exibirLista(LISTA* l){

int i;

printf("Lista: \" ");

for (i=0; i < l->nroElem; i++)

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

printf("\"\n");

}

Saída:

$ Lista: " 21 9 55 "

Page 20: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Exibição/Impressão

void exibirLista(LISTA* l){

int i;

printf("Lista: \" ");

for (i=0; i < l->nroElem; i++)

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

printf("\"\n");

}

Saída:

$ Lista: " 21 9 55 "

Page 21: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Exibição/Impressão

void exibirLista(LISTA* l){

int i;

printf("Lista: \" ");

for (i=0; i < l->nroElem; i++)

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

printf("\"\n");

}

Saída:

$ Lista: " 21 9 55 "

Page 22: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Exibição/Impressão

void exibirLista(LISTA* l){

int i;

printf("Lista: \" ");

for (i=0; i < l->nroElem; i++)

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

printf("\"\n");

}

Saída:

$ Lista: " 21 9 55 "

Page 23: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial 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 na lista (caso seja encontrado)Retornar -1 caso não haja um registro com essachave na lista

Page 24: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Busca sequencial

int buscaSequencial(LISTA* l, TIPOCHAVE ch) {

int i = 0;

while (i < l->nroElem){

if(ch == l->A[i].chave) return i;

else i++;

}

return -1;

}

Page 25: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Busca sequencial

int buscaSequencial(LISTA* l, TIPOCHAVE ch) {

int i = 0;

while (i < l->nroElem){

if(ch == l->A[i].chave) return i;

else i++;

}

return -1;

}

Page 26: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção de um elemento

O usuário passa como parâmetro um registro a serinserido na listaHá diferentes possibilidades de inserção:

No inícioNo fimOrdenada pela chaveNuma posição indicada pelo usuário

Page 27: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção de um elemento

O usuário passa como parâmetro um registro a serinserido na listaHá diferentes possibilidades de inserção:

No inícioNo fimOrdenada pela chaveNuma posição indicada pelo usuário

Page 28: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção de um elemento

Como inserir?Se a lista não estiver cheia e o índice passadopelo usuário for válido: desloca todos oselementos posteriores uma posição para a direita;insere o elemento na posição desejada, soma umno campo nroElem e retorna trueCaso contrário retorna false

Page 29: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção em posição específica

bool inserirElemLista(LISTA* l, REGISTRO reg, int i){

int j;

if ((l->nroElem == MAX) || (i < 0) || (i > l->nroElem))

return false;

for (j = l->nroElem; j > i; j--) l->A[j] = l->A[j-1];

l->A[i] = reg;

l->nroElem++;

return true;

}

Page 30: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção em posição específica

bool inserirElemLista(LISTA* l, REGISTRO reg, int i){

int j;

if ((l->nroElem == MAX) || (i < 0) || (i > l->nroElem))

return false;

for (j = l->nroElem; j > i; j--) l->A[j] = l->A[j-1];

l->A[i] = reg;

l->nroElem++;

return true;

}

Page 31: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção em posição específica

bool inserirElemLista(LISTA* l, REGISTRO reg, int i){

int j;

if ((l->nroElem == MAX) || (i < 0) || (i > l->nroElem))

return false;

for (j = l->nroElem; j > i; j--) l->A[j] = l->A[j-1];

l->A[i] = reg;

l->nroElem++;

return true;

}

Page 32: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção em posição específica

bool inserirElemLista(LISTA* l, REGISTRO reg, int i){

int j;

if ((l->nroElem == MAX) || (i < 0) || (i > l->nroElem))

return false;

for (j = l->nroElem; j > i; j--) l->A[j] = l->A[j-1];

l->A[i] = reg;

l->nroElem++;

return true;

}

Page 33: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção em posição específica

bool inserirElemLista(LISTA* l, REGISTRO reg, int i){

int j;

if ((l->nroElem == MAX) || (i < 0) || (i > l->nroElem))

return false;

for (j = l->nroElem; j > i; j--) l->A[j] = l->A[j-1];

l->A[i] = reg;

l->nroElem++;

return true;

}

Page 34: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção em posição específica

bool inserirElemLista(LISTA* l, REGISTRO reg, int i){

int j;

if ((l->nroElem == MAX) || (i < 0) || (i > l->nroElem))

return false;

for (j = l->nroElem; j > i; j--) l->A[j] = l->A[j-1];

l->A[i] = reg;

l->nroElem++;

return true;

}

Page 35: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção em posição específica

bool inserirElemLista(LISTA* l, REGISTRO reg, int i){

int j;

if ((l->nroElem == MAX) || (i < 0) || (i > l->nroElem))

return false;

for (j = l->nroElem; j > i; j--) l->A[j] = l->A[j-1];

l->A[i] = reg;

l->nroElem++;

return true;

}

Page 36: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção em posição específica

bool inserirElemLista(LISTA* l, REGISTRO reg, int i){

int j;

if ((l->nroElem == MAX) || (i < 0) || (i > l->nroElem))

return false;

for (j = l->nroElem; j > i; j--) l->A[j] = l->A[j-1];

l->A[i] = reg;

l->nroElem++;

return true;

}

Page 37: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção em posição específica

bool inserirElemLista(LISTA* l, REGISTRO reg, int i){

int j;

if ((l->nroElem == MAX) || (i < 0) || (i > l->nroElem))

return false;

for (j = l->nroElem; j > i; j--) l->A[j] = l->A[j-1];

l->A[i] = reg;

l->nroElem++;

return true;

}

Page 38: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção em posição específica

bool inserirElemLista(LISTA* l, REGISTRO reg, int i){

int j;

if ((l->nroElem == MAX) || (i < 0) || (i > l->nroElem))

return false;

for (j = l->nroElem; j > i; j--) l->A[j] = l->A[j-1];

l->A[i] = reg;

l->nroElem++;

return true;

}

Page 39: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Inserção em posição específica

bool inserirElemLista(LISTA* l, REGISTRO reg, int i){

int j;

if ((l->nroElem == MAX) || (i < 0) || (i > l->nroElem))

return false;

for (j = l->nroElem; j > i; j--) l->A[j] = l->A[j-1];

l->A[i] = reg;

l->nroElem++;

return true;

}

Page 40: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial 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”, desloca todos oselementos posteriores uma posição para aesquerda, diminui em um o campo nroElem eretorna trueCaso contrário, retorna false

Page 41: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elemento

bool excluirElemLista(TIPOCHAVE ch, LISTA* l) {

int pos, j;

if(pos == -1) return false;

l->nroElem--;

return true;

}

Page 42: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elemento

bool excluirElemLista(TIPOCHAVE ch, LISTA* l) {

int pos, j;

pos = buscaSequencial(l,ch);

if(pos == -1) return false;

l->nroElem--;

return true;

}

Page 43: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Exclusão de um elemento

bool excluirElemLista(TIPOCHAVE ch, LISTA* l) {

int pos, j;

pos = buscaSequencial(l,ch);

if(pos == -1) return false;

l->nroElem--;

return true;

}

Page 44: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

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

int pos, j;

pos = buscaSequencial(l,ch);

if(pos == -1) return false;

for(j = pos; j < l->nroElem-1; j++)

l->A[j] = l->A[j+1];

l->nroElem--;

return true;

}

Page 45: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

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

int pos, j;

pos = buscaSequencial(l,ch);

if(pos == -1) return false;

for(j = pos; j < l->nroElem-1; j++)

l->A[j] = l->A[j+1];

l->nroElem--;

return true;

}

Page 46: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Reinicialização da lista

Para esta estrutura, para reinicializar a lista bastacolocar 0 (zero) no campo nroElem

Page 47: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

Reinicialização da lista

void reinicializarLista(LISTA* l) {

l->nroElem = 0;

}

Page 48: AULA 03 ESTRUTURA DE DADOS · 2016-05-30 · AULA 03 ESTRUTURA DE DADOS Lista linear sequencial Norton T. Roman & Luciano A. Digiampietri

AULA 03ESTRUTURA DE DADOS

Lista linear sequencial

Norton T. Roman & Luciano A. Digiampietri