You are on page 1of 6

// Modelo matemtico das estruturas de dados bsicas implementadas com vetores.

struct TipoItem { char nome[30]; }; const maxTam = 10; // cada item da lista corresponde a um // registro (TipoItem) composto apenas // do campo nome // tamanho mximo da lista

struct TipoLista { TipoItem Item[maxTam]; int Ultimo; }; struct TipoPilha { TipoItem Item[maxTam]; int Topo; }; struct TipoFila { TipoItem Item[maxTam]; int Frente; int Final; int Tamanho; }; // Modelo matemtico das estruturas de dados bsicas implementadas com ponteiros. struct TipoItem { char nome[30]; }; // cada item da lista corresponde a um // registro (TipoItem) composto apenas // do campo nome // define o tipo "Apontador" como sendo o // endereo de uma "Celula"

typedef struct Celula *Apontador; struct Celula { TipoItem Item; Apontador prox; }; struct TipoLista { Apontador Primeiro; Apontador Ultimo; }; struct TipoPilha { Apontador Topo; };

struct TipoFila { Apontador Frente; Apontador Final; int Tamanho; }; // Operaes realizadas no tipo Lista Linear implementada atravs de vetor. // Faz a 'Lista' ficar vazia void FazListaVazia(TipoLista *Lista) { Lista->Ultimo = -1; } // Esta funo retorna 1 (true) se a Lista est vazia; seno retorna 0 (false) int ListaVazia(TipoLista *Lista) { return(Lista->Ultimo == -1); } // Imprime os itens da 'Lista' void Imprime(TipoLista *Lista) { clrscr(); for (int i=0; i<=Lista->Ultimo; i++)

printf("%d- %s\n", i, Lista->Item[i].nome); } // Insere o item 'x' na final da 'Lista'. int Insere(TipoItem x, TipoLista *Lista) { if (Lista->Ultimo == (maxTam - 1)) return(0); // Erro: Lista Cheia ! else { Lista->Ultimo = Lista->Ultimo + 1; Lista->Item[Lista->Ultimo] = x; // item inserido no final da lista return(1); // Item inserido com sucesso } } // Retira o item x que est na posio p da Lista int Retira(int p, TipoLista *Lista, TipoItem *x) { if ((ListaVazia(Lista)) || (p < 0) || (p > Lista->Ultimo)) return(0); // Erro: Lista vazia ou posio no existe. else { *x = Lista->Item[p]; // item retornado // Desloca os itens a partir da posio p+1 para as posies anteriores for (int i=p; i<=(Lista->Ultimo-1); i++) Lista->Item[i] = Lista->Item[i+1]; Lista->Ultimo = Lista->Ultimo - 1; return(1); // Item retirado com sucesso } } // Operaes realizadas no tipo Lista Linear implementada atravs de ponteiros. // Faz a 'Lista' ficar vazia (cria a clula cabea) void FazListaVazia(TipoLista *Lista) { Lista->Primeiro = (Apontador) malloc(sizeof(Celula)); Lista->Primeiro->prox = NULL; Lista->Ultimo = Lista->Primeiro; } // Esta funo retorna 1 (true) se a Lista est vazia; seno retorna 0 (false) int ListaVazia(TipoLista *Lista) { return(Lista->Primeiro == Lista->Ultimo); } // Imprime os itens da 'Lista' void Imprime(TipoLista *Lista) { clrscr(); int i = 1; Apontador p = Lista->Primeiro->prox; // posiciona no incio da lista while (p != NULL) { printf("%d- %s\n", i, p->Item.nome); i = i + 1; p = p->prox; // avana para a prxima clula da lista } } // Insere o item 'x' no final da 'Lista' void Insere(TipoItem x, TipoLista *Lista) { Lista->Ultimo->prox = (Apontador) malloc(sizeof(Celula)); Lista->Ultimo = Lista->Ultimo->prox; Lista->Ultimo->Item = x; Lista->Ultimo->prox = NULL; } // Retira o item x que eh o seguinte ao apontador por p int Retira(Apontador p, TipoLista *Lista, TipoItem *x) { if ((ListaVazia(Lista)) || (p == NULL) || (p->prox == NULL)) return(0); // Erro: Lista vazia ou posio no existe. else { Apontador q = p->prox;

//

*x = q->Item; // item retornado p->prox = q->prox; se retirando a ltima clula da lista if (p->prox == NULL) Lista->Ultimo = p; free(q); // libera a memria ocupada pelo item retirado return(1); // Item retirado com sucesso

} } // Operaes realizadas no tipo Pilha implementada atravs de vetor. // Faz a 'Pilha' ficar vazia void FazPilhaVazia(TipoPilha *Pilha) { Pilha->Topo = -1; } // Esta funo retorna 1 (true) se a Pilha est vazia; seno retorna 0 (false) int PilhaVazia(TipoPilha *Pilha) { return(Pilha->Topo == -1); } // Insere o item 'x' no 'Topo' da 'Pilha'. int Empilha(TipoItem x, TipoPilha *Pilha) { if (Pilha->Topo == (maxTam - 1)) return(0); // Erro: Pilha Cheia ! else { Pilha->Topo = Pilha->Topo + 1; Pilha->Item[Pilha->Topo] = x; // item inserido no topo da pilha return(1); // Item inserido com sucesso } } // Retira o item x que est no topo da Pilha int Desempilha(TipoPilha *Pilha, TipoItem *x) { if (PilhaVazia(Pilha)) return(0); // Erro: Pilha vazia. else { *x = Pilha->Item[Pilha->Topo]; // item retornado Pilha->Topo = Pilha->Topo - 1; return(1); // Item retirado com sucesso } } void ImprimePilha(TipoPilha *Pilha) { TipoItem x; TipoPilha PilhaAux; FazPilhaVazia(&PilhaAux); clrscr(); while (!PilhaVazia(Pilha)) { Desempilha(Pilha, &x); printf("%s\n", x.nome); Empilha(x, &PilhaAux); // salva os itens desempilhados da 'Pilha' } // na 'PilhaAux' // retorna o itens para a pilha original (Pilha) while (!PilhaVazia(&PilhaAux)) { Desempilha(&PilhaAux, &x); Empilha(x, Pilha); } } // Operaes realizadas no tipo Pilha implementada atravs de ponteiros. // Faz a 'Pilha' ficar vazia criando a clula cabea void FazPilhaVazia(TipoPilha *Pilha) { Pilha->Topo = (Apontador) malloc(sizeof(Celula)); Pilha->Topo->prox = NULL; }

// Esta funo retorna 1 (true) se a Pilha est vazia; seno retorna 0 (false) int PilhaVazia(TipoPilha *Pilha) { return(Pilha->Topo->prox == NULL); } // Insere o item 'x' no 'Topo' da 'Pilha'. void Empilha(TipoItem x, TipoPilha *Pilha) { Apontador p; p = (Apontador) malloc(sizeof(Celula)); // cria uma nova clula cabea Pilha->Topo->Item = x; // coloca o item "x" na antiga clula cabea // atualiza o topo da pilha p->prox = Pilha->Topo; Pilha->Topo = p; } // Retira o item x que est no topo da Pilha int Desempilha(TipoPilha *Pilha, TipoItem *x) { if (PilhaVazia(Pilha)) return(0); // Erro: Pilha vazia. else { Apontador p; p = Pilha->Topo; Pilha->Topo = Pilha->Topo->prox; *x = Pilha->Topo->Item; // item retornado free(p); return(1); // Item retirado com sucesso } } void ImprimePilha(TipoPilha *Pilha) { TipoItem x; TipoPilha PilhaAux; FazPilhaVazia(&PilhaAux); clrscr(); while (!PilhaVazia(Pilha)) { Desempilha(Pilha, &x); printf("%s\n", x.nome); Empilha(x, &PilhaAux); // salva os itens desempilhados da 'Pilha' } // na 'PilhaAux' // retorna o itens para a pilha original (Pilha) while (!PilhaVazia(&PilhaAux)) { Desempilha(&PilhaAux, &x); Empilha(x, Pilha); } } // Operaes realizadas no tipo Fila implementada atravs de vetor. // Faz a 'Fila' ficar vazia void FazFilaVazia(TipoFila *Fila) { Fila->Frente = 0; Fila->Final = 0; Fila->Tamanho = 0; } // Esta funo retorna 1 (true) se a Fila est vazia; seno retorna 0 (false) int FilaVazia(TipoFila *Fila) { return(Fila->Tamanho == 0); } // Insere o item 'x' no 'Final' da 'Fila'. int Enfileira(TipoItem x, TipoFila *Fila) { if (Fila->Tamanho == maxTam) return(0); // Erro: Fila Cheia ! else { Fila->Item[Fila->Final] = x; // item inserido no final da fila

Fila->Final = Fila->Final + 1; // se ltima posio ento volta para a primeira posio do vetor (vetor circular) if (Fila->Final == maxTam) Fila->Final = 0; Fila->Tamanho = Fila->Tamanho + 1; return(1); // Item inserido com sucesso } } // Retira o item x que est na frente da Fila int Desenfileira(TipoFila *Fila, TipoItem *x) { if (FilaVazia(Fila)) return(0); // Erro: Fila vazia. else { *x = Fila->Item[Fila->Frente]; // item retornado Fila->Frente = Fila->Frente + 1; // se ltima posio ento volta para a primeira posio do vetor (vetor circular) if (Fila->Frente == maxTam) Fila->Frente = 0; Fila->Tamanho = Fila->Tamanho - 1; return(1); // Item retirado com sucesso } } // imprime os itens da fila obedecendo a ordem de chegada void ImprimeFila(TipoFila *Fila) { TipoItem x; clrscr(); for (int i=1; i<=Fila->Tamanho; i++) { Desenfileira(Fila, &x); printf("%s\n", x.nome); Enfileira(x, Fila); } } // Operaes realizadas no tipo Fila implementada atravs de ponteiros. // Faz a 'Fila' ficar vazia criando a clula cabea void FazFilaVazia(TipoFila *Fila) { Fila->Frente = (Apontador) malloc(sizeof(Celula)); Fila->Final = Fila->Frente; Fila->Frente->prox = NULL; Fila->Tamanho = 0; } // Esta funo retorna 1 (true) se a Fila est vazia; seno retorna 0 (false) int FilaVazia(TipoFila *Fila) { return(Fila->Tamanho == 0); } // Insere o item 'x' no 'Final' da 'Fila'. void Enfileira(TipoItem x, TipoFila *Fila) { Fila->Final->prox = (Apontador) malloc(sizeof(Celula)); Fila->Final = Fila->Final->prox; Fila->Final->Item = x; Fila->Final->prox = NULL; Fila->Tamanho = Fila->Tamanho + 1; } // Retira o item x que est na frente da Fila int Desenfileira(TipoFila *Fila, TipoItem *x) { if (FilaVazia(Fila)) return(0); // Erro: Fila vazia. else { Apontador p; p = Fila->Frente; Fila->Frente = Fila->Frente->prox; *x = Fila->Frente->Item; // item retornado

free(p); Fila->Tamanho = Fila->Tamanho - 1; return(1); // Item retirado com sucesso } } // imprime os itens da fila obedecendo a ordem de chegada void ImprimeFila(TipoFila *Fila) { TipoItem x; clrscr(); for (int i=1; i<=Fila->Tamanho; i++) { Desenfileira(Fila, &x); printf("%s\n", x.nome); Enfileira(x, Fila); } }

You might also like