Ir para conteúdo
Fórum Script Brasil
  • 0

Lista simplesmente encadeada


Douglas Lessing

Pergunta

Boa tarde Pessoal!

Estou iniciando em C, e até agora vinha tirando minhas dúvidas no forum sem precisar perguntar.

Agora estou com um problema e não consegui achar uma solução, então resolvi me cadastrar para ver se alguém me ajuda.

Na hora de inserir o registro na minha lista, ocorre um erro e não consigo resolver.

Se puderem me dar uma luz, fico extremamente agradecido!

Abraço!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define OK 0
#define ERRO 1

struct Agenda {
       int data,hora;
       char compromisso [100];
};

struct Elemento {
      struct Agenda*   info;
      struct Elemento* prox;
};

struct Lista {
      int qtde;
      struct Elemento* dados;
};
int retornaHora();
int retornaData();
void retornaComp(struct Agenda* newcomp);
void exibiLista(struct Lista *lista);
struct Agenda *cadastro();
struct Lista *criaLista();
void adicionaLista(struct Lista *lista);
int excluiComp(struct Lista* lista);
struct Lista* pesqData(struct Lista* lista);

main(){
       struct Lista* lista;
       struct Elemento* cad;
       struct Agenda* novo;
       int op;
       lista=criaLista();
       do{
           printf("\n   #######################################");
           printf("\n   ##                                   ##");
           printf("\n   ##    1 - Cadastrar                  ##");
           printf("\n   ##    2 - Pesquisa por data          ##");
           printf("\n   ##    3 - Listar agenda              ##");
           printf("\n   ##    4 - Excluir item               ##");
           printf("\n   ##    5 - Sair                       ##");
           printf("\n   ##                                   ##");
           printf("\n   #######################################\n");
           printf("\n\n   OPCAO:");
           scanf("%d", &op);
           switch(op){
                      case 1: {adicionaLista (lista);}break;
                      case 2: {exibiLista(pesqData(lista));}break;
                      case 3: {exibiLista (lista);}break;
                      case 4: {excluiComp(lista);}break;
                      }
           system ("cls");
           
           if((op<1)||(op>5))
              {
                   printf("\aOpcao invalida - Escolha uma opcao valida\n");
              }
       }while(op!=5);
}

struct Lista* criaLista() {
      struct Lista* listaNova;
      listaNova = (struct Lista*)malloc(sizeof(struct Lista));
      listaNova->qtde = 0;
      listaNova->dados = NULL;
      return listaNova;
}

struct Agenda* cadastro(){
     struct Agenda* newcomp;
     newcomp = (struct Agenda*)malloc(sizeof(struct Agenda));
     newcomp->data=retornaData();
     newcomp->hora=retornaHora();
     fflush(stdin);
     retornaComp(newcomp);
     return newcomp;
}
     
void adicionaLista(struct Lista *lista){
    struct Elemento* aux1;
    struct Elemento* aux2;
    struct Elemento* aux3;
    struct Elemento* novo;
    int x=0;
        novo= (struct Elemento*)malloc(sizeof(struct Elemento));
        novo->info = cadastro();
        if(lista->qtde == 1){
            novo->prox=NULL;
            lista->dados=novo;
        }                            
        else{
        if((lista->dados->info->data) > (novo->info->data)){
            novo->prox=lista->dados;
        lista->dados=novo;
        x=1;
        }
        if((lista->qtde==2)&&(x==0)){
            lista->dados->prox=novo;
            novo->prox=NULL;
            x=1;
        }
        if(x!=1){                                        
            aux1=lista->dados;
            aux2=lista->dados->prox;
            while( (aux2 != NULL) && ((aux2->info->data)<(novo->info->data))){
                aux3 = aux1;
                aux1 = aux2;
                aux2 = aux2->prox;
            }         
        aux3 = novo;       
        novo->prox = aux1;
        }
        }
}                     
  
void exibiLista(struct Lista *exibilista){
    if((exibilista==NULL)||(exibilista->qtde==0)){
        printf("LISTA VAZIA!!\n");
        getch();
    }
    else {
        struct Elemento *p;
        for(p = exibilista->dados; p != NULL; p = p->prox){ 
            printf("\nDATA: %d  -  HORA: %d", p->info->data, p->info->hora);
            printf("\nCOMPROMISSO: %s  \n", p->info->compromisso);
        }
        getch();
    }             
}

int retornaHora(){
    int hora,i;        
    do{
        printf("\nDigite a hora do compromisso (HHMM): ");
        scanf("%d",&hora);
        if( hora < 2360 & hora >= 0){
            if( (hora % 100) < 60 ){
                i=0;
            }
        }
        else {
            printf("\nHORA INVALIDA!!\n");
            printf("DIGITE NOVAMENTE:\a\a\n");
            i=1;
        }
    }while(i!=0);
    return hora;           
}

int retornaData(){
    int dia,mes,ano,data;
    printf("\nDigite a data do compromisso (DDMMAAAA): ");
    scanf("%d",&data);
    dia = data/1000000;
    mes = (data/10000)-(dia*100);
    ano = data%10000;     
    return data;      
}   

void retornaComp(struct Agenda* newcomp){
    printf("\nDigite o compromisso: ");
    gets(newcomp->compromisso);
}   

int excluiComp(struct Lista* lista){
    int data,hora;
    data=retornaData();
    hora=retornaHora();
    struct Elemento *p,*ant;
    ant=lista->dados;
    for(p = lista->dados; p != NULL; p = p->prox){
        ant=p;
        if((p->info->data == data) && (p->info->hora == hora)){break;}
    }
    if(p == NULL)return ERRO;
    if(p->prox == NULL){
        lista->qtde --;
        ant->prox= NULL;
        free(p);
        return OK;
    }
    if(ant == NULL){
        lista->qtde --;
        lista->dados=p->prox;
        free(p);
        return OK;
    }
    if((p->prox != NULL)&&(ant != NULL)){
        ant->prox=p->prox;
        lista->qtde --;
        free(p);
        return OK;
    }
}

struct Lista* pesqData(struct Lista* pesqlista){
    struct Lista* sublista;
    struct Elemento* pesqnovo;
    struct Elemento* k;
    int data;
    sublista = (struct Lista*)malloc(sizeof(struct Lista));
    sublista=criaLista();
    data=retornaData();
    for(k=pesqlista->dados;k!=NULL;k=k->prox){
        if((k->info->data)==data){
            pesqnovo = (struct Elemento*)malloc(sizeof(struct Elemento));
            pesqnovo->info=k->info;
            pesqnovo->prox = sublista->dados;
            sublista->dados = pesqnovo;
            sublista->qtde ++;
        }
    }
    return sublista;
}

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...