Baixe o app para aproveitar ainda mais
Prévia do material em texto
Luan Trovo Furtile - 82680 Lucas Martins Sabadini - 80669 Marcilio Morihiro Açano - 81342 • Lista Circular Duplamente Encadeada • Matriz Esparsa • Lista Circular Duplamente Encadeada • Teoria..................................................................... 03 • Aplicações.............................................................. 04 • Algoritmo............................................................... 05 • Programa • Registro.......................................................... 06 • Inserir............................................................. 07 • Remover......................................................... 08 • Matriz Esparsa • Teoria..................................................................... 09 • Aplicações.............................................................. 10 • Algoritmo............................................................... 11 • Programa • Registro.......................................................... 12 • Inserir............................................................. 13 • Remover......................................................... 14 • Referências....................................................................... 15 • 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 • 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 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 • Registro struct lista{ int dados; struct lista *prox; struct lista *ant;}; struct lista *primeiro; struct lista *ultimo; 7 • Inserir void inserir(int x){ struct lista *aux; aux=(struct lista*)malloc(sizeof(struct lista)); aux->dados=x; ultimo->prox=aux; aux->ant=ultimo; aux->prox=NULL; ultimo=ultimo->prox; aux=NULL; free(aux);} 8 • Remover void remover (int x){ int teste=0; struct lista *aux; aux=primeiro; while(aux!=NULL){ if(aux->dados==x){ if(aux->prox==NULL){ printf(“Valor: %d\nRemovido! ",aux->dados); ultimo=ultimo->ant; ultimo->prox=NULL; free(aux); aux=NULL; teste=1;} else{ printf(“Valor: %d\nRemovido\n ",aux->dados); teste=1; aux->ant->prox=aux->prox; aux->prox->ant=aux->ant; free(aux); aux=NULL; } } else{ aux=aux->prox;}} if(teste==0){ printf(“Nenhum valor encontrado!\n"); } } • 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 • 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. • 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] #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 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 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 daprimeiraposiçã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; //removedaprimeira 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 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.
Compartilhar