Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Matheus Macedo_153065

Código Fila

Recommended Posts

estou tentando arrumar o meu codigo a dias e nao consigo.. alguem consegue identificar um problema?

nao sou muito bom com ponteiros.. acho que esta dando violacao de memoria!

 

#include <stdio.h>
#include <stdlib.h>

int tamanho;
typedef int elem;
typedef struct {
       int inicio, fim, total;
       elem *itens;
       } fila;

int cheia(fila *f);
int vazia(fila *f);
void create(fila *f);
void inserir(fila *f, int valor);
void retirar(fila *f, int valor);

int main () {
   fila *f;
   int valor, valor_dois;
   int ultimo_valor;

   printf("Total: ");
   scanf("%d", &tamanho);

   valor = 1;
   valor_dois = 2;
   while (tamanho >= 1) {
         retirar(f, valor);
         inserir(f, valor_dois);
         valor_dois = (valor_dois + 2);
         valor = (valor + 2);
         tamanho--;
   }
   ultimo_valor = f->inicio;
   printf("Carta final: %d", ultimo_valor);
}

// funcoes TAD
int cheia (fila *f) {
    if (f->total == tamanho) {
       return 1;
    }
    else {
         return 0;
    }
}

int vazia (fila *f) {
    if (f->total == 0) {
       return 1;
    }
    else {
         return 0;
    }
}

void create (fila *f) {
    f->inicio = f->fim = f->total = 0;
    f->itens = (elem *) malloc(tamanho * sizeof(elem));
}

void inserir (fila *f, elem valor) {
    if (cheia(f) == 0) {
       f->fim = valor;
       f->total = f->total + 1;
       f->fim = f->fim + 1;
       if (f->fim == tamanho) {
          f->fim = 0;
       }
    }
}

void retirar (fila *f, int valor) {
    if (vazia(f) == 1) {
       valor = f->inicio;
       f->total = f->total - 1;
       f->inicio = f->inicio + 1;
       if (f->inicio == tamanho) {
          f->inicio = 0;
       }
    }
}

 

o mais importante sao as funcoes ai..

Compartilhar este post


Link para o post
Compartilhar em outros sites

ja melhorei o codigo!

mas continuo com problemas na funcao de retirar (que deve retirar o primeiro elemento da fila)

e na funcao de inserir (que deve colocar o primeiro elemento da fila no final)

 

// Matheus Manganeli de Macedo (7986991)

#include <stdio.h>
#include <stdlib.h>

typedef int elem;
typedef struct {
       int inicio, fim, total;
       int tamanho;
       elem *itens;
       } fila;

int cheia(fila *f);
int vazia(fila *f);
fila* create (int size);
void inserir(fila *f, int valor);
int retirar(fila *f, int valor);

int main () {
   fila *f;
   int size, loop = 1;
   int ultimo_valor, i, j;
   int valor;

   while (loop == 1) { 
         scanf("\n\n%d", &size);
         if (size == 0) {
            loop = 0;
            break;
         }
         f = create(size);
         for (i = 0, j = 1; i <= size; i++, j++) {
             inserir(f, j);
         }

         printf("Cartas Jogadas: ");

         j = 2;
         while (f->tamanho >= 1) {
               valor = f->itens[f->inicio];
               if (vazia(f) == 1) {
                  printf("Restante: %d", retirar(f, valor));
               }
               printf("%d \n", retirar(f, valor));
               inserir(f, j);
               j = (j + 2);
               f->tamanho--;
         }

         ultimo_valor = f->inicio;
         printf("%d\n\n", ultimo_valor);

         free(f);
         }
}


// funcoes TAD
int cheia (fila *f) {
    if (f->total == f->tamanho) {
       return 1;
    }
    else {
         return 0;
    }
}

int vazia (fila *f) {
    if (f->total == 0) {
       return 1;
    }
    else {
         return 0;
    }
}

fila* create (int size) {
     fila *f = (fila*)malloc(sizeof(fila));
     f->inicio = f->fim = f->total = 0;
     f->itens = (elem *) malloc((size + 1) * sizeof(elem));
     f->tamanho = size;
     return f;
}

void inserir (fila *f, elem valor) {
    if (cheia(f) == 0) {
       f->fim = valor;
       f->total = f->total + 1;
       f->fim = f->fim + 1;
       if (f->fim == f->tamanho) {
          f->fim = 0;
       }
    }
}


int retirar (fila *f, int valor) {
    if (vazia(f) == 1) {
       valor = f->itens[f->inicio];
       f->total = f->total - 1;
       f->inicio = f->inicio + 1;
       if (f->inicio == f->tamanho) {
          f->inicio = 0;
       }
    }
    return(valor);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na função de retirar a lógica é retirar o elemento [0] e mover os outros para a esquerda, e a função de inserir você move primeiro para a direita e depois inseri.

 

Eu tenho um programinha de fila que eu fiz sem usar ponteiro aqui, se for útil para você está aqui:

#include <iostream.h>

struct Fila {
  int qnt;
  int dados[5];      
}f;

void inseriFila(int num) {
  if (f.qnt < 5) {    
     f.dados[f.qnt] = num;             
     f.qnt++;
  } else {
     cout<<"A fila esta cheia!\n";       
  }
}

void retiraFila() {
  int i;
  if(f.qnt == 0) {
     cout<<"Não existe nenhum elemento na fila!\n";              
  } else {
     for (i=0;i<(f.qnt+1);i++) {
        f.dados[i] = f.dados[i+1];    
     }  
     f.qnt--;
  }
}

void apresentaFila() {
  int i;
  if (f.qnt == 0) {
     cout<<"A fila esta vazia!\n";
  } else {
     for(i=0;i<f.qnt;i++) {
        cout<<"["<<f.dados[i]<<"]";                       
     }    
     cout<<"\n";
  }    
}

void valorInicial() {
  if (f.qnt == 0) {
     cout<<"A fila esta vazia!\n";               
  } else {
     if (f.dados[0] == 0) {
        cout<<"Valor inicial da fila: "<<f.dados[0]<<" - ZERO\n";               
     } else if (f.dados[0] > 0) {
        cout<<"Valor inicial da fila: "<<f.dados[0]<<" - POSITIVO\n";       
     } else {
        cout<<"Valor inicial da fila: "<<f.dados[0]<<" - NEGATIVO\n";       
     }
  }
}

void esvaziaFila() {
  f.qnt = 0;
}

main() { 
int opc, num;

f.qnt = 0;

do {
    cout<<"[1] Inserir na fila\n";
    cout<<"[2] Retirar da fila\n";
    cout<<"[3] Apresentar toda a fila\n";
    cout<<"[4] Apresentar o valor inicial da fila\n";
    cout<<"[5] Esvaziar a fila\n";
    cout<<"[0] Sair\n";
    cout<<"Opc: ";
    cin>>opc;

    system("cls");

    switch (opc) {
     case 1:{
            cout<<"Qual numero deseja inserir na fila?: ";
            cin>>num;
            inseriFila(num);
            system("pause");
            system("cls");
            break;
            };

     case 2:{
            retiraFila();
            system("pause");
            system("cls");
            break;
            };

     case 3:{
            apresentaFila();
            system("pause");
            system("cls");
            break;
            };

     case 4:{
            valorInicial();
            system("pause");
            system("cls");
            break;
            };

     case 5:{
            esvaziaFila();
            system("pause");
            system("cls");
            break;
            };

     case 0: break;
    }

    } while(opc != 0);

system("pause");       
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.