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;
}