This commit is contained in:
KleberSouza 2020-07-28 21:41:45 -03:00
parent c5981b2b7a
commit 3932d43f9b
9 changed files with 579 additions and 0 deletions

View File

@ -0,0 +1,32 @@
#ifndef CELULA_H
#define CELULA_H
//=============================================================================
#include <stdio.h>
#include <stdlib.h>
//=============================================================================
typedef struct Celula{
int elemento;
struct Celula *prox;
}Celula;
//=============================================================================
Celula* new_celula(int elemento){
Celula *temp = (Celula*)malloc(sizeof(Celula));
temp->elemento = elemento;
temp->prox = NULL;
return temp;
}
//=============================================================================
typedef struct CelulaDupla{
int elemento;
struct CelulaDupla *prox, *ant;
}CelulaDupla;
//=============================================================================
CelulaDupla* new_celula_dupla(int elemento){
CelulaDupla *temp = (CelulaDupla*)malloc(sizeof(CelulaDupla));
temp->elemento = elemento;
temp->ant = NULL;
temp->prox = NULL;
return temp;
}
//=============================================================================
#endif

View File

@ -0,0 +1,62 @@
#ifndef FILA_H
#define FILA_H
//=============================================================================
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <limits.h>
#include "celula.h"
//=============================================================================
typedef struct Fila{
struct Celula *primeiro, *ultimo;
int size;
} Fila;
//=============================================================================
Fila new_fila(){
Fila temp;
temp.primeiro = temp.ultimo = new_celula(-1);
temp.size = 0;
return temp;
}
//=============================================================================
int size_fila(Fila *f){
return f->size;
}
//=============================================================================
void enqueue_fila(Fila *f, int elemento){
f->ultimo->prox = new_celula(elemento);
f->ultimo = f->ultimo->prox;
f->size++;
}
//=============================================================================
int dequeue_fila(Fila *f){
if (f->primeiro == f->ultimo){
printf("\nA fila esta vazia!\n");
return INT_MIN;
}
Celula *temp = f->primeiro;
f->primeiro = f->primeiro->prox;
f->size--;
free(temp);
return f->primeiro->elemento;
}
//=============================================================================
void print_fila(Fila *f){
Celula *i;
printf("[");
for (i = f->primeiro->prox; i != NULL; i = i->prox)
{
printf("%d, ", i->elemento);
}
printf("] \n");
}
//=============================================================================
void delete_fila(Fila *f){
while(f->size > 0)
dequeue_fila(f);
free(f->primeiro);
}
//=============================================================================
#endif

View File

@ -0,0 +1,27 @@
#include "fila.h"
//=============================================================================
int main() {
Fila f;
int i, x1, x2, x3;
printf("==== FILA FLEXIVEL ====\n");
f = new_fila();
for(i=0; i < 10; i++)
enqueue_fila(&f, i);
printf("Apos inserrir os dados: \n");
print_fila(&f);
x1 = dequeue_fila(&f);
x2 = dequeue_fila(&f);
x3 = dequeue_fila(&f);
printf("Apos as remocoes (%d, %d, %d) \n", x1, x2, x3);
print_fila(&f);
delete_fila(&f);
return 0;
}

View File

@ -0,0 +1,123 @@
#ifndef LISTA_H
#define LISTA_H
//=============================================================================
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <limits.h>
#include "celula.h"
//=============================================================================
typedef struct Lista{
struct Celula *primeiro, *ultimo;
int size;
} Lista;
//=============================================================================
Lista new_lista(){
Lista temp;
temp.primeiro = temp.ultimo = new_celula(-1);
temp.size = 0;
return temp;
}
//=============================================================================
int size_lista(Lista *l){
return l->size;
}
//=============================================================================
void insert_begin(Lista *l, int elemento){
Celula *temp = new_celula(-1);
temp->prox = l->primeiro;
l->primeiro->elemento = elemento;
l->primeiro = temp;
l->size++;
}
//=============================================================================
void insert_end(Lista *l, int elemento){
l->ultimo->prox = new_celula(elemento);
l->ultimo = l->ultimo->prox;
l->size++;
}
//=============================================================================
void insert_at(Lista *l, int elemento, int pos){
if(pos < 0 || pos > l->size)
printf("Erro ao tentar inserir na posicao (%d/ tamanho = %d) invalida!", pos, l->size);
else if (pos == 0)
insert_begin(l, elemento);
else if (pos == l->size)
insert_end(l, elemento);
else{
Celula *ant = l->primeiro;
for(int i=0; i<pos;i++)
ant = ant->prox;
Celula *temp = new_celula(elemento);
temp->prox = ant->prox;
ant->prox = temp;
l->size++;
}
}
//=============================================================================
int remove_at(Lista *l, int pos){
if(l->primeiro == l->ultimo){
printf("\nA lista esta vazia!\n");
return INT_MIN;
}else if(pos < 0 || pos > l->size-1)
printf("Erro ao tentar remover item da posicao (%d/ tamanho = %d) invalida!", pos, l->size);
else{
Celula *ant = l->primeiro;
for(int i=0; i<pos;i++)
ant = ant->prox;
Celula *temp = ant->prox;
int elemento = temp->elemento;
ant->prox = temp->prox;
free(temp);
if(pos == l->size-1)
l->ultimo = ant;
l->size--;
return elemento;
}
}
//=============================================================================
int remove_begin(Lista *l){
return remove_at(l, 0);
}
//=============================================================================
int remove_end(Lista *l){
return remove_at(l, l->size-1);
}
//=============================================================================
bool pesquisar_lista(Lista *l, int elemento){
Celula *i;
for (i = l->primeiro->prox; i != NULL; i = i->prox)
if(i->elemento == elemento)
return true;
return false;
}
//=============================================================================
void print_lista(Lista *l){
Celula *i;
printf("[");
for (i = l->primeiro->prox; i != NULL; i = i->prox)
{
printf("%d, ", i->elemento);
}
printf("] \n");
}
//=============================================================================
void delete_lista(Lista *l){
while(l->size > 0)
remove_at(l,0);
free(l->primeiro);
}
//=============================================================================
#endif

View File

@ -0,0 +1,152 @@
#ifndef LISTADUPLA_H
#define LISTADUPLA_H
//=============================================================================
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <limits.h>
#include "celula.h"
//=============================================================================
typedef struct ListaDupla{
struct CelulaDupla *primeiro, *ultimo;
int size;
} ListaDupla;
//=============================================================================
ListaDupla new_lista_dupla(){
ListaDupla temp;
temp.primeiro = temp.ultimo = new_celula_dupla(-1);
temp.size = 0;
return temp;
}
//=============================================================================
int size_lista_dupla(ListaDupla *l){
return l->size;
}
//=============================================================================
void insert_begin_dupla(ListaDupla *l, int elemento){
CelulaDupla *temp = new_celula_dupla(-1);
temp->prox = l->primeiro;
l->primeiro->elemento = elemento;
l->primeiro->ant = temp;
l->primeiro = temp;
l->size++;
}
//=============================================================================
void insert_end_dupla(ListaDupla *l, int elemento){
l->ultimo->prox = new_celula_dupla(elemento);
l->ultimo->prox->ant = l->ultimo;
l->ultimo = l->ultimo->prox;
l->size++;
}
//=============================================================================
void insert_at_dupla(ListaDupla *l, int elemento, int pos){
if(pos < 0 || pos > l->size)
printf("Erro ao tentar inserir na posicao (%d/ tamanho = %d) invalida!", pos, l->size);
else if (pos == 0)
insert_begin_dupla(l, elemento);
else if (pos == l->size)
insert_end_dupla(l, elemento);
else{
CelulaDupla *ant = l->primeiro;
for(int i=0; i<pos;i++)
ant = ant->prox;
CelulaDupla *temp = new_celula_dupla(elemento);
temp->prox = ant->prox;
temp->prox->ant = temp;
temp->ant = ant;
ant->prox = temp;
l->size++;
}
}
//=============================================================================
int remove_end_dupla(ListaDupla *l){
if(l->primeiro == l->ultimo){
printf("\nA lista esta vazia!\n");
return INT_MIN;
}
CelulaDupla *temp = l->ultimo;
int elemento = temp->elemento;
l->ultimo = l->ultimo->ant;
l->ultimo->prox = NULL;
l->size--;
free(temp);
return elemento;
}
//=============================================================================
int remove_at_dupla(ListaDupla *l, int pos){
if(l->primeiro == l->ultimo){
printf("\nA lista esta vazia!\n");
return INT_MIN;
}else if(pos < 0 || pos > l->size-1)
printf("Erro ao tentar remover item da posicao (%d/ tamanho = %d) invalida!", pos, l->size);
else if(pos == l->size-1)
remove_end_dupla(l);
else{
CelulaDupla *ant = l->primeiro;
for(int i=0; i<pos;i++)
ant = ant->prox;
CelulaDupla *temp = ant->prox;
int elemento = temp->elemento;
temp->prox->ant = ant;
ant->prox = temp->prox;
free(temp);
l->size--;
return elemento;
}
}
//=============================================================================
int remove_begin_dupla(ListaDupla *l){
return remove_at_dupla(l, 0);
}
//=============================================================================
bool pesquisar_lista_dupla(ListaDupla *l, int elemento){
CelulaDupla *i;
for (i = l->primeiro->prox; i != NULL; i = i->prox)
if(i->elemento == elemento)
return true;
return false;
}
//=============================================================================
void print_lista_dupla(ListaDupla *l){
CelulaDupla *i;
printf("[");
for (i = l->primeiro->prox; i != NULL; i = i->prox)
{
printf("%d, ", i->elemento);
}
printf("] \n");
}
//=============================================================================
void print_lista_dupla_inverso(ListaDupla *l){
CelulaDupla *i;
printf("[");
for (i = l->ultimo; i != l->primeiro; i = i->ant)
{
printf("%d, ", i->elemento);
}
printf("] \n");
}
//=============================================================================
void delete_lista_dupla(ListaDupla *l){
while(l->size > 0)
remove_at_dupla(l,0);
free(l->primeiro);
}
//=============================================================================
#endif

View File

@ -0,0 +1,51 @@
#include "lista_dupla.h"
//=============================================================================
int main() {
ListaDupla l;
int i, x1, x2, x3;
printf("==== LISTA FLEXIVEL ====\n");
l = new_lista_dupla();
for(i=0; i < 5; i++)
insert_end_dupla(&l, i);
printf("Apos inserir os dados: \n");
print_lista_dupla(&l);
print_lista_dupla_inverso(&l);
printf("Apos inserir no inicio: \n");
insert_begin_dupla(&l, i++);
print_lista_dupla(&l);
print_lista_dupla_inverso(&l);
printf("Apos inserir no final: \n");
insert_end_dupla(&l, i++);
print_lista_dupla(&l);
print_lista_dupla_inverso(&l);
printf("Apos inserir na posicao 4: \n");
insert_at_dupla(&l, i++, 4);
print_lista_dupla(&l);
print_lista_dupla_inverso(&l);
printf("Apos remover no inicio: \n");
x1 = remove_begin_dupla(&l);
print_lista_dupla(&l);
print_lista_dupla_inverso(&l);
printf("Apos remover no final: \n");
x1 = remove_end_dupla(&l);
print_lista_dupla(&l);
print_lista_dupla_inverso(&l);
printf("Apos remover na posicao 2: \n");
x1 = remove_at_dupla(&l, 2);
print_lista_dupla(&l);
print_lista_dupla_inverso(&l);
delete_lista_dupla(&l);
return 0;
}

View File

@ -0,0 +1,44 @@
#include "lista.h"
//=============================================================================
int main() {
Lista l;
int i, x1, x2, x3;
printf("==== LISTA FLEXIVEL ====\n");
l = new_lista();
for(i=0; i < 5; i++)
insert_end(&l, i);
printf("Apos inserir os dados: \n");
print_lista(&l);
printf("Apos inserir no inicio: \n");
insert_begin(&l, i++);
print_lista(&l);
printf("Apos inserir no final: \n");
insert_end(&l, i++);
print_lista(&l);
printf("Apos inserir na posicao 4: \n");
insert_at(&l, i++, 4);
print_lista(&l);
printf("Apos remover no inicio: \n");
x1 = remove_begin(&l);
print_lista(&l);
printf("Apos remover no final: \n");
x1 = remove_end(&l);
print_lista(&l);
printf("Apos remover na posicao 2: \n");
x1 = remove_at(&l, 2);
print_lista(&l);
delete_lista(&l);
return 0;
}

View File

@ -0,0 +1,61 @@
#ifndef PILHA_H
#define PILHA_H
//=============================================================================
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <limits.h>
#include "celula.h"
//=============================================================================
typedef struct Pilha{
struct Celula *topo;
int size;
} Pilha;
//=============================================================================
Pilha new_pilha(){
Pilha temp;
temp.topo = NULL;
temp.size = 0;
return temp;
}
//=============================================================================
int size_pilha(Pilha *p){
return p->size;
}
//=============================================================================
void push_pilha(Pilha *p, int elemento){
Celula *temp = new_celula(elemento);
temp->prox = p->topo;
p->topo = temp;
p->size++;
}
//=============================================================================
int pop_pilha(Pilha *p){
if (p->topo == NULL){
printf("\nA pilha esta vazia!\n");
return INT_MIN;
}
int elemento = p->topo->elemento;
Celula *temp = p->topo;
p->topo = p->topo->prox;
p->size--;
free(temp);
return elemento;
}
//=============================================================================
void print_pilha(Pilha *p){
Celula *i;
printf("[");
for (i = p->topo; i != NULL; i = i->prox)
{
printf("%d, ", i->elemento);
}
printf("] \n");
}
//=============================================================================
void delete_pilha(Pilha *p){
while(p->size > 0)
pop_pilha(p);
}
//=============================================================================
#endif

View File

@ -0,0 +1,27 @@
#include "pilha.h"
//=============================================================================
int main() {
Pilha p;
int i, x1, x2, x3;
printf("==== PILHA FLEXIVEL ====\n");
p = new_pilha();
for(i=0; i < 10; i++)
push_pilha(&p, i);
printf("Apos inserrir os dados: \n");
print_pilha(&p);
x1 = pop_pilha(&p);
x2 = pop_pilha(&p);
x3 = pop_pilha(&p);
printf("Apos as remocoes (%d, %d, %d) \n", x1, x2, x3);
print_pilha(&p);
delete_pilha(&p);
return 0;
}