Ir ao conteúdo
  • Cadastre-se

Escluir Registro em C/C++


keytous

Posts recomendados

Gostaria de uma ajuda, para excluir registro de uma estrutura, abaixo segui o código. OBS1: O codigo compila tudo certinho aparece a descrição quando tempo excluir e quando da algum problema, mas quando eu listo os registros os mesmos q eu acabei de excluir são listados. (Ou seja não esta excluindo).

Abaixo segue código.

Obrigado a todos !!!

 

 

--------------------------------------------------------------------------------

// BIBLIOTECAS

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

// DEFINICAO DA ESTRUTURA

 struct consulta {

     char numero[100];

        char nome[30];

        char idade [3];

        char diagnostico[50];

        char tratamento[50];

        int vazio;

        int cod;

 

        struct consulta *prox;

         }registros[500];

         

// PROTOTIPOS DAS FUNCOES 

int display_menu(void);

void imprime (struct consulta *);

void mediaidades (struct consulta *);

void pesquisaregistro (struct consulta *);

void excluir (struct consulta *inicio);

void insere(struct consulta **,struct consulta **, struct consulta);

 

// PROGRAMA PRINCIPAL 

int main()

{

    FILE *arq;

    int opcao, num;

    struct consulta *lista = NULL; // inicialização da lista

    struct consulta *fim = NULL;

 

    struct consulta data;

 

     if((arq=fopen("banco de dados.xlsx","r+")) == NULL){

      printf("Banco de dados nao Encontrado, sera criado.\n");

                                        arq=fopen("banco de dados.xlsx","w+");

                                        }

                                        else {

                                             printf("Banco de Dados Carregado com Sucesso.\n");

                                             while (!feof(arq))

                                             {

                                                   fread(&data, sizeof(struct consulta), 1, arq);

                                                   if (!feof(arq)) {

                                                       insere(&lista,&fim, data);

                                                        }

                                             }

                                             }

// MENU DE opções 

    do {

        opcao=display_menu();

        switch (opcao) {

           case 1:

               printf("\n Numero do Paciente: ");

                fflush(stdin);

                gets(data.numero);

           

                printf("\n Nome do Paciente: ");

                gets(data.nome);

                

                printf("\n Idade do Paciente: ");

                gets(data.idade);

                

                printf("\n Diagnostico: ");

                gets(data.diagnostico);

                

                printf("\n Tratamento: ");

                gets(data.tratamento);

                

                printf("\n\n\n");

                insere(&lista,&fim, data);

                break;

                

           case 2:

                imprime(lista);

                break;

           case 3:

                mediaidades(lista);

                break;

           case 4:

                pesquisaregistro(lista);

                break;

           case 5:

            excluir(lista);

            break;

        }

                } while (opcao != 0);

rewind(arq);

     fflush(arq);

     struct consulta*aux=lista;

 

       while (aux!=NULL){

          printf("Gravando o registro %s\n",aux->nome);

          fwrite((char *)aux,sizeof(struct consulta),1,arq);

          aux = aux -> prox;

          }

 

     printf("Fim");

     fflush(stdin);

     scanf("%c",&opcao);

     fclose(arq);

     return (0);

}

 

// MOSTRA O MENU DE opções 

int display_menu(void)

{

    int opcao;

    printf("----------------------------- \n\n");

    printf("       CADASTRO - HOSPITAL\n*****************************\n\n");

    printf("1- Cadastrar\n");

    printf("2- Listar\n");

    printf("3- Media das idades dos pacientes\n");

    printf("4- Pesquisar registro\n");

    printf("5- Excluir paciente\n");

printf("0- Sair (grava em arquivo) \n\n => ");

 

    scanf("%d", &opcao);

    return(opcao);

}

// EXCLUIR REGISTRO

void excluir (struct consulta *inicio){

    

    if (inicio == NULL) printf("Sem registros");

    else {

    int cod, cont = 0;

printf("\nEntre com o codigo do registro que deseja excluir: ");

    scanf("%d", &cod);

   

    do {

    int numer = atoi(inicio -> numero);

    if (cod == numer){

    cont = 1;

    registros[cont].vazio=0;

            printf("\nExclusao feita com sucesso\n");

                    }

    inicio = inicio -> prox;

      } while (inicio !=NULL);

      

      if (cont == 0){

                 printf("\nRegistro nao localizado. \n");

                           }

         }

    

}

 

// IMPRIME O REGISTRO DE UM PACIENTE, PESQUISA PELO NUMERO ////////////////////

void pesquisaregistro (struct consulta *inicio)

{

printf("_____________________________\n");

     printf("\n\n >>>>> LISTA DE PACIENTES: \n\n");

     if (inicio == NULL) printf("Lista vazia");

     else {

          int num, passou = 0;

          printf("Informe o numero de registro a ser pesquisado: ");

          scanf("%d", &num);

          

          do {

          int numero = atoi(inicio -> numero);

          if (num == numero){

             passou = 1; // somente para mostrar a mensagem no final. se ele nao achar = 0

          printf("Numero: %d\n", numero);

             printf("Nome: %s\n", inicio -> nome);

             printf("Idade: %s\n", inicio -> idade);

             printf("Diagnostico: %s\n", inicio -> diagnostico);

             printf("Tratamento: %s\n", inicio -> tratamento);

             printf("\n");

          }

          inicio = inicio -> prox;

          } while (inicio !=NULL);

          

          if(passou == 0){

                 printf("Registro nao localizado. \n");

                 }

     }

}

 

// IMPRIME OS ELEMENTOS DE UMA LISTA 

void imprime (struct consulta *inicio)

{

printf("_____________________________\n");

     printf("\n\n >>>>> LISTA DE PACIENTES: \n\n");

     if (inicio == NULL) printf("Lista vazia");

     else do {

       printf("Numero: %s\n", inicio -> numero);

          printf("Nome: %s\n", inicio -> nome);

          printf("Idade: %s\n", inicio -> idade);

          printf("Diagnostico: %s\n", inicio -> diagnostico);

          printf("Tratamento: %s\n", inicio -> tratamento);

          printf("\n");

          

          inicio = inicio -> prox;

          } while (inicio !=NULL);

}

// IMPRIME A MEDIA DAS IDADES DOS PACIENTES /////////////////////////////////// 

void mediaidades (struct consulta *inicio)

{

printf("_____________________________\n");

     printf("\n\n >>>>> LISTA DE PACIENTES: \n\n");

     if (inicio == NULL) printf("Lista vazia");

     else{

          int somaidade = 0, contador = 0;

          do {

          somaidade += atoi(inicio -> idade);

          contador++;

          inicio = inicio -> prox;

          } while (inicio !=NULL);

          float media = (float)somaidade/contador;

          printf("Media das idades dos pacientes: %.2f anos.\n", media);

     }

}

 

 

//INSERE CONSULTA NO FINAL DA FILA

void insere (struct consulta **inicio,struct consulta **fim, struct consulta dado)

{

    if (*inicio==NULL){

                       (*inicio)=(struct consulta*) malloc(sizeof(struct consulta));

                       strcpy((*inicio)->numero,dado.numero);

                       strcpy((*inicio)->nome,dado.nome);

                       strcpy((*inicio)->idade,dado.idade);

                       strcpy((*inicio)->diagnostico,dado.diagnostico);

                       strcpy((*inicio)->tratamento,dado.tratamento);

                       

                       (*inicio)->prox=NULL;

                       (*fim)=(*inicio);

                       }

                       else {

                             struct consulta *aux=(struct consulta*) malloc(sizeof(struct consulta));

                             strcpy(aux->numero,dado.numero);

                             strcpy(aux->nome,dado.nome);

                             strcpy(aux->idade,dado.idade);

                             strcpy(aux->diagnostico,dado.diagnostico);

                             strcpy(aux->tratamento,dado.tratamento);

                             

                             (*fim)->prox=aux;

                             (*fim)=aux;

                             (*fim)->prox=NULL;

                       }

}

---------------------------------------------------------------------------------------------------------

Link para o comentário
Compartilhar em outros sites

nesse caso voce precisa pegar uma referencia(**)para o ponteiro "lista" e nao um ponteiro(*) para lista

pra deletar um certo elemento em uma lista que nao seja o ultimo é um pouco diferente,tendo a sua função agora pegando uma referencia pro ponteiro

void excluir (struct consulta **inicio);

Algo assim pode ser feito:

void excluir (struct consulta **inicio){    if (inicio == NULL) printf("Sem registros");    else    {        int cod, cont = 0;        consulta *p = *inicio;        consulta *pr = p;        printf("\nEntre com o codigo do registro que deseja excluir: ");        scanf("%d", &cod);        do {            int numer = atoi(p -> numero);            if (cod == numer)            {                cont = 1;                if(pr != NULL)                {                    *inicio = p->prox;                }                else                    pr->prox = p->prox;    //Atribui o próximo nodo em p ao nodo atual                printf("\nExclusao feita com sucesso\n");                break;            }            pr = p;         //Nodo atual em p agora em pr            p = p -> prox;        //Proximo nodo em p        } while (p !=NULL);        if (cont == 0){            printf("\nRegistro nao localizado. \n");        }         }}

PS:Eu nao testei em todos os casos,(na verdade eu só olhei sua função excluir),mas acho que é isso ai

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Bom Dia !

 

Atlos Primeiramente obrigado pela ajuda, fiz conforme você me orientou mas esta acontecendo o seguinte erro, nessa linha do código.

 

-------------------------------------------------------------------------------------------------------
                cont = 1;
                if(pr != NULL)
                {
                    *inicio = p->prox;                  // AQUI APARECE O ERRO
                }
                else
                    pr->prox = p->prox;   //Atribui o próximo nodo em p ao nodo atual
                printf("\nExclusao feita com sucesso\n");
                break;
            }

---------------------------------------------------------------------------------------------------------

 

OBS: No caso se eu comento essa linha:

 

               // *inicio = p->prox;

 

O código compila, mas quando eu tento excluir algum registro, no caso tenho 5 registros cadastrados, quando tento excluir o '1' ele aparece a mensagem q foi excluído, mas nos 4 restante aparece q o registro não foi encontrado. entretanto quando eu seleciono a opção de listar registros todos aparecem, inclusive o registro '1' q a principio teria sido excluído. 

 

Certamente essa linha (// *inicio = p->prox;) esta fazendo falta, ou algo parecido.  

 

Obrigado !!

Link para o comentário
Compartilhar em outros sites

foi mal é que eu tava meio bebado de sono ontem

Poe o valor de pr para null pra validar a condição

consulta *pr = NULL;

do {            int numer = atoi(p -> numero);            if (cod == numer)            {                cont = 1;                if(pr == NULL)              //Troca "!=" por "==" ,Se o elemento procurado for o 1º da lista                {                    *inicio = p->prox;     //Então poe o próximo nodo da lista no nodo atual(começo da lista)                }                else                    pr->prox = p->prox;   //Atribui o próximo nodo em p ao proximo nodo em pr(que seria o nodo com o elemento à ser   //deletado)                printf("\nExclusao feita com sucesso\n");                break;            }

Se ainda assim tiver dando erro,então provavelmente deve ser a forma como voce ta armazenando os dados no arquivo ou lendo os dados no programa

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

mas o problema nao é na função excluir

deleta o arquivo banco de dados atual,cria um novo e faz novos cadastros

por exemplo,faz 3 cadastros e exclui o 2º elemento,na hora de adicionar ao arquivo no final do programa voce vai ver que ele só vai adicionar 2 elementos(o 1º e o 3º),o problema é que isso nao vai remover o outro elemento que ja tava no arquivo(no caso o 3º elemento)então quando voce ler o arquivo de novo na próxima vez que entrar no programa,ele vai ler até o 3º elemento(até aonde esta EOF)ficando com 1º elemento tendo o valor normal,o 2º tendo o valor do 3º elemento(que foi atribuido ao nodo do 2º elemento na função excluir),e o 3º elemento vai ta la intocado no arquivo..

uma das formas de voce resolver isso seria abrir o arquivo só para leitura e depois na hora de gravar os dados no arquivo,apagaria o arquivo atual e criaria um novo com os dados da lista atual

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Ok Atlos, eu ate poderia fazer esse teste de excluir o banco de dados na mão e depois fazer novos cadastros, para testar, o problema é q ele não compila da sempre aquele erro na linha: 

 

*inicio = p->prox;

 

no mesmo lugar, na verdade se ele so excluir ja ta bom, vou entregar assim mesmo para meu Prof, ja estou cansado desse código, estou em cima dele já algum tempo quebrando a cabeça.

 

Obrigado.

Link para o comentário
Compartilhar em outros sites

O ERRO GERADO NO COMPILADOR É ESSE:

 

In function 'void excluir(consulta*)
[Error] no match for 'operator=' (operand types are 'consulta' and 'consulta*)
[Note] candidate is:
[Note] consulta& consulta::operator=(const consulta&)
[Note] no known conversion for argument 1 from 'consulta*' to 'const consulta&'
 
 
 
CODIGO ABAIXO:
 
 
// EXCLUIR REGISTRO
void excluir (struct consulta *inicio){
    
    if (inicio == NULL) printf("Sem registros");
    else {
    int cod, cont = 0;
    consulta *p = inicio;
    consulta *pr = p;
printf("\nEntre com o codigo do registro que deseja excluir: ");
    scanf("%d", &cod);
   
    do {
    int numer = atoi(p -> numero);
    if (cod == numer){
    cont = 1;
    if (pr == NULL){
    * inicio = p -> prox;
                  }
    else 
    pr -> prox = p -> prox; //Atribui o próximo nodo em p ao nodo atual
            printf("\nExclusao feita com sucesso\n");
            break;
                    }
    pr = p; //Nodo atual em p agora em pr
    p = p -> prox;  //proximo nodo em p
   
      } while (p !=NULL);
      
      if (cont == 0){
                 printf("\nRegistro nao localizado. \n");
                           }
         }
    
}
 
O ERRO É NESSA LINHA:
 
                                * inicio |= p -> prox;
 
O CURSOR FICA PISCANDO EXATAMENTE ONDE EU FIZ A MARCAÇÃO.
 
OBRIGADO !!
 
Link para o comentário
Compartilhar em outros sites

é porque voce tava pegando só um ponteiro no parametro da função,quer dizer,voce tava tentando atribuir um ponteiro(prox)à um objeto lista(*inicio),no caso aqui teria que ser uma referencia para um ponteiro(**)(ou ponteiro para ponteiro tanto faz..)

aqui ta o código com algumas alterações

void excluir (struct consulta **inicio){    if (inicio == NULL) printf("Sem registros");    else    {        int cod, cont = 0;        consulta *p = *inicio;        consulta *pr = NULL;        printf("\nEntre com o codigo do registro que deseja excluir: ");        scanf("%d", &cod);        do        {            int numer = atoi(p->numero);            if (cod == numer)            {                cont = 1;                if (pr == NULL)                {                    *inicio = p->prox;                }                else                    pr->prox = p -> prox;  //proximo nodo em p                printf("\nExclusao feita com sucesso\n");                break;            }            pr = p; //Nodo atual em p agora em pr            p = p->prox;  //proximo nodo em p        } while (p !=NULL);        if (cont == 0)        {            printf("\nRegistro nao localizado. \n");        }    }}

Isso deve excluir um elemento em qualquer posição,mas o programa ainda tem alguns erros..

Quando for passar como argumento o ponteiro "lista" para a função excluir,tem que passar uma referencia pro ponteiro,assim:

excluir(&lista);

pra minizar os aborrecimentos na próxima que for fazer um programa,a cada função que voce criar,testa pra ver se ela ta fazendo o que voce pretende,ve se o programa ta entrando nos blocos que tem que entrar,quando for usar uma função standard procura ver como ela age internamente(tem muito livros sobre isso e sites tambem) e se isso vai influenciar de algum modo no seu programa,bons estudos

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Fiz as alterações exatamente igual você escreveu acima, agora quando vou compilar não aparece mais nenhuma tarja vermelha de erro no código, parece q esta tudo certo, mas abaixo no Dev-C++, mostra um erro.  

 

(.text+0x267): undefined reference to `excluir(consulta*)'

[Error] ld returned 1 exit status

 

E ele não compila...

 

Obrigado !!

Link para o comentário
Compartilhar em outros sites

[Error] cannot convert 'consulta*' to 'consulta**' for argument '1' to 'void excluir(consulta**)'

 

_______________________________________

 

case 5:
            excluir ( lista);             //ERRO NESSA LINHA, CURSOR BEM ONDE ESTA A MARCAÇÃO
            break;

 

_______________________________________

 

OBRIGADO !!

Link para o comentário
Compartilhar em outros sites

Nossa !! Desculpe descuido meu, deve ser pelo estresse mesmo, agora sim rodou certinho, cara sem palavras para descrever minha gratidão e na verdade não só por você me ajudar com o trabalho, é realmente admirável alguém assim como você, disposto a ajudar os outros, Gostaria muito de poder ser seu amigo, seria um prazer, pois o mundo esta em falta de pessoas do bem, poderia me enviar uma msg com seu contato? E-mail, Facebook...

 

Vamos ser Amigos, pode contar comigo, se eu poder t ajudar em alguma coisa, vou me empenhar para fazer....

 

Muito obrigado !!!! 

Link para o comentário
Compartilhar em outros sites

obrigado..que bom que conseguiu(eu ja ia pedir arrego),mas qualquer um aqui faz o mesmo quando ve que a pessoa esta se ajudando tambem,provavelmente só nao vieram porque viram que eu conseguiria ajudar

se quiser fazer algo pode vim ajudar tambem quando se sentir confortavel,bons estudos

 

abraço!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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