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

Lista encadeada, Agenda Eletrônica


Kernal112

Pergunta

Criei uma lista encadeada onde tenho 3 strcuts para cadastrar pessoa,  O bug que acontece é que apos eu inserir o primeiro cadastro os telefones continuam acumulado no primeiro registro, emails também, olhe como está na imagem anexada.

struct agenda {
    char matricula[20];
    char nome[30];
    struct agenda *prox;
    struct tel *t;
    struct mail *m;

};

struct tel{
       char telefone[20];
       struct tel *prox;
};

struct mail{
       char email[30];
       struct mail *prox;
};

Eu uso essas tres structs por que por exemplo uma pessoa pode ter mais de um telefone ou mais de um email.

Minhas funções de inserir:

void insereTel(struct tel **t,char tel[]){
     struct tel *p,*q;

      p=(struct tel*)malloc(sizeof(struct tel));
      strcpy(p->telefone,tel);
      p->prox=*t;
      *t=p;

}

void insereMail(struct mail **m,char mail[]){
     struct mail *p;
      p=(struct mail*)malloc(sizeof(struct mail));

      strcpy(p->email,mail);
      p->prox=*m;
      *m=p;
}

void inserePessoa (struct agenda **L, struct tel *T,struct mail *M, char n[], char end[]){
     struct agenda *p;

     p=(struct agenda*)malloc(sizeof(struct agenda));

     strcpy(p->matricula,n); strcpy(p->nome,end);
     p->prox=*L;
     p->t=T;
     p->m=M;
     *L=p;


}

Eu também mando os dados pelo menu quando ele seleciona a opção para fazer o registro:

main(){
       struct agenda *Lista;
       struct tel *Tel;
       struct mail *Mail;
       int op;
       char matricula[20], nome[30], telefone[20], email[20];
       char no;

       Lista=criaAgenda();
       Tel=criaTel();
       Mail=criaMail();

       do{
          system("cls");
          printf("\n\n");
          printf("\n[1] - Cadastra Aluno --Falta arrumar bug dos tel");
          printf("\n[2] - Pesquisa Aluno (Matricula)");
          printf("\n[3] - Remove Aluno");
          printf("\n[4] - Total de alunos");
          printf("\n[5] - Total de telefones");
          printf("\n[6] - Limpar Lista");
          printf("\n[7] - Salva em Disco");
          printf("\n[8] - Carrega lista");
          printf("\n\nDigite -> ");     
          fflush(stdin);
          scanf("%d",&op);

      switch (op){
             case 1: printf("\nMatricula -> ");
                     fflush(stdin);
                     scanf("%s",matricula);
                     printf("\nNome -> ");
                     fflush(stdin);
                     scanf("%s",nome);

                     do{
                        printf("\nTelefone -> ");
                        fflush(stdin);
                        scanf("%s",telefone);
                        insereTel(&Tel,telefone);
                        printf("\nPossui mais telefones -> [1] Sim [2] não\n");
                        scanf("%d",&op);
                     }while(op!=2);

                     do{
                           printf("\nEmail -> ");
                           fflush(stdin);
                           scanf("%s", email);
                           insereMail(&Mail,email);
                           printf("\nPossui mais emails? [1] Sim [2] não\n");
                           scanf("%d",&op);
                      }while(op!=2);

                     inserePessoa(&Lista,Tel,Mail,matricula,nome);
              break;

Aqui está o código completo do projeto:

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

struct agenda {
    char matricula[20];
    char nome[30];
    struct agenda *prox;
    struct tel *t;
    struct mail *m;

};
struct tel{
       char telefone[20];
       struct tel *prox;
};
struct mail{
       char email[30];
       struct mail *prox;
};


struct agenda* criaAgenda (){
     return NULL;
}
struct tel* criaTel(){
     return NULL;
}
struct mail*criaMail(){
       return NULL;
}
void insereTel(struct tel **t,char tel[]){
     struct tel *p,*q;

      p=(struct tel*)malloc(sizeof(struct tel));
      strcpy(p->telefone,tel);
      p->prox=*t;
      *t=p;

}

void insereMail(struct mail **m,char mail[]){
     struct mail *p;
      p=(struct mail*)malloc(sizeof(struct mail));

      strcpy(p->email,mail);
      p->prox=*m;
      *m=p;
}

void inserePessoa (struct agenda **L, struct tel *T,struct mail *M, char n[], char end[]){
     struct agenda *p;

     p=(struct agenda*)malloc(sizeof(struct agenda));

     strcpy(p->matricula,n); strcpy(p->nome,end);
     p->prox=*L;
     p->t=T;
     p->m=M;
     *L=p;


}

struct agenda* localiza(struct agenda *L,char n[]){
     struct agenda *p;
     struct tel *auxt;
     struct mail *auxm;
     int cont=0;
     p=L;
     auxt=p->t;
     auxm=p->m;
     while(p!=NULL){
        if (strcmp(p->matricula,n)!=0)
            p=p->prox;
          else{
                  printf("\n\n Matricula -> %s",p->matricula);
                  printf("\n Nome -> %s",p->nome);
                  while(auxt!=NULL){
                     printf("\n Telefone -> %s",auxt->telefone);
                     auxt =auxt->prox;
                  }
                  while (auxm!=NULL){
                     printf("\n Email -> %s",auxm->email);
                     auxm=auxm->prox;
                  }

           return p;
           }


     }
     return NULL;
}

void listarTodos(struct agenda *L){
     struct agenda *p;
     struct tel *auxt;
     struct mail *auxm;
     p=L;
     auxt=p->t;
     auxm=p->m;
     while (p!=NULL){
             printf("\n\nmatricula -> %s",p->matricula);
             printf("\n\nnome -> %s",p->nome);
             while(auxt!=NULL){
                     printf("\n\nTelefone -> %s",auxt->telefone);
                     auxt =auxt->prox;
                  }
                  while (auxm!=NULL){
                     printf("\n\nEmail -> %s",auxm->email);
                     auxm=auxm->prox;
                  }
           p=p->prox;
           printf("\n\n=================\n\n");
     }
}

void TotalTelefones(struct agenda *L){
     struct agenda *p;
     struct tel *auxt;
     struct mail *auxm;
     int contador;
     p=L;
     auxt=p->t;
     auxm=p->m;

    while(auxt!=NULL){
        contador ++;
        auxt =auxt->prox;
    }

    printf("\nTotal de telefones: %d", contador);

}

void TotalAlunos(struct agenda *L){
     struct agenda *p;
     struct tel *auxt;
     struct mail *auxm;
     int contador;
     p=L;
     auxt=p->t;
     auxm=p->m;
     while (p!=NULL){
           contador ++;

           p=p->prox;
           //printf("\n\n=================\n\n");
     }
     printf("\nTotal de alunos: %d", contador);
}


void SalvarTXT(struct agenda *L){
     struct agenda *p;
     struct tel *auxt;
     struct mail *auxm;
     p=L;
     auxt=p->t;
     auxm=p->m;

    FILE *arquivo_texto;  //Criando a File   
    arquivo_texto = fopen ("agenda_eletronica.txt", "w+");  //Abrindo txt e escrevendo nele

    if (arquivo_texto == NULL) {  
        printf("Erro ao abrir o arquivo.\n");  //Caso de algum erro
        exit(1);             
    }

    while (p!=NULL){ //Correr toda lista das structs     
        fprintf(arquivo_texto, "Matricula -> %s\n Nome -> %s\n", p->matricula, p->nome); //Inserindo dados da Struct de dados
             while(auxt!=NULL){
                     fprintf(arquivo_texto, "Telefone -> %s\n", auxt->telefone); //Inserindo dados da Struct de telefones
                     auxt =auxt->prox; //Pula pro proximo registro
                  }
                  while (auxm!=NULL){
                     fprintf(arquivo_texto, "Email -> %s\n", auxm->email); //Inserindo dados da Struct de email
                     auxm=auxm->prox; //Pula pro proximo registro
                  }
           p=p->prox;
           fprintf(arquivo_texto, "=================\n");
           //printf("\n\n=================\n\n");
     }

     fclose(arquivo_texto); //fecha o arquivo
}

void listaLetra(struct agenda *L,char n){
     struct agenda *p;
     struct tel *auxt;
     struct mail *auxm;
     p=L;
     auxt=p->t;
     auxm=p->m;
     while (p!=NULL){
           if(p->matricula[0]!=n)
              p=p->prox;
           else{
             printf("\n\nmatricula -> %s",p->matricula);
             printf("\n\nnome -> %s",p->nome);
             while(auxt!=NULL){
                     printf("\n\nTelefone -> %s",auxt->telefone);
                     auxt=auxt->prox;
                  }
                  while (auxm!=NULL){
                     printf("\n\nEmail -> %s",auxm->email);
                     auxm=auxm->prox;
                  }
             p=p->prox;
             printf("\n\n======================\n\n");
             }
     }
}

void alterarDados(struct agenda *L,char n[]){
     int cont=0;
     struct agenda *p;
     struct tel *auxt;
     struct mail *auxm;
     auxt=p->t;
     auxm=p->m;
     p=localiza(L,n);
        if(p==NULL)
        printf("\nmatricula não encontrado");
        else{
                printf("\n\nDigite o novo nome:");
                scanf("%s",&p->nome);

                while (auxt!=NULL){
                      printf("\n\n Digite o novo telefone:");
                      scanf("%s",&auxt->telefone);
                      auxt=auxt->prox;
                }
               while (auxm!=NULL){
                     printf("\n\n Digite o novo email:");
                     scanf("%s",&auxm->email);
                     auxm=auxm->prox;
               }
    }
}

struct agenda* removermatricula(struct agenda *L,char n[]){
    struct agenda *p, *q;
    p=localiza(L,n);
    if (p==NULL)
        printf("\n\n Matricula não encontrada !");
    else{
        q=L;
        if(q==p){
            L=p->prox;
            free(p);
        }else{
        while (q->prox!=p)
            q=q->prox;

         q->prox=p->prox;
         free(p);
        }
        printf("\n\n Aluno removido com sucesso !");
    }
    return L;
}
void LimpaLista(struct agenda *L){
    struct agenda *p, *q;
    p=L;
    q=L;
    if (p==NULL)
        printf("\n\n Lista vazia");
    else{
        q=L;
        if(q==p){
            L=p->prox;
            free(p);
        }else{
        while (q->prox!=p)
            q=q->prox;

         q->prox=p->prox;
         free(p);
        }
        printf("\n\n Lista limpa !");
    }
    //return L;
}
main(){
       struct agenda *Lista;
       struct tel *Tel;
       struct mail *Mail;
       int op;
       char matricula[20], nome[30], telefone[20], email[20];
       char no;

       Lista=criaAgenda();
       Tel=criaTel();
       Mail=criaMail();

       do{
          system("cls");
          printf("\nEstrutura de Dados - Trabalho Pratico I - Gabriel de Souza\n");
          printf("\n[1] - Cadastra Aluno --Falta arrumar bug dos tel");
          printf("\n[2] - Pesquisa Aluno (Matricula)");
          printf("\n[3] - Remove Aluno");
          printf("\n[4] - Total de alunos");
          printf("\n[5] - Total de telefones");
          printf("\n[6] - Limpar Lista");
          printf("\n[7] - Salva em Disco");
          printf("\n[8] - Carrega lista");
          printf("\n\nDigite -> ");     
          fflush(stdin);
          scanf("%d",&op);

      switch (op){
             case 1: printf("\nMatricula -> ");
                     fflush(stdin);
                     scanf("%s",matricula);
                     printf("\nNome -> ");
                     fflush(stdin);
                     scanf("%s",nome);

                     do{
                        printf("\nTelefone -> ");
                        fflush(stdin);
                        scanf("%s",telefone);
                        insereTel(&Tel,telefone);
                        printf("\nPossui mais telefones -> [1] Sim [2] não\n");
                        scanf("%d",&op);
                     }while(op!=2);

                     do{
                           printf("\nEmail -> ");
                           fflush(stdin);
                           scanf("%s", email);
                           insereMail(&Mail,email);
                           printf("\nPossui mais emails? [1] Sim [2] não\n");
                           scanf("%d",&op);
                      }while(op!=2);

                     inserePessoa(&Lista,Tel,Mail,matricula,nome);
              break;

              case 2: if(Lista==NULL)
                      printf("\nAgenda vazia");
                      else{
                      printf("\n Digite um matricula -> ");
                      fflush(stdin);
                      scanf("%s",matricula);
                    if(localiza(Lista,matricula)==NULL)
                      printf("\n Matricula não encontrado na agenda");
                      }
                      getch();
                    break;
              case 3: if(Lista==NULL)
                      printf("\nAgenda vazia");
                      else{
                        printf("\nDigite a matricula do aluno que deseja remover -> ");
                        scanf("%s",matricula);
                        Lista=removermatricula(Lista,matricula);
                        getch();
                      }

              case 4: if(Lista==NULL)
                      printf("\nAgenda vazia");
                      else
                      TotalAlunos(Lista);
                      getch();
                      break;
              case 5: if(Lista==NULL)
                      printf("\nAgenda vazia");
                      else
                      TotalTelefones(Lista);
                      getch();
                      break;
              case 6: if(Lista==NULL)
                      printf("\nAgenda vazia");
                      else
                      LimpaLista(Lista);
                      getch();
                      break;
              case 7: if(Lista==NULL)
                      printf("\nAgenda vazia");
                      else
                      SalvarTXT(Lista);
                      getch();
                      break;
              case 8: if(Lista==NULL)
                      printf("\nAgenda vazia");
                      else
                      listarTodos(Lista);
                      getch();
                      break;
      }
      }while (op!=0);
}

 

ncW6B.png

Editado por Kernal112
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...