Physically delete a struct type record

Asked

Viewed 2,642 times

1

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

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

  1. Joao
  2. Maria
  3. Jose
  4. Peter
  5. Paul

and by excluding the 3 - Jose I need my vector to look like this:

  1. Joao
  2. Maria
  3. Peter
  4. Paul

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
  • 1

    Format the question better, or put all the relevant source code on http://pastebin.com/

  • 1

    http://meta.pt.stackoverflow.com/q/4255/101

2 answers

1


The code is confusing and there are several things that should be otherwise. But I will focus on your problem without giving you the code since it is difficult to assemble something that works without trying to understand it all.

You need to redo the vector reg_mov. You need to go through it all and bring the "records" that will still remain to a position before. So taking your example, when you delete the "3" record, you have to copy the "4" to the memory position where the "3" was, then copy the "5" to the "4" position, and finally, if you find it necessary, reset the data that was in the "5" position. Evidently have to decrease the registration counter also.

There’s no other way to do this inside what you’re doing. Of course, in a real application this does not make sense and there are dedicated structures more suitable for the work.

  • Thank you very much for the reply Bigown, it is the first time I have put a question here and I still do not have much knowledge on the platform. Actually the code could be otherwise, but the teacher who passed the work wants the same to be done without using different functions (Example: malloc, free, fopen) that appear a lot over the internet.

  • You do not need to use these functions. As you have declared as an array the memory is already allocated. Just move the data. Do not touch the allocation. Note that you don’t even need to copy the vector to another vector. I said redo, that is, rebuild it. Think of a queue of people. One gives up the line and goes away, the back ones take a step forward and everything is solved, you do not need to form another line. This is what you have to do. Whoever was in the front, does not need to change places, who was behind, wins a seat. Only this.

0

Hey, you should just post a bunch of code 'cause no one’s gonna read it all.

First of all, this is an addition to what Maniero said. Arrays serving as queues is not a good idea, because a array has a set size, can allocate more, but it takes too much work.

Possible solution?

It should have in one of its 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?

Making an iteration, getting to the position previous to the desired puts in its pointer that indicates the next element the address indicated by the pointer of the next.

You got a little example made by me, I hope it’s readable

  • Thanks for the tips Krystalgamer, well, so I could understand this note would "skip" the record I want to delete, however, this record I skipped would not be in memory yet?

  • @Williamhoeflich what he is proposing is a better solution but will complicate your code.

  • @mustache worse than really the code is already huge and only using very simple things will be complicated to get at what he wants. I will try the solution that krystalgamer suggested above.

  • @Williamhoeflich is at your discretion, but it is something that will make your code much more complicated. In fact you will have to redo it all. And there’s one thing, if you do something you can’t explain to the teacher, it won’t do any good.

  • @mustache the worst is not the fact that can not explain, even knowing he does not want to use anything that was not passed in the room, it is difficult this way, I will try to do without redoing the code and if it does not work patience right.

  • @Williamhoeflich is not difficult, on the contrary. The simple, is the easy.

  • @bigown I was able to do what they had said, I created a chained list as suggested and it worked, I can physically delete the positions stored in the vector. Now a question, how do I put that my question has been resolved or would be a moderator to do that?

  • @Williamhoeflich you’ve already put.

Show 3 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.