Ir para conteúdo
Fórum Script Brasil
  • 0

Problema de Flavius Josephus


Flávio Henrique Carvalho

Pergunta

#### Está ocorrendo um loop infinito quando escolho a opção 1 , alguém poderia dar uma olhada pra mim ##########

 

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

void insere();
void insere();
void menu();
void exclui();

typedef struct dados
{
  char nome[15];
  struct dados *prox;      
}circular;

circular *cria_nodo();

circular *cria_nodo()
{
     circular *p;
     p=(circular*)malloc(sizeof(circular));
     if(!p)
     {
           printf("problemas na alocacao");
           getch();
           exit(0);
     }
}
void menu()
{
     system("cls");
     static circular *pe = NULL;
     int op;
     char nome[15],var;
     printf("digite 1 para inserir Soldados:  ");
     printf("\ndigite 3 para iniciar a remocao: ");
     printf("\ndigite 9 para sair:\n");
     scanf("%d",&op);
     switch(op)
     {
               fflush(stdin);
               case 1:
                    {
                        while(var!='N' && var!='n')
                        {
                           printf("Digite o nome do soldado: ");
                           scanf("%s",nome); 
                           insere(&pe, nome);
                           fflush(stdin);
                           puts("\nDeseja inserir novos Soldados? S para SIM ou N para não");
                           scanf("%c",&var);
                        }
                        menu();
                    }
              case 3:
                   {
                        exclui(pe);
                        exit(0);
                   }

              case 9:
                   {
                        exit(0);
                   }
     }
}
void insere(circular **n, char dado[15])
{
     circular *novo, *aux;
     novo=cria_nodo();
     strcpy(novo->nome,dado);
     if(*n==NULL)
     {
        novo->prox=novo;        
        *n=novo;
     }
     else
     {
         aux=*n;
         while(aux->prox != *n)
         {
               aux=aux->prox;
         }
         aux->prox=novo;
         novo->prox=*n;
     }
}
void exclui(circular *p)
{
     char no[15];
     circular *paux;
     int i;
     if (p==NULL)
     {
        printf("Lista vazia");
        getch();
        menu();
     }
     printf("digite o nome do Soldado para iniciar contagem: ");
     scanf("%s",&no);
     while ((strcmp(no, p->nome))!= 0)
     {
           p=p->prox;
     }
     while(p->prox!=p)//enquanto o nodo não apontar para ele mesmo//
     {
         printf("\nA contagem inicia no Soldado: %s", p->nome);
         getch();

         for(i=1;i<3;i++)
         {
               if(i==2)
               {
                       paux=p;//identifica nodo anterior ao que será removido//
               }
               p=p->prox;
         }
         printf("\nSoldado removido: %s", p->nome);
         paux->prox = p->prox;
         free(p);
         p=paux->prox;
     }
     printf("\n\n->Soldado restante: %s", p->nome);
     getch();
     free(p);
}                   
int main(int argc, char *argv[])
{
  menu();
  system("PAUSE");    
  return 0;
}

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0
5 horas atrás, Flávio Henrique Carvalho disse:

while(var!='N' && var!='n')
                        {
                           printf("Digite o nome do soldado: ");
                           scanf("%s",nome); 
                           insere(&pe, nome);
                           fflush(stdin);
                           puts("\nDeseja inserir novos Soldados? S para SIM ou N para não");
                           scanf("%c",&var);
                        }

Existem muitíssimas coisas a melhorar, mas focando apenas na dúvida: analise o que acontece quando responde: N para finalizar o loop [while]. Para isso coloque uma printf depois da scanf com a variável var.


 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...