Ir ao conteúdo
  • Cadastre-se

Gabsouza12

Membro Júnior
  • Posts

    2
  • Cadastrado em

  • Última visita

Reputação

0
  1. O bug que acontece é que apos eu inserir o primeiro cadastro os telefones continuam acumulado no primeiro registro da struct (estou usando ponteiros), emails também, olhe como está na imagem em anexo. Montei uma agenda eletrônica em C onde tenho 3 Structs 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. 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] Nao\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] Nao\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 nao 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] Nao\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] Nao\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); }
  2. Estou criando uma espécie de agenda em C++ com lista dinâmica e salvando em um txt porém ele dá o seguinte erro #include <stdio.h> #include <stdlib.h> #include <string.h> struct endereco { char nome[30]; char rua[40]; char cidade[20]; char estado[3]; char cep[10]; struct endereco *proximo; /*ponteiro para a próxima entrada */ struct endereco *anterior; /*ponteiro para registro anterior */ } lista; struct endereco *primeiro; /*ponteiro para a primeiro entrada da lista*/ struct endereco *ultimo; /*ponteiro para a ultimo entrada da lista*/ struct endereco *encontra(char *); void entra(void); void procura(void); void salva(void); void carrega(void); void listar(void); void apaga(struct endereco **, struct endereco **); void armazena(struct endereco *i,struct endereco **inicio, struct endereco **ultimo); void entrada(char *,char *,int); void exibe(struct endereco *); int seleciona_menu(void); int main(void) { /*inicializa os ponteiros de topo e fundo*/ primeiro = NULL; ultimo = NULL; while(1) { switch(seleciona_menu()) { case 1: entra(); break; case 2: apaga(&primeiro, &ultimo); break; case 3: listar(); break; case 4: procura(); /*encontra uma rua*/ break; case 5: salva(); /* grava a lista no disco*/ break; case 6: carrega(); /*lê do disco*/ break; case 7: exit(0); } } } /* Seleciona uma operação */ int seleciona_menu(void) { char s[80]; int c; puts("1 : Inserir um nome"); puts("2 : Apagar um nome"); puts("3 : Listar o arquivo"); puts("4 : Pesquisar"); puts("5 : Salvar o arquivo"); puts("6 : Carregar o arquivo"); puts("7 : Sair"); do { printf("\nEntre com sua escolha: "); gets(s); c = atoi(s); }while(c<0 || c>7); return c; } /* Insere nomes e endereços */ void entra(void) { struct endereco *info; while(1) { info = (struct endereco *)malloc(sizeof(lista)); if(!info) { printf("\nSem memória"); return; } entrada("Entre o nome: ",info->nome,30); if(!info->nome[0]) break; /*Não efetua a inserção */ entrada("Entre a rua: ",info->rua,40); entrada("Entre a cidade: ",info->cidade,20); entrada("Entre a estado: ",info->estado,3); entrada("Entre a cep: ",info->cep,10); armazena(info,&primeiro,&ultimo); } /*laço de entrada*/ } /* Esta função lê ua string de comprimento máximo cont e evita que a string seja ultrapassada. Ela também apresenta uma mensagem */ void entrada(char *mensagem,char *s,int cont) { char p[255]; //int tamanho; do { printf(mensagem); gets(p); //tamanho = strlen(p); if(strlen(p) > (size_t)cont) printf("\nMuito longo\n"); }while(strlen(p) > (size_t)cont); strcpy(s,p); } /*Cria uma lista duplamente encadeada ordenada*/ void armazena(struct endereco *i, /*novo elemento*/ struct endereco **primeiro, /*primeiro elemento da lista*/ struct endereco **ultimo) /*último elemento da lista*/ { struct endereco *velho, *p; if(ultimo == NULL) /*primeiro elemento da lista*/ { i->proximo = NULL; i->anterior = NULL; *ultimo = i; *primeiro = i; return; } p = *primeiro; /* começa no topo da lista*/ velho = NULL; while(p) { if(strcpy(p->nome,i->nome)<0) { velho = p; p = p->proximo; } else { if(p->anterior) { p->anterior->proximo = i; i->proximo = p; i->anterior = p->anterior; p->anterior = i; return; } i->proximo = p; /*novo primeiro elemento*/ i->anterior = NULL; p->anterior = i; *primeiro = i; return; } } velho->proximo = i; /*coloca no final*/ i->proximo = NULL; i->anterior = velho; *ultimo = i; } /* Remove um elementi da lista */ void apaga(struct endereco **primeiro,struct endereco **ultimo) { struct endereco *info; struct endereco *encontra(); char s[80]; printf("Entre o nome: "); gets(s); info = encontra(s); if(info) { if(*primeiro == info) { *primeiro = info->proximo; if(*primeiro) (*primeiro)->anterior = NULL; else *ultimo = NULL; } else { info->anterior->proximo = info->proximo; if(info != *ultimo) info->proximo->anterior = info->anterior; else *ultimo = info->anterior; } free(info); /*devole memoria para o sistema*/ } } /*Encontra um endereço */ struct endereco *encontra(char *nome) { struct endereco *info; info = primeiro; while(info) { if(!strcmp(nome, info->nome) )return info; info = info->proximo; /*obtém novo endereço*/ } printf("Nome não encontrado\n"); return NULL; /*não encontrou*/ } /*Mostra a lista completa*/ void listar(void) { struct endereco *info; info = primeiro; while(info) { exibe(info); info = info->proximo; /*obtém próximo endereço*/ } printf("\n\n"); } void exibe(struct endereco *info) { printf("%s\n",info->nome); printf("%s\n",info->rua); printf("%s\n",info->cidade); printf("%s\n",info->estado); printf("%s\n",info->cep); printf("\n\n"); } /*Procura por um nome na lista*/ void procura(void) { char nome[40]; struct endereco *info; struct endereco *encontra(); puts("Entre com o nome a procurar: "); gets(nome); info = encontra(nome); if(!info) printf("Não encontrou\n"); else exibe(info); } /*Salva o arquivo em disco. */ void salva(void) { struct endereco *info; FILE *fp; fp = fopen("lista.txt","wb"); if(!fp) { puts("Arquivo nao pôde ser aberto"); exit(1); } printf("\nSalvando arquivo...\n"); info = primeiro; while(info) { fwrite(info,sizeof(struct endereco),1,fp); info = info->proximo; /*obtém próximo endereço*/ } fclose(fp); } /*Carrega o arquivo de endereço */ void carrega() { struct endereco *info; FILE *fp; fp = fopen("lista.txt","rb"); if(!fp) { puts("Arquivo nao pôde ser aberto"); exit(1); } /*libera qualquer memória previamente alocada*/ while(primeiro) { info = primeiro->proximo; free(info); primeiro = info; } /*reinicializa os ponteiros de início e fim*/ primeiro = NULL; ultimo = NULL; printf("\nCarregando arquivo...\n"); while(!feof(fp)) { info = (struct endereco *)malloc(sizeof(struct endereco)); if(!info) { printf("sem memória"); return; } if(1 != fread(info,sizeof(struct endereco),1,fp)) break; armazena(info, &primeiro,&ultimo); } fclose(fp); }

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...