Looping infinito (Lista dinâmica) [RESOLVIDO]

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

André Sousa
andre_ss

(usa Ubuntu)

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!


  


2. MELHOR RESPOSTA

André Lacomski
andrelacomski

(usa Debian)

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]

André Sousa
andre_ss

(usa Ubuntu)

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]

André Lacomski
andrelacomski

(usa Debian)

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]

André Sousa
andre_ss

(usa Ubuntu)

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

Entendi! Muito obrigado pela disposição!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts