Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
keytous

Escluir Registro em C/C++

Recommended Posts

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;

                       }

}

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

Editado por keytous

Compartilhar este post


Link para o post
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

Editado por atlos
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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 !!

    Compartilhar este post


    Link para o post
    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

    Editado por atlos
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Obrigado Amigo, porém fiz as suas alterações, mas esta ocorrendo o mesmo problema exatamente no mesmo lugar na mesma linha.

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    entendo,mas falta pouco,se puder dizer qual o erro que o compilador ta gerando e passar mais uma vez o código da função excluir seria bom,pode ser algum erro bobo que voce nao ta vendo por causa do cansaço x)

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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 !!
     

    Compartilhar este post


    Link para o post
    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

    Editado por atlos
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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 !!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    tem que mudar a assinatura da função tambem no começo do programa

    void excluir (struct consulta *inicio);

    substitui por

    void excluir (struct consulta **inicio);
    Editado por atlos
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • [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 !!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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 !!!! 

    Compartilhar este post


    Link para o post
    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!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×