iagoac / mc202

Disciplina MC202 - Estruturas de Dados
GNU General Public License v3.0
17 stars 13 forks source link

problema lab03 #61

Closed JonasRoberto closed 3 years ago

JonasRoberto commented 4 years ago

Olá, estou com um problema no la03 com meu loop, todos as primeira saidas estão certas, mas a partir da segunda começa dar erro e não chega a terminar, parece que estou passando parametros vazios para a função, mas não estou conseguindo encontrar o erro.

  int Ck,Cl;//onde deve começar a rodar a lista
  Cl=C;
  Ck=C;
  int vl=N-l;
  do{
    tempk=percorrer_circular(lista,k,Ck);//recebo o no para print e exclusão
    templ=percorrer_circular(lista,vl,Cl);
    Ck=tempk->prox->dado;//atualizo onde deve começar a lista
    Cl=templ->prox->dado;
    printf("%d %d\n", tempk->dado,templ->dado);
    if(tempk==templ){//condição caso os no sejam iguais
      lista=remover_circular(lista, tempk);
    }else{//e condição caso os no sejam diferentes
      lista=remover_circular(lista, tempk);
      lista=remover_circular(lista, templ);
    }
  }while(lista->prox!=NULL);//a ideia é que esse loop se repita até não haver itens na lista

aqui estão as duas funções chamadas:

p_no percorrer_circular(p_no lista,int k,int C){
  p_no p;
  int cont;//contador para o numero de vezes que repeti o loop de andar até o proximo no
  cont=0;
  p=lista->prox;
  do{//levando ao local onde deve começar a rodar contator
    p=p->prox;
  }while(p->dado!=C);
  do{//repeti o loop até chegar ao no esperado
    p=p->prox;
    cont++;
  }while(cont<k);
  return p;
}

p_no remover_circular(p_no lista, p_no no){
  p_no ant;
  if(no->prox==no){
    free(no);
    return NULL;
  }
  for(ant=no->prox;ant->prox!=no;ant=ant->prox);//vai ate a posicao antecessora ao no exclui em seguida
  ant->prox=no->prox;
  if(lista==no){
    lista=lista->prox;
  }
  free(no);
  return lista;//retorna a lista para repetir o loop na main

não mandei todo o codigo, pq acredito que o erro esteja nessa parte ja que o resto só cria lista,no e adiciona valores. as entradas que tentei foram 6 4 2 2 e 6 1 1 1. se precisar mando o resto do codigo

iagoac commented 4 years ago

Seu problema pode estar na função p_no percorrer_circular(p_no lista,int k,int C).

Nela, tanto o atendente 1 como o 2 estão rodando a lista no mesmo sentido. Na verdade, um deveria rodar a lista para um lado (utilizando os apontadores anterior) e o outro atendente deveria rotacionar a lista para o outro lado (utilizando os apontadores proximo).

iagoac commented 4 years ago

@JonasRoberto tome mais cuidado ao postar seu código aqui pois todos os seus colegas tem acesso a esta página.