Physically delete a struct type record

1

I need to physically delete a record created within a struct defined in my program, but in every way I tried (Set it to NULL , Create another struct and save all records that were not deleted in it ).

I registered the following records within a vector ( struct ):

  • Joao
  • Maria
  • Jose
  • Pedro
  • Paulo
  • and when I delete the 3 - Jose I need my vector to look like this:

  • Joao
  • Maria
  • Pedro
  • Paulo
  • Code:

    // Definindo as bibliotecas padrao
    
    #include <stdio.h>
    #include <stdlib.h>
    
    // Definindo as contantes utilizadas
    
    #define MAX 10
    
    // Definindo um tipo de estrutura com o nome movimento
    
    typedef struct {
        int id_doc;
        char nome_doc[50];
        char data_reg[10];
        char nome_resp[50];
        int num_orig;
        char tipo_doc;
    
    // Campo para definir se o registro esta habilitado ou nao
    
        char status;
    }movimento;
    
    // Declarando as variaveis auxiliares
    
    void inclui_dados(int, movimento *);
    void novo_mov(int *, movimento *);
    void imprime_registro(movimento *);
    void modifica_registro(int *, movimento *);
    void desabilita_registro(int *, movimento *);
    void habilita_registro(int *, movimento *);
    void excluir_registro(int *, movimento *);
    
    // Inicio do programa
    
    int main(){
    
        // Declarando uma estrutura do tipo movimento
    
        movimento reg_mov[MAX];
    
        // Declarando as variaveis do tipo inteiro e caracter
    
        int cont_registro = 0;
        char ch, op, i;
    
        // Definindo a formatacao da tela
    
        system("color 1E");
    
        // Faca
    
        do{
    
            // Limpando a tela
    
            system("CLS");
    
            // Exibindo horario e data de inicializacao do sistema
    
            printf("Sistema iniciou em Data: %s\t\tHora: %s\n\n", __DATE__, __TIME__);
    
            // Apresentando as opcoes para o usuario
    
            puts("Entre com o operador:\n1 - Cadastro\n2 - Consulta\n3 - Modificar\n4 - Desativar\n5 - Habilitar\n6 - Excluir\ns - Sair\n");
    
            // Armazena a opcao solicitada
    
            ch = getchar(); fflush(stdin);
    
            // Seleciona a opcao
    
            switch (ch)
            {
    
                // Caso 1 chame a funcao para cadastrar novos registros
    
            case '1':
    
                // Funcao para cadastrar novo documento
    
                novo_mov(&cont_registro, &reg_mov[0]);
                break;
    
                // Caso 2 chame a funcao para imprimir os registros
    
            case '2':
    
                // De 0 ate o numero de registro cadastrados incremente em uma unidade
    
                for (i = 0; i<cont_registro; i++){
    
                    // Se o status do registro for s faca
    
                    if ((reg_mov + i)->status == 's'){
    
                        // Funcao para imprimir os registros
    
                        imprime_registro(&reg_mov[i]);
    
                        // Verifica com o usuario se deseja imprimir mais um registro
    
                        printf("Imprime mais um(s/n)?");
    
                        // Armazena a opcao selecionada
    
                        op = getchar(); fflush(stdin);
    
                        // Se nao termine o laco
    
                        if (op == 'n')
                            break;
                    }
    
                    // Se nao
    
                    else{
                    }
                }
                break;
    
                // Caso 3 chame a funcao para modificar os registros            
    
            case '3':
    
                // Funcao para modificar os registros
    
                modifica_registro(&cont_registro, &reg_mov[0]);
                ch = getchar(); fflush(stdin);
                break;
    
                // Caso 4 chame a funcao para desabilitar um registro
    
            case '4':
    
                // Funcao para desabilitar um registro
    
                desabilita_registro(&cont_registro, &reg_mov[0]);
                ch = getchar(); fflush(stdin);
                break;
    
                // Caso 5 chame a funcao para desabilitar um registro
    
            case '5':
    
                // Funcao para habilitar um registro
    
                habilita_registro(&cont_registro, &reg_mov[0]);
                ch = getchar(); fflush(stdin);
                break;
    
                // Caso 6 chame a funcao para excluir um registro
    
            case '6':
    
                // Funcao para habilitar um registro
    
                excluir_registro(&cont_registro, &reg_mov[0]);
                ch = getchar(); fflush(stdin);
                break;
            }
        }
    
        // Enquanto
    
        while (ch != 's');
    
        // Retorna zero ou erro de execucao
    
        return 0;
    }
    
    // Inicio da funcao para incluir um novo registro no vetor
    void novo_mov(int *idx, movimento *pt_mov){
        pt_mov += (*idx);
        inclui_dados(0, pt_mov);
        (*idx)++;
    }
    // Fim da funcao para incluir um novo registro no vetor
    
    // Inicio da funcao para incluir os dados de um novo registro
    void inclui_dados(int n, movimento *pt_mov){
    
        // Limpa a tela
    
        system("CLS");
    
        // Cadastro do registro
    
        printf("\nCadastra Registro\n\n");
    
        // Se n for diferente de 0 pule a primeira etapa
    
        if (n == 0){
    
            // Solicita a identificacao do documento
    
            printf("Identificador do documento:");
    
            // Armazena a identificacao do documento
    
            scanf_s("%d", &(pt_mov->id_doc)); fflush(stdin);
        }
    
        // Solicita e armazena os demais dados do documento
    
        printf("Nome do documento:");
        gets_s(pt_mov->nome_doc);
        printf("Data do Registro:");
        gets_s(pt_mov->data_reg);
        printf("Nome do responsavel:");
        gets_s(pt_mov->nome_resp);
        printf("Numero do doc de origem:");
        scanf_s("%d", &(pt_mov->num_orig)); fflush(stdin);
        printf("Tipo do documento:");
        scanf_s("%c", &(pt_mov->tipo_doc)); fflush(stdin);
    
        // Define o status do documento como s para habilitado
    
        pt_mov->status = 's';
    }
    // Fim da funcao para incluir os dados de um novo registro
    
    // Inicio da funcao para imprimir um registro
    void imprime_registro(movimento *pt_mov){
    
        // Limpa a tela
    
        system("CLS");
    
        // Imprime o registro
    
        printf("\nImprime Registro\n\n");
    
        // Imprime os dados do registro
    
        printf("Identificador do documento: %d\n", pt_mov->id_doc);
        printf("Nome do documento: %s\n", pt_mov->nome_doc);
        printf("Data do Registro: %s\n", pt_mov->data_reg);
        printf("Nome do responsavel: %s\n", pt_mov->nome_resp);
        printf("Numero do doc de origem: %d\n", pt_mov->num_orig);
        printf("Tipo do documento: %c\n", pt_mov->tipo_doc);
        printf("Status (S para habilitado e N para desabilitado): %c\n", pt_mov->status);
    }
    // Fim da funcao para imprimir um registro
    
    // Inicio da funcao para modificar um registro
    void modifica_registro(int *idx, movimento *pt_mov){
    
        // Declara as variaveis do tipo inteiro e caractere
    
        int i, id;
        char op;
    
        // Limpa a tela
    
        system("CLS");
    
        // Modifica o registro
    
        printf("\nModifica Registro\n\n");
    
        // Solicita o documento a ser modificado
    
        printf("Entre com o codigo do documento:");
    
        // Armazena o documento a ser modificado
    
        scanf_s("%d", &id); fflush(stdin);
    
        // De zero ate o valor de idx incremente em uma unidade
    
        for (i = 0; i<(*idx); i++){
    
            // Verifica se o registro existe
    
            if ((pt_mov + i)->id_doc == id){
    
                // Funcao para imprimir o registro
    
                imprime_registro(pt_mov + i);
    
                // Verifica se o registro impresso sera o mesmo a ser modificado
    
                printf("Deseja modificar(s/n)?");
                op = getchar(); fflush(stdin);
    
                // Se nao retorne para o menu principal
    
                if (op == 'n')
                    return;
    
                // Se sim chame a funcao para incluir dados no registro
    
                inclui_dados((int)1, (pt_mov + i));
            }
        }
    }
    // Fim da funcao para modificar um registro
    
    // Inicio da funcao para desabilitar um registro
    void desabilita_registro(int *idx, movimento *pt_mov){
    
        // Declara as variaveis do tipo inteiro e caractere
    
        int i, id;
        char op;
    
        // Limpa a tela
    
        system("CLS");
    
        // Desabilita o registro
    
        printf("\nDesabilita Registro\n\n");
    
        // Solicita o documento a ser desabilitado
    
        printf("Entre com o codigo do documento:");
    
        // Armazena o documento a ser desabilitado
    
        scanf_s("%d", &id); fflush(stdin);
    
        // De zero ate o valor de idx incremente em uma unidade
    
        for (i = 0; i<(*idx); i++){
    
            // Verifica se o registro existe
    
            if ((pt_mov + i)->id_doc == id){
    
    
    
                // Confirma se o mesmo deve ser desabilitado
    
                printf("Deseja desativar(s/n)?");
                op = getchar(); fflush(stdin);
    
                // Se nao retorne para o menu principal
    
                if (op == 'n'){
                    return;
                }
                else{
    
                    // Se sim confirme a operacao
    
                    (pt_mov + (id - 1))->status = 'n';
                    return;
                }
            }
        }
    }
    // Fim da funcao para desabilitar um registro
    
    // Inicio da funcao para habilitar um registro
    void habilita_registro(int *idx, movimento *pt_mov){
    
        // Declara as variaveis do tipo inteiro e caractere
    
        int i, id;
        char op;
    
        // Limpa a tela
    
        system("CLS");
    
        // Desabilita o registro
    
        printf("\nHabilita Registro\n\n");
    
        // Solicita o documento a ser habilitado
    
        printf("Entre com o codigo do documento:");
    
        // Armazena o documento a ser habilitado
    
        scanf_s("%d", &id); fflush(stdin);
    
        // De zero ate o valor de idx incremente em uma unidade
    
        for (i = 0; i<(*idx); i++){
    
            // Verifica se o registro existe
    
            if ((pt_mov + i)->id_doc == id){
    
                // Confirma se o mesmo deve ser habilitado
    
                printf("Deseja ativar(s/n)?");
                op = getchar(); fflush(stdin);
    
                // Se nao retorne para o menu principal
    
                if (op == 'n'){
                    return;
                }
                else{
    
                    // Se sim confirme a operacao
    
                    (pt_mov + (id - 1))->status = 's';
                    return;
                }
            }
        }
    }
    // Fim da funcao para habilitar um registro
    
    
    // Inicio da funcao para excluir um registro
    void excluir_registro(int *idx, movimento *pt_mov){
    
        // Declara as variaveis do tipo inteiro e caractere
    
        int i, id;
        char op;
    
        // Limpa a tela
    
        system("CLS");
    
        // Desabilita o registro
    
        printf("\nExcluir Registro\n\n");
    
        // Solicita o documento a ser desabilitado
    
        printf("Entre com o codigo do documento:");
    
        // Armazena o documento a ser desabilitado
    
        scanf_s("%d", &id); fflush(stdin);
    
        // De zero ate o valor de idx incremente em uma unidade
    
        for (i = 0; i<(*idx); i++){
    
            // Verifica se o registro existe
    
            if ((pt_mov + i)->id_doc == id){
    
                // Confirma se o mesmo deve ser desabilitado
    
                printf("Deseja excluir(s/n)?");
                op = getchar(); fflush(stdin);
    
                // Se nao retorne para o menu principal
    
                if (op == 'n')
                    return;
    
                // Se sim altere o status do registro para N de desabilitado
    
                else
                {
                    // O que fazer para excluir o registro
                }
            }
        }
    
    }
    // Fim da funcao para excluir um registro
    
        
    asked by anonymous 29.08.2015 / 15:30

    2 answers

    1

    The code is confusing and has several things that should be otherwise. But I will focus on your problem without passing the code since it is difficult to put together something that works without trying to understand all of it.

    You need to redo the reg_mov vector. You need to go through all of it and bring the "records" that will still remain to a position before. Then take your example, when you delete the record "3", you have to copy the "4" to the memory location where the "3" was, then copy the "5" to the "4" position and finally, if necessary, reset the data in the "5" position. Of course you have to downgrade the registry counter as well.

    There is no other way to do this within what you are doing. Of course in a real application this does not make sense and there are more suitable fingerprint structures.

        
    29.08.2015 / 15:45
    0

    Hey, you should just post a lot of code because nobody will read everything.

    First, this is an addition to what the bigown said. Arrays serving queues is not a good idea, because an array has a defined size, it can allocate more, but it gives too much work.

    Possible solution?

    You should have inside one of your structure a pointer to its structure, which will indicate the next position, if it is null then it is the end.

    So how do I remove an element?

    By doing iteration, arriving at the position prior to the desired one places in its pointer indicating the next element the address indicates by the pointer of the next one next.

    It's a bit hard to write and format because I'm on the phone.

    Here's a small example I've made, I hope it's legible link

        
    29.08.2015 / 21:38