ENGENHARIA DE CONTROLE E AUTOMAÇÃO
ALGORITMOS E ESTRUTURAS DE DADOS II
Prof. Nivio Ziviani
Monitora: Claudine Santos Badue
Trabalho Prático 1
Comentários Gerais
O que deve ser apresentado:
Avaliação:
[Ziv93] Ziviani, Nivio, Projeto de Algoritmos Com Implementações em Pascal e C, Editora Pioneira, 1993.
Utilização de Listas Através de Apontadores
Retirado de [Ziv93, página 59, exercício 3]
Matrizes esparsas são matrizes nas quais a maioria das posições são preenchidas por zeros. Para estas matrizes, podemos economizar um espaço significativo de memória se apenas os termos diferentes de zero forem armazenados. As operações usuais sobre estas matrizes (somar, multiplicar, inverter, pivotar) também podem ser feitas em tempo muito menor se não armazenarmos as posições que contém zeros. Uma maneira eficiente de representar estruturas com tamanho variável e/ou desconhecido é através de alocação encadeada, utilizando listas. Vamos usar esta representação para armazenar as matrizes esparsas. Cada coluna da matriz será representada por uma lista linear circularListas!circulares com uma célula cabeça. Da mesma maneira, cada linha da matriz também será representada por uma lista linear circular com uma célula cabeça. Cada célula da estrutura, além das células-cabeça, representará os termos diferentes de zero da matriz e devem ter o seguinte tipo:
type Apontador = ^ TipoCelula; TipoCelula = record Direita, Abaixo : Apontador; Linha, Coluna : integer; Valor : real; end;O campo Abaixo deve ser usado para apontar o próximo elemento diferente de zero na mesma coluna. O campo Direita deve ser usado para apontar o próximo elemento diferente de zero na mesma linha. Dada uma matriz A, para um valor A(i,j) diferente de zero, deverá haver uma célula com o campo Valor contendo A(i,j), o campo Linha contendo i e o campo Coluna contendo j. Esta célula deverá pertencer à lista circular da linha i e também deverá pertencer à lista circular da coluna j. Ou seja, cada célula pertencerá a duas listas ao mesmo tempo. Para diferenciar as células cabeça, coloque -1 nos campos Linha e Coluna destas células. Considere a matriz esparsa seguinte
procedure Insere (i, j: integer; v: real; var A: Matriz);
para inserir o valor v na linha i,
coluna j da matriz A será útil
tanto na procedure LeMatriz quanto na procedure SomaMatriz.
As matrizes a serem lidas para testar os procedimentos são:
Os procedimentos deverão ser testados com o seguinte programa:
program TestaMatrizesEsparsas;![]()
begin
LeMatriz (A); ImprimeMatriz (A); LeMatriz (B); ImprimeMatriz (B); SomaMatriz (A, B, C); ImprimeMatriz (C); ApagaMatriz (C); MultiplicaMatriz (A, B, C); ImprimeMatriz (C); ApagaMatriz (B); ApagaMatriz (C); LeMatriz (B); ImprimeMatriz (A); ImprimeMatriz (B); SomaMatriz (A, B, C); ImprimeMatriz (C); MultiplicaMatriz (A, B, C); ImprimeMatriz (C); MultiplicaMatriz (B, B, C); ImprimeMatriz (B); ImprimeMatriz (B); ImprimeMatriz (C); ApagaMatriz (A); ApagaMatriz (B); ApagaMatriz (C);
end. { TestaMatrizesEsparsas }
É obrigatório o uso de alocação dinâmica de memória para implementar as listas de adjacência que representam as matrizes. A análise de complexidade deve ser feita em função de m, n (dimensões da matriz) e r (número de elementos diferente de zero).
Nivio Ziviani