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

ias.php

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

#define MAIN_MODULE //define as variáveis e estruturas, e não apenas declara como extern

Computação 2. Aula 7. Profª. Fabiany Ponteiros

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

Métodos Computacionais. Listas Encadeadas

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 :