struct, union e listas ligadas · listas duplamente ligadas •cada item é ligado ao próximo item...

27
struct, union e listas ligadas Prof. Paulo Henrique Pisani fevereiro/2019 Algoritmos e Estruturas de Dados I

Upload: others

Post on 12-Jun-2020

14 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

struct, union elistas ligadas

Prof. Paulo Henrique Pisani

fevereiro/2019

Algoritmos e Estruturas de Dados I

Page 2: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

struct

Page 3: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Estruturas

• Com o struct, definimos um novo tipo de dados;

• Esse tipo é uma estrutura que permite a combinação de itens de diferentes tipos de dados.

RA

Nome

Curso

Alunostruct aluno {

int ra;char nome[100];char curso[20];

};

Page 4: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Declarar varíavel do tipoestrutura

• Para declarar uma variável do tipo struct aluno:

struct aluno aluno1;struct aluno fulano1, fulano2;

Tipo da variável

Page 5: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Acesso a membros da estrutura

• Para acessar membros da estrutura, usamos o ponto:

struct aluno {int ra;char nome[100];char curso[20];

};

struct aluno a1;a1.ra = 123;

struct aluno a2, a3;a2.ra = 100;a3.ra = 200;

scanf("%d", &a2.na);scanf("%s", a2.nome);

Page 6: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

#include <stdio.h>

struct aluno {int ra;char nome[100];char curso[20];

};

int main() {

struct aluno p;

scanf("%d", &p.ra);scanf("%s", p.nome);scanf("%s", p.curso);

printf("RA=%d Nome=%s Curso=%s\n", p.ra, p.nome, p.curso);

return 0;}

Declaração do tipo de dados (estrutura);

Variável do tipo struct.

Page 7: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Declarar varíavel do tipoestrutura

• Podemos criar um sinônimo para o tipo de dados, e assim facilitar a declaração;

t_aluno aluno1;t_aluno fulano1, fulano2;

Tipo da variável

typedef struct aluno t_aluno;

Page 8: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

#include <stdio.h>

struct aluno {int ra;char nome[100];char curso[20];

};typedef struct aluno t_aluno;

int main() {

t_aluno p;

scanf("%d", &p.ra);scanf("%s", p.nome);scanf("%s", p.curso);

printf("RA=%d Nome=%s Curso=%s\n", p.ra, p.nome, p.curso);

return 0;}

Declaração do tipo de dados (estrutura);

Variável do tipo struct.

Page 9: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Vetores de estruturas

• Por exemplo: #include <stdio.h>

typedef struct aluno t_aluno;struct aluno {

int ra;double nota;

};

int main() {

t_aluno alunos[3];

return 0;}

Page 10: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Alocação dinâmica de estruturas

Page 11: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Podemos alocar estruturasdinamicamente também!

• Por exemplo:typedef struct aluno t_aluno;

struct aluno {

int ra;

char *nome;

double nota;

};

t_aluno *a1;a1 = malloc(sizeof(t_aluno));

t_aluno *a2 = malloc(sizeof(t_aluno));

Page 12: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Acesso a membros de um ponteiro para estrutura

• Para acessar membros de um ponteiro para estrutura, temos duas alternativas:

1) Resolver ponteiro e acessar com o ponto:

2) Utilizar o operador “->”:

t_aluno *a1 = malloc(sizeof(t_aluno));(*a1).ra = 123;

t_aluno *a1 = malloc(sizeof(t_aluno));a1->ra = 123;

Page 13: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Uma estrutura podereferenciar a si mesma!

•Será que podemos fazer isso então?

struct disciplina {int cod;char *nome;int creditos;struct disciplina requisito;

};

Page 14: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Uma estrutura podereferenciar a si mesma!

•Será que podemos fazer isso então?

struct disciplina {int cod;char *nome;int creditos;struct disciplina requisito;

};

NÃO !!! Isso torna a declaração recursiva!

Page 15: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Uma estrutura podereferenciar a si mesma!

•Será que podemos fazer isso então?

struct disciplina {int cod;char *nome;int creditos;struct disciplina requisito;

};

Qual seria o tamanho de um struct disciplina em

memória com a definição anterior? Seria infinito!

Page 16: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Uma estrutura podereferenciar a si mesma!

•Mas podemos referenciar usandoponteiros:

struct disciplina {int cod;char *nome;int creditos;

struct disciplina *requisito;};

Page 17: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

union

Page 18: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

union

• Sintaxe similar ao struct;

• Entretanto, o mesmo espaço de memória é compartilhado por todos os campos!

• Portanto, alterar o valor de um membro implica em alterar os demais!

union ip {int numero;char bytes[4];

};

Page 19: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

union

#include <stdio.h>

union ip {int numero;char bytes[4];

};

int main() {union ip a;a.numero = 259;printf("%d %d %d %d\n",

a.bytes[3], a.bytes[2], a.bytes[1], a.bytes[0]);

printf("%d\n", a.numero);a.bytes[1] = 2;printf("%d\n", a.numero);return 0;

}

O que será impresso?

Page 20: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

union

#include <stdio.h>

union ip {int numero;char bytes[4];

};

int main() {union ip a;a.numero = 259;printf("%d %d %d %d\n",

a.bytes[3], a.bytes[2], a.bytes[1], a.bytes[0]);

printf("%d\n", a.numero);a.bytes[1] = 2;printf("%d\n", a.numero);return 0;

}

O que será impresso?

0 0 1 3

259

515

Page 21: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Listas ligadas

Page 22: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Listas com arranjos (revisão)

• Itens dispostos em um arranjo sequencial;

Dados 1 Dados 2 Dados 3 Dados 4

Problemas?(pense das operações básicas: busca, inserção, remoção)

Page 23: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Listas ligadas/encadeadas

• Estrutura de dados que armazena os itens de forma não consecutiva na memória:• Usa ponteiros para “ligar” um item no próximo.

Dados 1

Ponteiro

para o

próximo

Dados 2

Ponteiro

para o

próximo

NULL

Page 24: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Listas ligadas/encadeadas

• Vários tipos:• Listas simplesmente ligadas (com e sem nó

cabeça);

• Listas duplamente ligadas (com e sem nó cabeça);

• Listas circulares.

Page 25: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Listas simplesmente ligadas

• Cada item é ligado somente ao próximo item;

data next data next data next

NULL

typedef struct linked_node linked_node;struct linked_node {

int data;linked_node *next;

};

Page 26: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Listas duplamente ligadas

• Cada item é ligado ao próximo item e também aoanterior;

• Vantagem: a lista pode ser percorrida em ambas as direções.

data nextprevdata nextprev data nextprev

NULL NULL

typedef struct linked_node linked_node;struct linked_node {

int data;linked_node *prev, *next;

};

Page 27: struct, union e listas ligadas · Listas duplamente ligadas •Cada item é ligado ao próximo item e também ao anterior; •Vantagem: a lista pode ser percorrida em ambas as direções

Referências

• Slides do Prof. Paulo H. Pisani: ProgramaçãoEstruturada (Q3/2018)

• PINHEIRO, F. A. C. Elementos de programação em C. Porto Alegre, RS: Bookman, 2012.

• CELES, W.; CERQUEIRA, R.; RANGEL, J. L. Introdução a Estruturas de Dados. Elsevier/Campus, 2004.