Pular para o conteúdo

Looping infinito (Lista dinâmica) [RESOLVIDO]

Responder tópico
  • Denunciar
  • Indicar

1. Looping infinito (Lista dinâmica) [RESOLVIDO]

Enviado em 09/10/2017 - 12:04h

Boa noite, pessoal.

Estou fazendo um exercício sobre lista dinamicamente encadeada da faculdade aqui, porém, na função exibirLista, o programa entra em looping infinito escrevendo "Número: 0". O código é o seguinte:


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

typedef struct Lista {
int numero;
struct Lista *prox;
} Lista;


void insereInicio(Lista *cabeca);
void exibirLista(Lista *cabeca);


void insereInicio(Lista *cabeca) {
int num;
Lista *novo, *aux;

novo = (Lista *)malloc(sizeof(Lista));

printf("Digite o número: ");
scanf("%d", &novo->numero);

while (novo->numero != 0) {
if (cabeca->prox == NULL) {
cabeca->prox = novo;
novo->prox = NULL;
}
else {
novo = cabeca;
cabeca->prox = novo;
}

printf("Digite o número: ");
scanf("%d", &novo->numero);
}
}

void exibirLista(Lista *cabeca) {
Lista *aux;
aux = cabeca;

if (cabeca == NULL) {
printf("Lista vazia!");
}
else {
while (aux->prox != NULL) {
printf("Número: %d", aux->numero);
aux = aux->prox;
}
}
}

int main() {
int opc;
Lista *cabeca = NULL;
cabeca = (Lista *)malloc(sizeof(Lista));
cabeca->prox = NULL;

do {
printf("Escolha o tipo de inserção:\n\n");
printf("[1] - No início da lista\n[2] - No fim da lista\n[3] - Em uma dada posição\n[0] - Sair\n");
scanf("%d", &opc);
} while ((opc != 1) && (opc != 2) && (opc != 3) && (opc != 0));

switch (opc) {
case 1:
insereInicio(cabeca);
break;
case 2:
//insereFim();
break;
case 3:
//inserePosicao();
break;
case 0:
exit(1);
default:
break;
}

getchar();
system("clear");
exibirLista(cabeca);

return 0;
}


O que estaria errado?

Desde já agradeço!

Responder tópico

2. Código Solucionado!

Melhor resposta

Enviado em 09/10/2017 - 14:47h

Boa Tarde, então tive um pouco de dificuldade para entender o seu código, porém resolvi o problema.
O Código ficou o seguinte:
OBS: __fpurge serve para limpar o buffer do sistema do linux, para windows seria o fflush(stdin).

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

typedef struct Lista {
int numero;
struct Lista *prox;
} Lista;

void insereInicio(Lista *cabeca);
void exibirLista(Lista *cabeca);

void insereInicio(Lista *cabeca) {
int num;
Lista *novo= (Lista *)malloc(sizeof(Lista));
printf("Digite o número: ");
scanf("%d", &novo->numero);
__fpurge(stdin);
while (novo->numero != 0) {
if (cabeca->prox == NULL) {
cabeca->prox = novo;
novo->prox = NULL;
}
else {
novo->prox = cabeca->prox;
cabeca->prox = novo;
}
novo=(Lista *)malloc(sizeof(Lista));
printf("Digite o número: ");
scanf("%d", &novo->numero);
}
}


void exibirLista(Lista *cabeca) {
Lista *aux;
aux = cabeca->prox;
if (cabeca == NULL) {
printf("Lista vazia!");
return;
}
else {
while (aux != NULL) {
printf("Número: %d\n", aux->numero);
aux = aux->prox;
}
}
}

int main() {
int opc;
Lista *cabeca = NULL;
cabeca = (Lista *)malloc(sizeof(Lista));
cabeca->numero=-999;
cabeca->prox = NULL;

do {
printf("Escolha o tipo de inserção:\n\n");
printf("[1] - No início da lista\n[2] - No fim da lista\n[3] - Em uma dada posição\n[0] - Sair\n");
scanf("%d", &opc);
} while ((opc != 1) && (opc != 2) && (opc != 3) && (opc != 0));

switch (opc) {
case 1:
insereInicio(cabeca);
break;
case 2:
//insereFim();
break;
case 3:
//inserePosicao();
break;
case 0:
exit(1);
default:
break;
}

exibirLista(cabeca);

return 0;
}



A Função insereInicio tinha um problema grave, na primeira iteração está OK, porém nas próximas iterações necessita de um novo malloc para poder inserir corretamente. Assim ele não ocorre Loop infinito, não consigo explicar como eu queria, se quiser entrar em contato segue os email's: andrelacomski@hotmail.com andrelacomski@alunos.utfpr.edu.br



Today's Goal: Be better than yesterday!

3. Re: Looping infinito (Lista dinâmica) [RESOLVIDO]

Enviado em 10/10/2017 - 10:09h

Funcionou! o.O Kkkk

Muito obrigado, cara! Entendi o que você quis dizer com a primeira iteração estar certa por causa do malloc.

Só não entendi o porquê do
cabeca->numero = -999 
no main.

4. Re: Looping infinito (Lista dinâmica) [RESOLVIDO]

Enviado em 10/10/2017 - 10:17h

Bom Dia.
o cabeca->numero=-999;
Só atribui por costume próprio, deixo -999 para indicar que é o nó cabeça e esse valor não será atribuído para outro nó.
É uma maneira de evitar um erro na lista caso entre no nó cabeça por algum erro de software.

Today's Goal: Be better than yesterday!

5. Re: Looping infinito (Lista dinâmica) [RESOLVIDO]

Enviado em 11/10/2017 - 12:45h

Entendi! Muito obrigado pela disposição!

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder