cap3_nivio ziviani

Upload: aki0

Post on 18-Jul-2015

246 views

Category:

Documents


0 download

TRANSCRIPT

Estruturas de Dados Bsicas

ltima alterao: 16 de Setembro de 2010

Slides

elaborados por Charles Ornelas Almeida, Israel Guerra e Nivio Ziviani

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas

1

Contedo do Captulo3.1 Listas Lineares 3.1.1 Implementao de Listas por meio de Arranjos 3.1.2 Implementao de Listas por meio de Apontadores 3.2 Pilhas 3.2.1 Implementao de Pilhas por meio de Arranjos 3.2.2 Implementao de Pilhas por meio de Apontadores 3.3 Filas 3.3.1 Implementao de Filas por meio de Arranjos 3.3.2 Implementao de Filas por meio de Apontadores

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1

2

Listas Lineares Uma das formas mais simples de interligar os elementos de um conjunto. Estrutura em que as operaes inserir, retirar e localizar so denidas. Podem crescer ou diminuir de tamanho durante a execuo de um programa, de acordo com a demanda. Itens podem ser acessados, inseridos ou retirados de uma lista. Duas listas podem ser concatenadas para formar uma lista nica, ou uma pode ser partida em duas ou mais listas. Adequadas quando no possvel prever a demanda por memria, permitindo a manipulao de quantidades imprevisveis de dados, de formato tambm imprevisvel. So teis em aplicaes tais como manipulao simblica, gerncia de memria, simulao e compiladores.

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1

3

Denio de Listas Lineares Seqncia de zero ou mais itens x1 , x2 , , xn , na qual xi de um determinado tipo e n representa o tamanho da lista linear. Sua principal propriedade estrutural envolve as posies relativas dos itens em uma dimenso. Assumindo n 1, x1 o primeiro item da lista e xn o ltimo item da lista. xi precede xi+1 para i = 1, 2, , n 1 xi sucede xi1 para i = 2, 3, , n o elemento xi dito estar na i-sima posio da lista.

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1

4

TAD Listas Lineares O conjunto de operaes a ser denido depende de cada aplicao. Um conjunto de operaes necessrio a uma maioria de aplicaes : 1. Criar uma lista linear vazia. 2. Inserir um novo item imediatamente aps o i-simo item. 3. Retirar o i-simo item. 4. Localizar o i-simo item para examinar e/ou alterar o contedo de seus componentes. 5. Combinar duas ou mais listas lineares em uma lista nica. 6. Partir uma lista linear em duas ou mais listas. 7. Fazer uma cpia da lista linear. 8. Ordenar os itens da lista em ordem ascendente ou descendente, de acordo com alguns de seus componentes. 9. Pesquisar a ocorrncia de um item com um valor particular em algum componente.

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1

5

Implementaes de Listas Lineares Vrias estruturas de dados podem ser usadas para representar listas lineares, cada uma com vantagens e desvantagens particulares. As duas representaes mais utilizadas so as implementaes por meio de arranjos e de apontadores. Exemplo de Conjunto de Operaes: 1. FLVazia(Lista). Faz a lista car vazia. 2. Insere(x, Lista). Insere x aps o ltimo item da lista. 3. Retira(p, Lista, x). Retorna o item x que est na posio p da lista, retirando-o da lista e deslocando os itens a partir da posio p+1 para as posies anteriores. 4. Vazia(Lista). Esta funo retorna true se lista vazia; seno retorna false. 5. Imprime(Lista). Imprime os itens da lista na ordem de ocorrncia.

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.1

6

Implementao de Listas por meio de Arranjos Os itens da lista so armazenados em posies contguas de memria. A lista pode ser percorrida em qualquer direo. A insero de um novo item pode ser realizada aps o ltimo item com custo constante.Primeiro = 1 2 ltimo1 MaxTam Itens x1 x2 . . . xn . . .

A insero de um novo item no meio da lista requer um deslocamento de todos os itens localizados aps o ponto de insero. Retirar um item do incio da lista requer um deslocamento de itens para preencher o espao deixado vazio.

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.1

7

Estrutura da Lista Usando Arranjo#define INICIOARRANJO 1 #define MAXTAM 1000 typedef int TipoApontador; typedef int TipoChave; typedef struct { TipoChave Chave; / outros componentes / } TipoItem ; typedef struct { TipoItem Item [ MAXTAM ] ; TipoApontador Primeiro , Ultimo ; } TipoLista ;

Os itens so armazenados em um array de tamanho suciente para armazenar a lista. O campo ltimo aponta para a posio seguinte a do ltimo elemento da lista. O i-simo item da lista est armazenado na i-sima posio do array, 1 i Primeiro = INICIOARRANJO ; Lista>Ultimo = Lista>Primeiro ; } int Vazia( TipoLista Lista ) { return ( Lista . Primeiro == Lista . Ultimo ) ; } void Insere (TipoItem x , TipoLista Lista ) { i f ( Lista > Ultimo > MAXTAM) p r i n t f ( " Lista esta cheia \n" ) ; else { Lista > Item [ Lista > Ultimo 1] = x ; Lista > Ultimo++; } } / Insere / / Vazia /

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.1

9

Operaes sobre Lista Usando Arranjovoid Retira (TipoApontador p, TipoLista Lista , TipoItem Item) { int Aux; i f ( Vazia( Lista ) | | p >= Lista > Ultimo) { p r i n t f ( "Erro : Posicao nao existe \n" ) ; return ; } Item = Lista > Item [p 1]; Lista > Ultimo; for (Aux = p ; Aux < Lista > Ultimo ; Aux++) Lista > Item [Aux 1] = Lista > Item [Aux] ; } / Retira / void Imprime( TipoLista Lista ) { int Aux; for (Aux = Lista . Primeiro 1; Aux Primeiro = (TipoApontador ) malloc(sizeof(TipoCelula ) ) ; Lista>Ultimo = Lista>Primeiro ; Lista>Primeiro>Prox = NULL ; } int Vazia( TipoLista Lista ) { return ( Lista . Primeiro == Lista . Ultimo ) ; } void Insere (TipoItem x , TipoLista Lista ) { Lista>Ultimo>Prox = (TipoApontador ) malloc(sizeof(TipoCelula ) ) ; Lista>Ultimo = Lista>Ultimo>Prox ; Lista>Ultimo>Item = x ; Lista>Ultimo>Prox = NULL ; }

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2

14

Operaes sobre Lista Usando Apontadoresvoid Retira (TipoApontador p, TipoLista Lista , TipoItem Item) { /O item a ser retirado e o seguinte ao apontado por p/ TipoApontador q; i f ( Vazia( Lista ) | | p == NULL | | p>Prox == NULL) { p r i n t f ( " Erro : Lista vazia ou posicao nao existe \n" ) ; return ; } q = p>Prox; Item = q>Item ; free (q) ; } void Imprime( TipoLista Lista ) { TipoApontador Aux; Aux = Lista . Primeiro>Prox; while (Aux ! = NULL) { p r i n t f ( "% d\n" , Aux>Item .Chave) ; Aux = Aux>Prox ; } } p>Prox = q>Prox; i f ( p>Prox == NULL ) Lista>Ultimo = p;

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2

15

Listas Usando Apontadores - Vantagens e Desvantagens Vantagens: Permite inserir ou retirar itens do meio da lista a um custo constante (importante quando a lista tem de ser mantida em ordem). Bom para aplicaes em que no existe previso sobre o crescimento da lista (o tamanho mximo da lista no precisa ser denido a priori). Desvantagem: utilizao de memria extra para armazenar os apontadores.

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2

16

Exemplo de Uso Listas - Vestibular Num vestibular, cada candidato tem direito a trs opes para tentar uma vaga em um dos sete cursos oferecidos. Para cada candidato lido um registro: Chave: nmero de inscrio do candidato. NotaFinal: mdia das notas do candidato. Opo: vetor contendo as trs opes de curso do candidato.Chave Opcao : 1..999; : array [ 1 . . 3 ] of 1 . . 7 ;

NotaFinal : 0..10;

Problema: distribuir os candidatos entre os cursos, segundo a nota nal e as opes apresentadas por candidato. Em caso de empate, os candidatos sero atendidos na ordem de inscrio para os exames.

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2

17

Vestibular - Possvel Soluo Ordenar registros por NotaFinal, respeitando a ordem de inscrio. Percorrer registros com mesma NotaFinal, comeando pelo conjunto de NotaFinal 10, depois NotaFinal 9, e assim por diante. Para um conjunto de mesma NotaFinal encaixar cada registro em um dos cursos, na primeira opo em que houver vaga (se houver). Primeiro renamento:int Nota ; ordena os registros pelo campo NotaFinal ; for (Nota = 10; Nota >= 0; Nota ) { while houver registro com mesma nota { if existe vaga em um dos cursos de opo do candidato { insere registro no conjunto de aprovados} else insere registro no conjunto de reprovados; } } imprime aprovados por curso ; imprime reprovados;

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2

18

Vestibular - Classicao dos Alunos Uma boa maneira de representar um conjunto de registros com o uso de listas. Os registros so armazenados em listas para cada nota. Aps a leitura do ltimo registro os candidatos esto automaticamente ordenados por NotaFinal.NotaFinal 0

7 8 9 10

Dentro de cada lista, os registros esto ordenados por ordem de inscrio, desde que os registros sejam lidos e inseridos na ordem de inscrio de cada candidato....Registro Registro nil Registro nil

...

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2

19

Vestibular - Classicao dos Alunos As listas de registros so percorridas, iniciando-se pela de NotaFinal 10, seguida pela de NotaFinal 9, e assim sucessivamente. Cada registro retirado e colocado em uma das listas da abaixo, na primeira das trs opes em que houver vaga.Cursos 1 2 3 4 5 6 7 Registro Registro Registro

...

...

...

Se no houver vaga, o registro colocado em uma lista de reprovados. Ao nal a estrutura acima conter a relao de candidatos aprovados em cada curso.

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2

20

Vestibular - Segundo Renamentoint Nota; TipoChave Chave; l nmero de vagas para cada curso; inicializa listas de classicao, de aprovados e de reprovados; l registro; while ( Chave ! = 0 ) { insere registro nas listas de classicao, conforme nota nal; l registro; } for ( Nota= 10; Nota>= 0; Nota) { while ( houver prximo registro com mesma NotaFinal ) { retira registro da lista; if existe vaga em um dos cursos de opo do candidato { insere registro na lista de aprovados; decrementa o nmero de vagas para aquele curso; } else { insere registro na lista de reprovados; } obtm prximo registro; } } imprime aprovados por curso; imprime reprovados;

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2

21

Vestibular - Estrutura Final da Lista#define NOPCOES 3 #define NCURSOS 7 typedef short TipoChave; typedef struct TipoItem { TipoChave Chave; int NotaFinal ; int Opcao[ NOPCOES ] ; } TipoItem ; typedef struct TipoCelula TipoApontador; typedef struct TipoCelula { TipoItem Item ; TipoApontador Prox; } TipoCelula ; typedef struct TipoLista { TipoApontador Primeiro , Ultimo ; } TipoLista ;

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2

22

Vestibular - Renamento Final (1)#define NOPCOES #define NCURSOS #define FALSE #define TRUE TipoItem Registro ; TipoLista Classificacao [11]; TipoLista Aprovados[ NCURSOS ] ; TipoLista Reprovados; long Vagas[ NCURSOS ] ; short Passou; long i , Nota; /Entram aqui os operadores sobre listas dos Slides 13 e 14/ void LeRegistro(TipoItem Registro) { / os valores lidos devem estar separados por brancos / long i ; scanf( "% % , &Registro > Chave, &Registro > NotaFinal ) ; hd d" for ( i = 0; i < NOPCOES ; i ++) scanf( "% , &Registro > Opcao[ i ] ) ; d" } 3 7 0 1

/Entram aqui os tipos do Slide 21/

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.1.2

23

Vestibular - Renamento Final (2){ / Programa principal / for ( i = 1; i Topo++; Pilha>Item [ Pilha>Topo 1] = x ; } } void Desempilha( TipoPilha Pilha , TipoItem Item) { i f ( Vazia(Pilha ) ) p r i n t f ( "Erro : pilha esta vazia \n" ) ; else { Item = Pilha>Item [ Pilha>Topo 1]; Pilha>Topo ; } } int Tamanho( TipoPilha Pilha ) { return ( Pilha .Topo) ; }

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.2.2

32

Implementao de Pilhas por meio de Apontadores H uma clula cabea no topo para facilitar a implementao das operaes empilha e desempilha quando a pilha est vazia. Para desempilhar o item xn basta desligar a clula cabea da lista e a clula que contm xn passa a ser a clula cabea. Para empilhar um novo item, basta fazer a operao contrria, criando uma nova clula cabea e colocando o item na antiga.

nilT

Fundo E

x1T

. . .T

xnT Topo E Cabea

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.2.2

33

Estrutura da Pilha Usando Apontadores O campo Tamanho evita a contagem do nmero de itens na funo Tamanho. Cada clula de uma pilha contm um item da pilha e um apontador para outra clula. O registro TipoPilha contm um apontador para o topo da pilha (clula cabea) e um apontador para o fundo da pilha.typedef int TipoChave; typedef struct { int Chave; / outros componentes / } TipoItem ; typedef struct TipoCelula TipoApontador; typedef struct TipoCelula { TipoItem Item ; TipoApontador Prox; } TipoCelula ; typedef struct { TipoApontador Fundo, Topo; int Tamanho; } TipoPilha ;

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.2.2

34

Operaes sobre Pilhas Usando Apontadoresvoid FPVazia( TipoPilha Pilha ) { Pilha>Topo = (TipoApontador ) malloc(sizeof(TipoCelula ) ) ; Pilha>Fundo = Pilha>Topo; Pilha>Topo >Prox = NULL; Pilha>Tamanho = 0; } int Vazia( TipoPilha Pilha ) { return ( Pilha .Topo == Pilha .Fundo) ; } void Empilha(TipoItem x , TipoPilha Pilha ) { TipoApontador Aux; Aux = (TipoApontador ) malloc(sizeof(TipoCelula ) ) ; Pilha>Topo >Item = x ; Aux>Prox = Pilha>Topo; Pilha>Topo = Aux; Pilha>Tamanho++; }

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.2.2

35

Operaes sobre Pilhas Usando Apontadoresvoid Desempilha( TipoPilha Pilha , TipoItem Item) { TipoApontador q; i f ( Vazia(Pilha ) ) { p r i n t f ( "Erro : l i s t a vazia \n" ) ; return ; } q = Pilha>Topo; Pilha>Topo = q>Prox; Item = q>Prox>Item ; free (q ) ; } int Tamanho( TipoPilha Pilha ) { return ( Pilha .Tamanho) ; } Pilha>Tamanho ;

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.2.2

36

Exemplo de Uso Pilhas - Editor de Textos (ET) #: cancelar caractere anterior na linha sendo editada. Ex.: UEM##FMB#G UFMG. \: cancela todos os caracteres anteriores na linha sendo editada. *: salta a linha. Imprime os caracteres que pertencem linha sendo editada, iniciando uma nova linha de impresso a partir do caractere imediatamente seguinte ao caractere salta-linha. Ex: DCC*UFMG.* DCC UFMG. Vamos escrever um Editor de Texto (ET) que aceite os trs comandos descritos acima. O ET dever ler um caractere de cada vez do texto de entrada e produzir a impresso linha a linha, cada linha contendo no mximo 70 caracteres de impresso. O ET dever utilizar o tipo abstrato de dados Pilha denido anteriormente, implementado por meio de arranjo.

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.2.2

37

Sugesto de Texto para Testar o ETEste et# um teste para o ET, o extraterrestre em PASCAL.*Acabamos de testar a capacidade de o ET saltar de linha, utilizando seus poderes extras (cuidado, pois agora vamos estourar a capacidade mxima da linha de impresso, que de 70 caracteres.)*O k#cut#rso dh#e Estruturas de Dados et# h#um cuu#rsh#o #x# x?*!#?!#+.* Como et# bom n#nt#ao### r#ess#tt#ar mb#aa#triz#cull#ado nn#x#ele!\ Sera que este funciona\\\? O sinal? no### deve car! ~

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.2.2

38

ET - Implementao Este programa utiliza um tipo abstrato de dados sem conhecer detalhes de sua implementao. A implementao do TAD Pilha que utiliza arranjo pode ser substituda pela que utiliza apontadores sem causar impacto no programa.#define MAXTAM 70 #define CANCELACARATER # #define CANCELALINHA \ \ #define SALTALINHA #define MARCAEOF ~ typedef char TipoChave; / Entram aqui os tipos da transparncia 30 / var Pilha : TipoPilha ; x : TipoItem ; / Entram aqui os operadores da transparncia 31 / / Entra aqui o procedimento Imprime ( transp . 40 ) /

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.2.2

39

ET - Implementaoint main( int argc , char argv [ ] ) { TipoPilha Pilha ; TipoItem x ; FPVazia(&Pilha ) ; x .Chave = getchar ( ) ; i f ( x .Chave == \n ) x .Chave = ; while ( x .Chave ! = MARCAEOF) { i f ( x .Chave == CANCELACARATER) { i f ( ! Vazia( Pilha ) ) Desempilha(&Pilha , &x ) ; } else i f ( x .Chave == CANCELALINHA ) FPVazia(&Pilha ) ; else i f ( x .Chave == SALTALINHA ) Imprime(&Pilha ) ; else { i f (Tamanho( Pilha ) == MAXTAM ) Imprime(&Pilha ) ; Empilha(x, &Pilha ) ; } x .Chave = getchar ( ) ; i f ( x .Chave == \n ) x .Chave = ; } i f ( ! Vazia( Pilha ) ) Imprime(&Pilha ) ; return 0; }

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.2.2

40

ET - Implementao (Procedimento Imprime)void Imprime( TipoPilha Pilha ) { TipoPilha Pilhaux ; TipoItem x ; FPVazia(&Pilhaux ) ; while ( ! Vazia(Pilha ) ) { Desempilha( Pilha , &x ) ; Empilha(x, &Pilhaux ) ; } while ( ! Vazia(Pilhaux ) ) { Desempilha(&Pilhaux, &x ) ; putchar(x .Chave) ; } putchar( \n ) ; }

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3

41

Fila uma lista linear em que todas as inseres so realizadas em um extremo da lista, e todas as retiradas e, geralmente, os acessos so realizados no outro extremo da lista. O modelo intuitivo de uma la o de uma la de espera em que as pessoas no incio da la so servidas primeiro e as pessoas que chegam entram no m da la. So chamadas listas fo (rst-in, rst-out). Existe uma ordem linear para las que a ordem de chegada. So utilizadas quando desejamos processar itens de acordo com a ordem primeiro-que-chega, primeiro-atendido. Sistemas operacionais utilizam las para regular a ordem na qual tarefas devem receber processamento e recursos devem ser alocados a processos.

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3

42

TAD Filas Conjunto de operaes: 1. FFVazia(Fila). Faz a la car vazia. 2. Enleira(x, Fila). Insere o item x no nal da la. 3. Desenleira(Fila, x). Retorna o item x no incio da la, retirando-o da la. 4. Vazia(Fila). Esta funo retorna true se a la est vazia; seno retorna false.

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3.1

43

Implementao de Filas por meio de Arranjos Os itens so armazenados em posies contguas de memria. A operao Enleira faz a parte de trs da la expandir-se. A operao Desenleira faz a parte da frente da la contrair-se. A la tende a caminhar pela memria do computador, ocupando espao na parte de trs e descartando espao na parte da frente. Com poucas inseres e retiradas, a la vai ao encontro do limite do espao da memria alocado para ela. Soluo: imaginar o array como um crculo. A primeira posio segue a ltima.n ... 1 2 3 4 Tras 8 7 6 5 Frente

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3.1

44

Implementao de Filas por meio de Arranjosn ... 1 2 3 4 Tras 8 7 6 5 Frente

A la se encontra em posies contguas de memria, em alguma posio do crculo, delimitada pelos apontadores Frente e Trs. Para enleirar, basta mover o apontador Trs uma posio no sentido horrio. Para desenleirar, basta mover o apontador Frente uma posio no sentido horrio.

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3.1

45

Estrutura da Fila Usando Arranjo O tamanho do array circular denido pela constante MaxTam. Os outros campos do registro TipoPilha contm apontadores para a parte da frente e de trs da la.#define MAXTAM 1000 typedef int TipoApontador; typedef int TipoChave; typedef struct { TipoChave Chave; / outros componentes / } TipoItem ; typedef struct { TipoItem Item [ MAXTAM ] ; TipoApontador Frente , Tras; } TipoFila ;

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3.1

46

Operaes sobre Filas Usando Arranjos Nos casos de la cheia e la vazia, os apontadores Frente e Trs apontam para a mesma posio do crculo. Uma sada para distinguir as duas situaes deixar uma posio vazia no array. Nesse caso, a la est cheia quando Trs+1 for igual a Frente.void FFVazia( TipoFila Fila ) { Fila>Frente = 1; Fila>Tras = Fila>Frente ; } int Vazia( TipoFila Fila ) { return ( Fila . Frente == Fila .Tras ) ; }

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3.1

47

Operaes sobre Filas Usando Arranjos A implementao utiliza aritmtica modular nos procedimentos Enleira e Desenleira (funo mod do Pascal).void Enfileira (TipoItem x , TipoFila Fila ) { i f ( Fila>Tras % MAXTAM + 1 == Fila>Frente) p r i n t f ( " Erro f i l a est a cheia \n" ) ; else { Fila>Item [ Fila>Tras 1] = x ; Fila>Tras = Fila>Tras % MAXTAM + 1; } } void Desenfileira ( TipoFila Fila , TipoItem Item) { i f ( Vazia( Fila ) ) p r i n t f ( "Erro f i l a esta vazia \n" ) ; else { Item = Fila>Item [ Fila>Frente 1]; Fila>Frente = Fila>Frente % MAXTAM + 1; } }

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3.2

48

Implementao de Filas por meio de Apontadores H uma clula cabea para facilitar a implementao das operaes Enleira e Desenleira quando a la est vazia. Quando a la est vazia, os apontadores Frente e Trs apontam para a clula cabea. Para enleirar um novo item, basta criar uma clula nova, lig-la aps a clula que contm xn e colocar nela o novo item. Para desenleirar o item x1 , basta desligar a clula cabea da lista e a clula que contm x1 passa a ser a clula cabea. T E

x1

E

E

xnT

E nil

Frente

Trs

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3.2

49

Estrutura da Fila Usando Apontadores A la implementada por meio de clulas. Cada clula contm um item da la e um apontador para outra clula. O registro TipoFila contm um apontador para a frente da la (clula cabea) e um apontador para a parte de trs da la.typedef struct TipoCelula TipoApontador; typedef int TipoChave; typedef struct TipoItem { TipoChave Chave; / outros componentes / } TipoItem ; typedef struct TipoCelula { TipoItem Item ; TipoApontador Prox; } TipoCelula ; typedef struct TipoFila { TipoApontador Frente , Tras; } TipoFila ;

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3.2

50

Operaes sobre Filas Usando Apontadoresvoid FFVazia( TipoFila Fila ) { Fila>Frente = (TipoApontador ) malloc(sizeof(TipoCelula ) ) ; Fila>Tras = Fila>Frente ; Fila>Frente>Prox = NULL ; } int Vazia( TipoFila Fila ) { return ( Fila . Frente == Fila .Tras ) ; } void Enfileira (TipoItem x , TipoFila Fila ) { Fila>Tras>Prox = (TipoApontador ) malloc(sizeof(TipoCelula ) ) ; Fila>Tras = Fila>Tras>Prox; Fila>Tras>Item = x ; Fila>Tras>Prox = NULL ; }

Projeto de Algoritmos Cap.3 Estruturas de Dados Bsicas Seo 3.3.2

51

Operaes sobre Filas Usando Apontadoresvoid Desenfileira ( TipoFila Fila , TipoItem Item) { TipoApontador q; i f ( Vazia( Fila ) ) { p r i n t f ( "Erro f i l a esta vazia \n" ) ; return ; } q = Fila>Frente ; Fila>Frente = Fila>Frente>Prox; Item = Fila>Frente>Item ; free (q) ; }