Porque meu programa está travando? [RESOLVIDO]

1. Porque meu programa está travando? [RESOLVIDO]

Yuri Fernandes de Oliveira
yurifoborghi

(usa Ubuntu)

Enviado em 05/05/2017 - 12:27h

Boa tarde pessoal, estou fazendo um programa em C para uma matéria da faculdade, porém este está travando em um ponto da execução. Basicamente, é um programa para somar inteiros muito grandes, utilizando a estrutura de dados Lista. O que eu preciso fazer é ler um número inteiro gigante através de uma string e passar este para a Lista, sendo que cada célula da minha lista só pode conter no máximo 5 algarismos. Por exemplo, o número 1234567898765 na lista ficaria 123 -> 45678 -> 98765.


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

typedef struct c{
int dado;
struct c *prox;
} cel;

typedef struct{
cel *inicio;
cel *fim;
int quantidade;
} Lista;

void inicializa(Lista *lista);
void insereInicio(Lista *lista, int dado);
void imprimeLista(Lista lista);
void stringToLista(char *string, Lista *lista);

int main(){

char string[100];
Lista L1, L2, LS;

inicializa(&L1);

printf("Soma de Numeros Absurdamente Grandes\n\n");
printf("Primeiro numero -> ");
fgets(string, 100, stdin);
fflush(stdin);

// AQUI É ONDE TRAVA

stringToLista(string, &L1);
imprimeLista(L1);

return 0;
}

void inicializa(Lista *lista){
lista->inicio = NULL;
lista->fim = NULL;
lista->quantidade = 0;
}

void insereInicio(Lista *lista, int dado){

cel *novo = (cel*)malloc(sizeof(cel));
if(novo == NULL) return;

novo->dado = dado;

if(lista->quantidade){
novo->prox = lista->inicio;
lista->inicio = novo;
} else{
lista->inicio = novo;
lista->fim = novo;
novo->prox = NULL;
}

lista->quantidade++;
}

void imprimeLista(Lista lista){

cel *aux = lista.inicio;

if(lista.quantidade){
while(aux != NULL){
printf("%d ", aux->dado);
aux = aux->prox;
}
}
}

void stringToLista(char *string, Lista *lista){

int i, j = 0;
char aux[6];

printf("Entrou na funcao");

for(i = strlen(string); i != 0; i--){

aux[4-j] = string[i-1];
if(j == 4){
j = 0;
insereInicio(lista, atoi(aux));
} else j++;

if(i == 1 && j != 0){
while(j <= 4)
aux[4-j] = '0';
insereInicio(lista, atoi(aux));
}

}

}


Alguém pode me dar uma luz do porque o programa está travando?


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/05/2017 - 13:51h

Foi você quem escolheu o modo de implementar a lista, ou ele foi imposto pelo enunciado?

Se a escolha foi sua, eu sugiro que a reconsidere. Melhor até do que trabalhar com listas seria trabalhar com arrays. Mas se você tiver de usar listas, eu sugiro que você use listas duplamente encadeadas (i.e. cada nó da lista guarda ponteiros para o nó anterior e para o nó seguinte), pois diferentes operações podem querer percorrer a lista em sentidos diferentes (por exemplo, numa soma, subtração ou multiplicação, normalmente você vai operar do dígito menos significativo para o mais significativo, ao passo ao dividir ou ao exibir o número na tela, pode ser mais conveniente andar do mais significativo para o menos significativo). Além disso, eu recomendo que você guarde os dígitos menos significativos no início da lista, e que os sucessivos nós guardem os dígitos mais significativos.

Na função stringToLista(), faltou você colocar o byte nulo em aux[6]. Isso pode estar atrapalhando a conversão. Mas o loop infinito está naquele “while(j<=4)”, que nunca muda o valor de j.

3. Re: Porque meu programa está travando? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 05/05/2017 - 12:38h

Eu verificaria onde tem while() e for(). Geralmente estes laços estão rodando indefinitivamente e a condição para sair deles está falhando.

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



4. Resolvido

Yuri Fernandes de Oliveira
yurifoborghi

(usa Ubuntu)

Enviado em 05/05/2017 - 13:59h

paulo1205 escreveu:

Foi você quem escolheu o modo de implementar a lista, ou ele foi imposto pelo enunciado?

Se a escolha foi sua, eu sugiro que a reconsidere. Melhor até do que trabalhar com listas seria trabalhar com arrays. Mas se você tiver de usar listas, eu sugiro que você use listas duplamente encadeadas (i.e. cada nó da lista guarda ponteiros para o nó anterior e para o nó seguinte), pois diferentes operações podem querer percorrer a lista em sentidos diferentes (por exemplo, numa soma, subtração ou multiplicação, normalmente você vai operar do dígito menos significativo para o mais significativo, ao passo ao dividir ou ao exibir o número na tela, pode ser mais conveniente andar do mais significativo para o menos significativo). Além disso, eu recomendo que você guarde os dígitos menos significativos no início da lista, e que os sucessivos nós guardem os dígitos mais significativos.

Na função stringToLista(), faltou você colocar o byte nulo em aux[6]. Isso pode estar atrapalhando a conversão. Mas o loop infinito está naquele “while(j<=4)”, que nunca muda o valor de j.


Muito obrigado aos dois. Problema resolvido com o byte nulo em aux e o incremento de j.

Com relação a forma na qual a lista foi implementada, foi uma exigência do enunciado. Será feita somente a operação de soma neste problema, mas concordo que a melhor implementação seria a duplamente encadeada. Realmente os dígitos menos significativos devem ficar no início da lista, foi distração minha na leitura do enunciado. Muito obrigado mesmo.


5. Re: Porque meu programa está travando? [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/05/2017 - 14:21h

yurifoborghi escreveu:

Muito obrigado aos dois. Problema resolvido com o byte nulo em aux e o incremento de j.


Sendo assim, marque o tópico como resolvido e, se quiser, indique a melhor resposta.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts