struct LISTA item quant



Documentos relacionados
2ª Lista de Exercícios

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

Trabalho 3: Agenda de Tarefas

Estrutura de Dados. Introdução a Ponteiros. Prof. Gerson Borges Estrutura de Dados I 1

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

10. Listas Encadeadas

INF 1620 P1-10/04/02 Questão 1 Nome:

Estruturas de Dados Aula 11: TAD Pilha 09/05/2011

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Busca. Pesquisa sequencial

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

INF 1007 Programação II

Listas (Parte 2) Túlio Toffolo BCC202 Aula 10 Algoritmos e Estruturas de Dados I

Aula 3 Alocação Dinâmica

Pesquisa Sequencial e Binária

/*(Atenção: Em se tratando de uma lista estaticamente alocada, temos utilizado a estratégia de passa o tamanho máximo do vetor.)*/

Métodos Computacionais. Fila

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

17 - Funções e Procedimentos em C Programação Modular

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

Figura 13.1: Um exemplo de árvore de diretório.

Algoritmos e Estruturas de dados

Manipulação de Arquivos

Aula 1 Tipo Abstrato de Dados

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

Introdução. Manipulação de arquivos em C. Estrutura de Dados II Prof Jairo Francisco de Souza

Programas operam sobre dados. Dados são relacionados e possuem estrutura. Como representar e manipular dados em um computador

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados I

Árvores Binárias - continuação

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

PROVA P2 INF /10/2014 Programação II

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Exercício 1. Tabela 1: Cadastro de usuários, senhas e privilégios (exemplo). Login Senha Privilégio Armamento

O que é um algoritmo? O que é um programa? Algoritmos. Programas. Aula 1 Tipo Abstrato de Dados

Linguagem C: Árvores Binarias

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti

Introdução à Programação. Armazenamento de Grande Quantidade de Informação Usando Vetores

DAS5102 Fundamentos da Estrutura da Informação

Métodos Computacionais. Árvores

Resumo da Introdução de Prática de Programação com C. A Linguagem C

Estruturas (Registros)

Estruturas de Dados Aula 15: Árvores 17/05/2011

MC-102 Aula 17 Strings e Matrizes

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

INF 1620 P2-01/11/03 Questão 1 Nome:

Algoritmos e Programação Estruturada

Fundamentos de Programação

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

Computação I - C Prova /10/ Profs. Adriano Cruz e Valeria Bastos

PIP/CA - Programa Interdisciplinar de Pós-Graduação em Computação Aplicada da UNISINOS ALGORITMOS & ESTRUTURAS DE DADOS

Capítulo 2: Introdução à Linguagem C

Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II

Tipo Abstrato de Dados

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

Árvores Binárias de Busca

Algoritmos e Programação

ALGORITMOS E ESTRUTURAS DE DADOS Terceiro Trabalho Prático Recursividade e Pilhas

Trabalho Prático 1 Revisão de Programação, Tipos Abstratos de Dados e Combinação de Alocação Estática e Dinâmica de Memória

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

float vantagem(float candidato[], float concorrente[], int n);

ESTRUTURAS DE DADOS AVANÇADAS (INF 1010) (a) Seja um TAD definido por uma lista circular implementada em um vetor.

Filas. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

INF 1005 Programação I

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 4

Curso de Linguagem C

INF 1007 Programação II

Neste artigo estudaremos os conceitos relacionados às matrizes unidimensionais (vetores) e multidimensionais.

Sumário. Armazenamento de dados. Tipos de dados dinâmicos. Exemplos. Vectores Vectores dinâmicos Dados dinamicos. Declaração Uso 10-1

EAD Árvore árvore binária

CIÊNCIA DA COMPUTAÇÃO PROVA PARA TRANSFERÊNCIA

Aula 06 - Funções. O que é uma Função - Comando return - Protótipos de Funções - Tipos de Funções - Escopo de Variáveis - Passagem de parâmetros

LISTAS ENCADEADAS OU NÃO- SEQÜENCIAIS. Estrutura de Dados

Registros. Técnicas de Programação. Rafael Silva Guimarães

-Estrutura linear de acesso seqüencial que ordena seus elementos pela seqüência cronológica de sua entrada;

A Pilha. Aula 02. DPEE 1038 Estrutura de Dados para Automação Curso de Engenharia de Controle e Automação Universidade Federal de Santa Maria

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Métodos Computacionais. Tipos Abstratos de Dados

INF 1005 Programação I

1ª versão. #include <stdio.h> #include <string.h> #include <stdlib.h> #define maxdiscos 1000

Estruturas de Dados. Alguns dados não costumam ser tão simples assim... Podem ser compostos por vários dados distintos

Introdução a POO. Introdução a Linguagem C++ e POO

Este trabalho tem como objetivo praticar o uso de tipos abstratos de dados e estruturas do tipo Lista.

Árvores Binárias de Busca

Pilhas. Profa Morganna Diniz

Árvore Binária de Busca

MC-102 Algoritmos e Programação de Computadores IC-UNICAMP. Aula 21 - Registros. Por: Luís Augusto Angelotti Meira (Sala IC-71) 1S2005

Técnicas de Programação I

Transcrição:

UNIVERSIDADE SÃO JUDAS TADEU ESTRUTURA DE DADOS - PROF. H. Senger IMPLEMENTAÇÃO DE LISTAS COM VETORES A implementação de listas utilizando vetores é simples. Existe apenas uma pequena questão, com relação ao tamanho da lista. Como sabemos, um vetor possui algumas características, como : seu tamanho deve ser declarado na fase de compilação do programa o tamanho fixo, e não pode ser alterado durante a execução do programa Apesar disso, a quantidade de elementos de uma lista pode variar, pois podemos acrescentar novos elementos a uma lista ou mesmo retirar elementos que já existam. Solução : Para resolver essa questão, pode-se usar as medidas a seguir : declarar um vetor grande o bastante, de modo que ( provavelmente ) nunca venha a faltar posições para o armazenamento de novos elementos; e ter uma variável que controla a quantidade "efetiva" de casas ocupadas do vetor Em termos práticos, teremos a seguinte estrutura de dados : struct LISTA item quant pode-se declarar o tamanho máximo do vetor : #define TAM 10 declarar o tipo de cada item da lista typedef char TIPO_ITEM; e finalmente, a estrutura de dados completa typedef struct TIPO_ITEM item[tam]; int quant; TIPO_LISTA;

Para declarar uma variável lista, pode-se proceder da seguinte forma : TIPO_LISTA L; isto é possível porque TIPO_LISTA foi declarado por meio de um typedef, o que faz com que este seja reconhecido como um identificador de tipo, assim como int, float ou char. IMPLEMENTAÇÃO : #include <stdio.h> #include <conio.h> #define TAM 10 // Quantidade m'axima de itens #define FALHA 0 #define SUCESSO 1 typedef char TIPO_ITEM; // define o tipo dos itens da lista typedef struct // cria um identificador de tipo para definir uma lista TIPO_ITEM item[tam]; int quant; TIPO_LISTA; /*-------------------------------------------------------------------------- VARIAVEIS GLOBAIS DO PROGRAMA --------------------------------------------------------------------------*/ TIPO_LISTAL; /*-------------------------------------------------------------------------- PROTOTIPOS DE FUNCOES --------------------------------------------------------------------------*/ void Inicializa ( TIPO_LISTA *p_l); int Insere ( TIPO_LISTA *p_l, TIPO_ITEM dado, int posicao ); int Remove ( TIPO_LISTA *p_l, TIPO_ITEM * p_dado, int posicao ); void Exibe ( TIPO_LISTA L ); main () TIPO_ITEM x; clrscr(); Inicializa (&L); /* a funcao main contem apenas uma sequencia de operacoes realizadas sobre a lista L, com a finalidade de testar a correteza das implementacoes das funcoes de manipulacao de listas */

if (Insere (&L,'A',1)) if (Insere (&L,'B',2)) if (Insere (&L,'C',3)) if (Insere (&L,'X',1)) if (Insere (&L,'Y',3)) if (Insere (&L,'Z',6)) if (Remove (&L,&x,2)) if (Remove (&L,&x,5)) if (Remove (&L,&x,5)) if (Remove (&L,&x,1)) return 0; Funcao : Inicializa Finalidade : esvaziar uma lista Entrada : *p_l -> endereco da lista Retorno : nenhum Observacoes : zera o valor do campo 'quant' da lista void Inicializa ( TIPO_LISTA *p_l) (*p_l).quant=0;

Funcao : Insere Finalidade : incluir um novo valor em uma determinada posicao da lista Entrada :*p_l -> endereco da lista a ser alterada dado -> dado a ser acrescentado posicao -> indica a posicao que o novo dado ira ocupar na lista Retorno : 'SUCESSO' ou 'FALHA' Observacoes : altera os campos 'item' e 'quant' da lista int Insere ( TIPO_LISTA *p_l, TIPO_ITEM dado, int posicao ) int i; if ((*p_l).quant == TAM ) return FALHA; // se a lista ja estiver cheia... else if ((posicao < 1) (posicao > (*p_l).quant + 1)) return FALHA; else for (i=(*p_l).quant; i >= posicao; i--) (*p_l).item[i] = (*p_l).item[i-1]; (*p_l).item[posicao-1] = dado; (*p_l).quant ++; return SUCESSO; Funcao : Remove Finalidade : retirar o valor de uma determinada posicao dentro da lista Entrada :*p_l -> endereco da lista *p_dado -> endereco da variavel que ira receber o valor que foi retirado da lista posicao -> indica a posicao de onde deve ser retirado o dado Retorno : 'SUCESSO' ou 'FALHA' Observacoes : altera os campos 'item' e 'quant' da lista int Remove ( TIPO_LISTA *p_l, TIPO_ITEM *p_dado, int posicao ) int i; if ((*p_l).quant == 0 ) return FALHA; else if ((posicao < 1) (posicao > (*p_l).quant)) return FALHA; else *p_dado = (*p_l).item[posicao-1]; for (i=posicao - 1; i < (*p_l).quant - 1; i++) (*p_l).item[i] = (*p_l).item[i+1]; (*p_l).quant --; return SUCESSO;

Funcao : Exibe Finalidade : exibir o conteudo de uma lista Entrada :L -> lista a ser exibida Retorno : nenhum Observacoes : void Exibe ( TIPO_LISTA L ) int i; printf("quant : %d Conteudo : ",L.quant); for(i=0; i<l.quant; i++) printf(" %c",l.item[i]); putchar('\n'); -x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x- Veja a seguir, a saída gerada por esse programa :

LISTAS LIGADAS É possível criar uma estrutura tal, capaz de armazenar um item de dado, e ainda, conter um endereço que indica o próximo elemento na seqüência. item prox typedef char TIPO_ITEM; Declaração de um nó da lista : struct NO ; TIPO_ITEM item; NO *prox; Assim, pode-se criar um encadeamento de nós com tal estrutura, onde cada nó contém um item da lista : L A G C E A variável L é um ponterio cuja função é determinar o início da lista, podendo ser declarada da seguinte forma : typedef struct NO *PONT; PONTL; Essa forma de declaração torna-se bastante útil na hora de implementar as funções de manipulação da lista. A criação de nós para o armazenamento de dados é feita da seguinte forma : p = (PONT) malloc(sizeof(struct NO)); p->item = 'R'; p->prox = L;

L = p; Assim, ter-se-ia o seguinte resultado : L R A G C E Vejamos um programa exemplo: #include <stdio.h> #include <conio.h> #include <stdlib.h> #define FALHA 0 #define SUCESSO 1 typedef char TIPO_ITEM; // define o tipo dos itens da lista struct NO ; TIPO_ITEM item; NO *prox; typedef struct NO *PONT; // cria o tipo ponteiro de NO /*-------------------------------------------------------------------------- VARIAVEIS GLOBAIS DO PROGRAMA --------------------------------------------------------------------------*/ PONTL; // ponteiro para o primeiro no de uma lista // Obs: vale NULL, se a lista nao tiver nenhum no /*-------------------------------------------------------------------------- PROTOTIPOS DE FUNCOES --------------------------------------------------------------------------*/ void Inicializa ( PONT *p_l); int Insere ( PONT *p_l, TIPO_ITEM dado ); int Remove ( PONT *p_l, TIPO_ITEM * p_dado ); void Exibe ( PONT L ); main () TIPO_ITEM x;

clrscr(); Inicializa (&L); /* a funcao main contem apenas uma sequencia de operacoes realizadas sobre a lista L, com a finalidade de testar a correteza das implementacoes das funcoes de manipulacao de listas */ if (Insere (&L,'A')) if (Insere (&L,'B')) if (Insere (&L,'C')) if (Insere (&L,'X')) if (Insere (&L,'Y')) if (Insere (&L,'Z')) if (Remove (&L,&x)) if (Remove (&L,&x)) if (Remove (&L,&x)) if (Remove (&L,&x)) return 0; Funcao : Inicializa Finalidade : esvaziar uma lista Entrada : *p_l -> endereco da lista Retorno : nenhum

Observacoes : zera o valor do campo 'quant' da lista void Inicializa ( PONT *p_l) *p_l = NULL; Funcao : Insere Finalidade : incluir um novo valor no inicio da lista Entrada : *p_l -> endereco do primeiro no da lista dado -> dado a ser acrescentado Retorno : 'SUCESSO' ou 'FALHA' Observacoes : int Insere ( PONT *p_l, TIPO_ITEM dado ) PONTaux; if (((aux = (PONT) malloc(sizeof(struct NO)))==NULL)) return FALHA; // se a lista ja estiver cheia... else aux->item = dado; aux->prox = *p_l; *p_l = aux; return SUCESSO; Funcao : Remove Finalidade : retirar o primeiro dado da lista Entrada : *p_l -> endereco da lista *p_dado -> endereco da variavel que ira receber o valor que foi retirado da lista Retorno : 'SUCESSO' ou 'FALHA' Observacoes : int Remove ( PONT *p_l, TIPO_ITEM *p_dado ) PONT aux; if ((*p_l)==null) return FALHA; else aux = *p_l; *p_l = aux->prox; *p_dado = aux->item; free (aux); return SUCESSO;

Funcao : Exibe Finalidade : exibir o conteudo de uma lista Entrada : L -> lista a ser exibida Retorno : nenhum Observacoes : void Exibe ( PONT L ) int i; printf("conteudo : "); while ( L!= NULL ) printf(" %c",l->item); L = L->prox; putchar('\n'); -x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x Tal programa gera a seguinte saída em tela :