Ir ao conteúdo
  • Cadastre-se

C Problemas ao imprimir lista encadeada em c


Posts recomendados

Boa tarde! Meu problema é que o conteúdo da lista encadeada não está sendo impresso, eu acredito que o problema possa estar no laço de repetição, porém já tentei por exemplo, trocar pelo while, e mesmo assim não funcionou. Desde já agradeço ela ajuda.

 

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

typedef struct lembrete Lembrete;

struct lembrete{

char lembretes[200];
int dia;
int mes;

};


typedef struct node Node;

struct node{

Lembrete reminder;
struct node *prox;

};

Node* criar_node(){

Node* novo=(Node*)malloc(sizeof(Node));
return novo;
}

Node* inserir_fim(Node* Lista, int dia, int mes, char* string){

Node* novo = criar_node();

novo->reminder.dia = dia;

novo->reminder.mes = mes;

strcpy(novo->reminder.lembretes, string);

if(Lista==NULL){

novo->prox=NULL;
Lista=novo;

}

else{

Node* aux = Lista;
while(aux->prox!=NULL){

aux = aux->prox;
}
novo->prox=NULL;
aux->prox=novo;
}


printf("Lembrete cadastrado com sucesso!");
return Lista;

}

void imprimir_mes(Node* Lista, int mes_ver){
	
	Node* ant = NULL;
	Node* p = Lista;

const char *months[]={
                      "\nJaneiro","\nFevereiro","\nMarço","\nAbril","\nMaio","\nJunho","\nJulho","\nAgosto","\nSetembro","\nOutubro","\nNovembro","\nDezembro"
                     };

int month_days[] = {0, 31, 29, 31, 30, 31, 30, 31 ,31 ,30, 31, 30, 31};

int year = 2020;

    int first_day;
    int x;
    int y;
    int z;
    int j;

    x = (year - 1.)/4.0;
    y = (year - 1.)/100.;
    z = (year - 1.)/400.;

    first_day = (year + x - y + z) %7;


    int i;

    printf("%s %d\n\n", months[mes_ver-1], year); 
    printf("Dom  Seg  Ter  Qua  Qui  Sex  Sab\n");

for(i = 1; i < mes_ver; i++) 
    {
        
        first_day = ((first_day + month_days[i])%7); 
    }

    for(i = 1; i <= 1 + first_day * 5; i++)
    {
        printf(" ");
    }
    
       
       for(i = 1; i <= month_days[mes_ver]; i++)
    { 
         while (p != NULL && p->reminder.mes != mes_ver && p->reminder.dia != i){
         	
         	ant = p;
            p = p->prox;
		 }
    	
         if (ant == NULL && p != NULL) {	
        textcolor(4);
        printf("%2d", i);
        textcolor(7);
         }

        else{
        	
         printf("%2d", i);
		 }
    

        if((i + first_day)%7 > 0)
            printf("   ");
        else
            printf("\n ");   

}}

void imprimir(Node* Lista){

int mes_ver;
Node* aux;

printf("Digite o mês que deseja visualizar(em número): ");
scanf("%d", &mes_ver);
imprimir_mes(Lista, mes_ver);
printf("LEMBRETES\n");

for(aux=lista; aux!=NULL; aux=aux->prox)
{if(aux->reminder.mes==mes_ver)
{
printf("Dia %d: %s", aux->reminder.dia, aux->reminder.lembretes);
}

}}

Node* retirar(Node *Lista){

int month, day;

printf("Digite o dia do lembrete que deseja deletar:");
scanf("%d", &day);

printf("Digite o mês do lembrete que deseja deletar:");
scanf("%d", &month);

Node* ant =NULL;
Node* aux = Lista;

while(aux!=NULL && aux->reminder.mes!=month){

ant = aux;
aux=aux->prox;}

if(aux == NULL)
{
printf("\nNão existe nenhum lembrete cadastrado");
return Lista;
}

if(ant == NULL)
{
Lista = aux->prox;}
else{
ant->prox=aux->prox;}
free(aux);
return Lista;
}

void libera(Node* Lista){

while(Lista!=NULL){
libera(Lista->prox);
free(Lista);
}

}

int main(){

char string[200];
int opt, dia, mes;
do{


Node* lista=NULL;

printf("Escolha a opção\n");
printf("0. Sair\n");
printf("1. Apagar todos os lembretes\n");
printf("2. Exibir lembretes\n");
printf("3. Adicionar lembrete\n");
printf("4. Remover lembrete\n");
printf("Opção: "); scanf("%d", &opt);

switch(opt){
  case 0:
   libera(lista);
   break;

  case 1:
   libera(lista);
   break;

  case 2:
   imprimir(lista);
   system("pause");
   break;

  case 3:
   printf("Digite o dia: ");
   scanf("%d", &dia);

   printf("Digite o mês(em número): ");
   scanf("%d", &mes);

   printf("Digite o lembrete: ");
    scanf("%s", string);
    
	lista=inserir_fim(lista, dia, mes, string);
   system("pause");
   break;

  case 4:
   lista = retirar(lista);
   break;

  default:
   printf("Comando invalido\n\n");
 }

system("cls");

}while(opt!=0);

}

 

Link para o comentário
Compartilhar em outros sites

 

Porque criou um novo tópico para o mesmo problema?

 

do{


Node* lista=NULL;

printf("Escolha a opção\n");
printf("0. Sair\n");
printf("1. Apagar todos o
       
       
       ...

 

Com esse primeiro comando no loop fica difícil para seu programa...

 

A primeira coisa que ele faz antes de mostrar o menu é..... APAGAR A LISTA.

    Node* inserir_fim(Node * Lista, int dia, int mes, const* string);

Não se costuma escrever assim para inserir. O mais produtivo é

 

    Lista* inserir_fim(Node* Lista, Lista* Lista);

// ou no seu caso 

    Node* inserir_fim(Node* evento, Node* Lista);

O que você quer fazer é inserir um node na lista. E devolver o novo endereço de início porque ele pode ter mudado.

 

E você não quer ter que alterar inserir() para cada lista que você escreve, certo? O processo é o mesmo então só está arrumando problemas ao vincular inserir() ao layout do nó.

 

Ainda sobre inserir, se você só insere no fim o novo nó sempre vai apontar para NULL...

 


if(Lista==NULL)
{
    novo->prox=NULL;
    Lista=novo;
}
else
{
    Node* aux = Lista;
    while(aux->prox!=NULL)
    {
        aux = aux->prox;
    }
    novo->prox=NULL;
    aux->prox=novo;
}

Como vê com seu código mais alinhadinho, tem o mesmo comando no if nas duas condições...

 

Se você só insere no fim, porque não salva esse endereço afinal? É o seu programa. A sua lista. As suas funções. Você pode fazer o que quiser. Faça o simples: Crie uma estrutura Agenda com uma lista de eventos, um contador atualizado, um ponteiro para o inicio e um ponteiro para o fim. Tudo fica mais fácil.

 

Assim poderia inserir um item na lista escrevendo o simples: 

    Agenda* = inserir_fim(Node* evento, Agenda* agenda);

E até pra ler fica mais fácil.  

 

Nunca escreva na tela dentro dessas rotinas que manipulam a lista. E muito menos leia valores. Apenas retorne status indicativo assim sabe que não vai mexer nisso. Por exemplo ao remover retorne algo para indicar que não achou o item. Só isso. Não escreva na tela.

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...