UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA Bacharelado em Ciência da Computação / Engenharia da Computação INF 01203 – Estruturas de Dados Professores: Renata de Matos Galante Exercícios – Parte II Listas Duplamente Encadeadas 01. As funções apresentadas a seguir exibem todos os elementos de uma lista duplamente encadeada. • Qual a diferença entre as duas funções? • Preencha os pontos de interrogação com as atualizações corretas para os ponteiros. Proc ImprimirLL (PtLista: TipoPtnodo); var PtAux : TipoPtnodo; início se PtLista = nil então escreva ( ´Lista vazia ! ´) senão início PtAux := PtLista; Enquanto PtAux↑.Prox ≠ nil faça begin escreva ( PtAux↑.Info ); PtAux:= ????; Fim fim; Proc ImprimirLL (PtLista: TipoPtnodo); var PtAux : TipoPtnodo; se PtLista = nil então escreva ( ´Lista vazia ! ´) senão início PtAux := PtLista; Enquanto PtAux↑.Prox ≠ nil faça PtAux:=PtAux↑.Prox; Enquanto PtAux ≠ PtLista faça início escreva ( PtAux↑.Info ); PtAux := ????; fim; escreva (PtAux ↑. Info ) fim; 02. O algoritmo a seguir insere o primeiro elemento de uma Lista Duplamente Encadeada. Preencha os pontos de interrogação com as atualizações corretas para os ponteiros. Proc InserirInicio (var PtLista: TipoPtnodo: Dados: TipoInfonodo); var Pt, PtAux: TipoPtnodo; início alocar (Pt); Pt ↑. Info := Dados; se PtLista = nil então início PtLista := ????; Pt ↑.Ant := ????; Pt ↑.Prox := ????; Fim fim; 03. O algoritmo a seguir insere um elemento ou no início ou no final de uma Lista Duplamente Encadeada. Preencha os pontos de interrogação com as atualizações corretas para os ponteiros. Proc InserirnodoFinal (var PtLista: TipoPtnodo: Dados: TipoInfonodo); var Pt, PtAux: TipoPtnodo; início alocar (Pt); Pt ↑ . Info := Dados; se PtLista = nil então início PtLista := ????;; Pt ↑ . Ant := ????; Pt ↑ . Prox := ????; fim senão início PtAux := PtLista; enquanto PtAux ↑ . Prox ≠ nil faça PtAux := PtAux ↑ . Prox; PtAux ↑ . Prox := ????; Pt ↑ . Ant := ????; Pt ↑ . Prox := ????; fim fim InserirnodoFinal; 04. O algoritmo a seguir insere um elemento no meio de uma Lista Duplamente Encadeada. Preencha os pontos de interrogação com as atualizações corretas para os ponteiros. Proc Acessa_ll (Lista: ptr; K:inteiro; var pt_anterior, pt_procura: ptr); { ptr: tipo que aponta para nodo } { pt_procura retorna o endereço do k-ésimo nodo } { pt_anterior retorna o endereço do (k-1)-ésimo nodo } início pt_procura := Lista; pt_anterior := nil; enquanto pt_procura <> nil e K > 1 faça início K := K - 1; pt_anterior := pt_procura; pt_procura := pt_procura ↑ . Elo fim; se K > 1 { a lista terminou antes do k-ésimo nodo } então pt_anterior := pt_procura := nil; fim; Proc Insere_ll (var Lista: ptr; K: inteiro; Inf: string;Sucesso: lógico); var pt_anterior, pt_anterior, Novo: ptr; ínicio Acessa_ll (Lista, K, pt_anterior, pt_procura); se pt_procura <> nil ou pt_anterior <> nil ou K = 1 então início sucesso := verdadeiro; alocar (Novo); Novo ↑ . Info := Inf; ????; ????; ????; ????; senão Sucesso := falso fim; 05. O que faz cada um dos trechos de código apresentados a seguir. Ele seria útil para uma lista circular? Justifique sua resposta. Type tpont = ^ trec; trec = record info:T; ant, pos: tpont; End; Lista = tpont; Var pont: Lista; Procedure Insere1(pont:lista; x:T); Var j: Lista; Begin new(j); j^.info:=x; j^.pos:=pont^.pos; j^.pos^.ant:=j; j^.ant:=pont; pont^.pos:=j; End; Procedure Insere2(pont:Lista; x:T); Var j: Lista; Begin new(j); j^.info:=x; j^.pos:=pont; j^.ant:=pont^.ant; j^.ant^.pos:=j; pont^.ant:=j; End; 06. Analise o trecho de código apresentado a seguir, considerando: • o que faz o procedimento; • qual deveria ser o critério de ordenamento da lista; • qual seria o resultado para uma lista não-circular? • qual seria o resultado para uma lista circular? Considere a mesma estrutura de dados especificada no exercício 3. Function Busca(ptlista: Lista; x: T):Lista; Var pont, ultimo: Lista; Begin ultimo:=ptlista^.ant; If x<=ultimo^.info then Begin pont:=ptlista; While pont^.info < x do pont:=pont^.pos; Busca:=pont; End Else Busca:=ptlista; End;