Seminário sobre Lista Circular Duplamente Encadeada e Matriz Esparsa apresentado na disciplina de Estrutura de Dados do curso de Engenharia da Computação, do Centro Universitário de Votuporanga - UNIFEV.
3. • Lista consiste em uma estrutura que permite representar um conjunto de
dados mantendo a sua ordem;
• Não existe o conceito de “primeiro ou último”;
• Podem ser classificadas como: Estática e Dinâmica.
3
Anterior Valor Próximo
Estrutura de um Nó
4. 4
• Está presente na implementação de jogos;
• Representação de inteiros positivos grandes: consiste em
armazenar os dígitos da direita para a esquerda numa lista
circular (primeiro nó contém o dígito menos significativo, último
nó contém o dígito mais significativo).
5. 5
valor1 valor2 valor3
• Permite percorrer a lista nos dois sentidos;
• Facilita percorrer a lista em ordem inversa;
• Cada elemento guarda os endereços do próximo e do anterior.
6. 6
• Registro
struct lista{
int dados;
struct lista *prox;
struct lista *ant;};
struct lista *primeiro;
struct lista *ultimo;
9. • Uma matriz é dita esparsa quando a maioria de seus elementos
são iguais a zero.
Por exemplo:
• Podemos ver no exemplo acima que muito espaço na memória
seria economizado se apenas os elementos não nulos fossem
armazenados.
A =
9
10. 10
• Problemas de engenharia e física (por exemplo, o método das
malhas para resolução de circuitos elétricos ou sistemas de
equações lineares);
• Aplicação em computação: armazenamento de dados (planilhas
eletrônicas);
• A matriz esparsa é implementada através de um conjunto de
listas ligadas que apontam para elementos diferentes de zero.
De forma que os elementos que possuem valor zero não são
armazenados.
11. • Cada elemento não nulo é mantido simultaneamente em duas listas:
• Uma para sua linha
• Uma para sua coluna
A =
Linha Coluna Valor
ProxLinha ProxColuna
Estrutura de um Nó
Considere a seguinte matriz:
1 1 3
lin[1]
col[1]
1 3 2
2 1 -1lin[2]
lin[3]
3 3 5
col[2]
11
col[3]
12. #define m ... //número de linhas
#define n ... //número de colunas
typedef struct no {
int linha, coluna, valor;
struct no *proxlin, *proxcol;
} no;
typedef struct {
no *lin[m], *col[n];
} MatrizEsparsa;
• Registro
12
13. void inserir (int i, int j, int k, Rec *lin[], Rec *col[]){
Rec *p; //aponta registro criado
Rec *q, *qa; //ponteiros para percorrer listas
p = malloc(sizeof(Rec));
p->linha = i;
p->coluna = j;
p->valor = k;
//inserir na lista da coluna j
q = col[j];
qa = NULL;
while (q != NULL){
if (q->linha < i){
qa = q;
q = q->proxcol;
}
else{ //achou a coluna maior
if (qa = NULL) //inserir como primeiro da linha i
lin[i] = p;
else
qa->proxcol= p; //inserir entre qa e q
p-> proxcol = q;
break;
}
}
//inserir como último da lista lin
if (q == NULL);
if (qa == NULL)
lin[i] = p;
else //após qa
qa->proxcol= p;
}
• Inserir
13
14. boolean eliminar (int i, int j, Rec *lin[], Rec *col[]){
Rec *q, *qa;
//remove da lista da coluna j
q = col[j];
qa = NULL;
while (q != NULL){
if(q->linha <i){
qa = q;
q = q->proxlin;
}
else{ //achou a linha
if (qa == NULL)
//remove da primeiraposição da coluna j
col[j] = q->proxlin;
else //remove ligações para q
qa->proxlin = q->proxlin;
break;
} }
//se não achou elemento retorna False
if (q == NULL)
return false;
//remove da lista da linha i
q = lin[i];
qa = NULL;
while(q !=NULL){
if (q->coluna < j){
qa = q;
q = q->proxcol;
}
else{ //achou coluna
if (ga == NULL)
lin[i] = q->proxcol; //removeda primeira posição da linha
else //remove ligações paraq
qa->proxcol =q->proxcol;
break;
} }
//libera a posição apontada por q
return false;
}
• Remover
14
15. 15
TENENBAUM, A. M.; AUGENSTEIN, M. J.; LANGSAN, Y. Estruturas de
dados usando c. São Paulo: Makron Books do Brasil, 1995. 884p.
PEREIRA, S. D. L. Estruturas de dados fundamentais: conceitos e
aplicações. 5. ed. São Paulo: Erica, 2001. 238p.
SZWARCFITER, J. L.; MARKENZON, L. Estruturas de dados e seus
algoritmos. 2. ed. Rio de Janeiro: Ltc, 1994. 320p.
MIRANDA, Warlisson. Matrizes - Definição e exemplos. Disponível
em: <http://www.warlisson.com.br/teoria/matrizes-definicao-e-
exemplos>. Acesso em 27 ago. 2013.