29
Lista Duplamente Encadeada (Lista Duplamente Ligada) Prof. Gláucya Boechat [email protected]

Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

  • Upload
    others

  • View
    33

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

Lista Duplamente Encadeada(Lista Duplamente Ligada)

Prof. Gláucya [email protected]

Page 2: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

2

Lista duplamente encadeada(Lista duplamente ligada)

Lista duplamente encadeada(Lista duplamente ligada)

lista

6 8 3

\

\

Page 3: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

4

Lista duplamente encadeada(Lista duplamente ligada)

Lista duplamente encadeada(Lista duplamente ligada)

● Na lista duplamente encadeada, cada nó possui um ponteiro para o nó precessor e outro para o nó sucessor.– A lista pode ou não ter um nó cabeça.

● Permite percurso nas duas direções.– Direita

– Esquerda.

Page 4: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

5

Lista duplamente encadeada(Lista duplamente ligada)

Lista duplamente encadeada(Lista duplamente ligada)

struct no {  int valor;  struct no* ant;   struct no* prox;  };

Page 5: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

6

Insere no inicio da listaInsere no inicio da listavoid insere_lista_duplamente_encadeada(No** lista, int v){  No* no;  no = (No*) malloc(sizeof(No));  no­>valor = v;

  if(*lista == NULL){no­>ant = NULL;no­>prox = NULL;

  }else{ no­>prox = *lista;no­>ant = NULL;(*lista)­>ant = no;

  }    *lista = no;    }

Page 6: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

7

Inserir no fim da lista circularInserir no fim da lista circular

void main() {

...  insere_lista_duplamente_encadeada(&lista, 5);  imprime_lista_duplamente_encadeada(lista);

}

Page 7: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

8

Insere no inicio da listaInsere no inicio da lista

lista

6 8 3

\\

X = 7

a

Page 8: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

9

Insere no inicio da listaInsere no inicio da lista

lista

6 8 3

\\

X = 7

a

lista

6 8 3

\\

7

\b

Page 9: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

10

Insere no inicio da listaInsere no inicio da lista

lista

6 8 3

\\

7

\b

lista

6 8 3\

7

\c

Page 10: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

11

Insere no inicio da listaInsere no inicio da lista

lista

6 8 3\

7

\c

6 8 3\

7

\d

lista

Page 11: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

12

Lista duplamente encadeada(Lista duplamente ligada)

Lista duplamente encadeada(Lista duplamente ligada)

inicio fim

6 8 3

\\

Page 12: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

13

Lista duplamente encadeada(Lista duplamente ligada)

Lista duplamente encadeada(Lista duplamente ligada)

struct no {  int valor;  struct no* ant;   struct no* prox;};typedef struct no No;

struct lista{    No *inicio, *fim;};typedef struct lista Lista;

Page 13: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

14

Inicializa listaInicializa lista

void inicia(Lista *lista){  lista­>inicio = lista­>fim = NULL;}

Page 14: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

15

Inicializa listaInicializa lista

void main() {

Lista lista;

inicia(&lista);

/...

}

Page 15: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

19

Insere no início da listaInsere no início da listavoid insere_fim(Lista* lista, int v){  No* no;  no = (No*) malloc(sizeof(No));  no­>valor = v;  no­>prox = NULL;  

  if(lista­>inicio == NULL){    no­>ant = NULL;    lista­>inicio = lista­>fim = no;    }else{     no­>ant = lista­>fim;     (lista­>fim)­>prox = no;    lista­>fim = no;  }}

Page 16: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

20

Insere no fim da listaInsere no fim da lista

void main() {

Lista lista;

inicia(&lista);

insere_fim(&lista, 3);imprime_lista(lista);

/...

}

Page 17: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

21

Insere no fim da listaInsere no fim da lista

inicio fim

6 8 3

\\

X = 7

Page 18: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

22

Insere no fim da listaInsere no fim da lista

inicio fim

6 8 3

\\

X = 7

inicio fim

6 8 3

\\

X = 7

7

a

Page 19: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

23

Insere no fim da listaInsere no fim da lista

inicio fim

6 8 3

\\

X = 7

7

a

inicio fim

6 8 3

\\

7\

b

Page 20: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

24

Insere no fim da listaInsere no fim da lista

inicio fim

6 8 3

\\

7\

b

inicio fim

6 8 3

\

7\

c

Page 21: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

25

Insere no fim da listaInsere no fim da lista

inicio fim

6 8 3

\

7\

c

inicio fim

6 8 3

\

7\

d

Page 22: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

28

Remove no fim da listaRemove no fim da listaint remove_fim(Lista *lista) {  No *no;  int v;  if (lista­>inicio == NULL)    return ­1;  no = lista­>fim; if(lista­>inicio == lista­>fim) 

lista­>inicio = lista­>fim = NULL; else{  lista­>fim = no­>ant;    (lista­>fim)­>prox = NULL; }  v = no­>valor;  free(no);  return v;}

Page 23: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

29

Remove no fim da listaRemove no fim da lista

void main() {

/...

remove_fim(&lista);imprime_lista(lista);

}

Page 24: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

30

Remove no fim da listaRemove no fim da lista

inicio fim

6 8 3

\

7\

Page 25: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

31

Remove no fim da listaRemove no fim da lista

inicio fim

6 8 3

\

7\

a

inicio fim

6 8 3

\

7\

no

X = 7

Page 26: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

32

Remove no fim da listaRemove no fim da lista

inicio fim

6 8 3

\

7\

a

no

X = 7

X = 7

fim

6 8 3

\

7\

b

inicio no

Page 27: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

33

Remove no fim da listaRemove no fim da lista

X = 7

fim

6 8 3

\

7\

b

inicio no

X = 7

fim

6 8 3

\\

7\

inicio

c

no

Page 28: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

34

Remove no fim da listaRemove no fim da lista

X = 7

fim

6 8 3

\\

7\

inicio

c

no

X = 7

inicio fim

6 8 3

\\

d

Page 29: Lista Duplamente Encadeada (Lista Duplamente Ligada)glaucya/ifsp/EDI/EDI_lista... · 4 Lista duplamente encadeada (Lista duplamente ligada) Na lista duplamente encadeada, cada nó

35

Lista duplamente circularLista duplamente circular

lista

6 8 3