Ir para conteúdo
Fórum Script Brasil
  • 0

Como remover elemento de um vetor em C ?


Binder

Pergunta

Olá pessoal, gostaria de saber como remover um elemento inteiro de um vetor[100]. Após o elemento ser apagado não posso deixar espaço em branco no vetor.

Obs: Não posso utilizar função e nem ponteiros... Como devo fazer isso na linguagem C?

Exemplo : 10 20 30 40 50. (preenchi apenas as primeiras 5 posições do meu vetor)

Apaguei: 30

Vetor atual : 10 20 40 50.

Obrigado.

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Tecnicamente é impossível não deixar espaço em branco... Mesmo que você mova as posições seguintes para frente, vai ficar um espaço em branco na última posição.

Mas a solução é mais ou menos essa: Pegue a posição do elemento que quer tirar, sobrescreva-o com seu elemento seguinte, e vá fazendo este processo até chegar ao final do vetor.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá mJi,obrigado pela força... Fiz meu codigo, porem acho que tem erro. Pois eu digito os seguintes numeros (1,5,20,50,100), e peço para excluir o numero 5.

Era para ficar assim (1,20,50,100)

Mas está ficando assim (1,20,20,50,0)

Obs: "Ultimo", variavel para controle do vetor, percorre somente aonde está preenchido o vetor. Meu vetor é de 100 posições.

printf("Remover codigo igual a: \n");
scanf("%d",&removecodigo);

for(i=0;i<ultimo;i++)
{

    if(vet[i].codigo == removecodigo) 
    {
       vet[i].codigo = vet[i+1].codigo;
       vet[ultimo-1].codigo = 0;
    }
    printf("codigo = %d\n",vet[i].codigo);
}

Link para o comentário
Compartilhar em outros sites

  • 0

Você está atribuindo ao código que quer remover, o seu sucessor, e isto está correto. Mas você tem de sobreescrever também este sucessor pelo seu sucessor, e fazer isto até chegar ao fim. Ou seja, você tem de mover todos os elementos do vetor que vêm depois do código que você quer remover, uma casa para a esquerda.

Um segundo 'for' dentro do 'if' pode fazer isto.

Link para o comentário
Compartilhar em outros sites

  • 0

Com esse seu código você sempre perderá o valor do <ultimo-1> elemento. A cada passada do loop você atribui 0 nessa posição.

Eu não entendi se você tem o tamanho do vetor (qtd de valores preenchidos) ou se você usa um valor de controle no fim do vetor, para marcar onde ele acaba.

Também não entendi se você quer remover todas as ocorrências de um certo "código" do vetor, ou se todas.

Eu fiz esse código rapidinho, ele utiliza um sentinela no fim e remove apenas a primeira incidência do valor.

Espero que ajude:

#include <stdio.h>

int main (int argc, char* argv[])
{
    int vetor[100] = {0,5,10,20,30, -42}; // preeencher vetor com scanf

    int remove, sentinela, i;

    remove = 5;                     // preeencher depois com scanf
    sentinela = -42;                // você disse que usa um controle, ele
                                    // deve estar sempre presente no fim do vetor   
    i = 0;
    while (vetor[i] != sentinela)
    {
        if (vetor[i] == remove)
        {
            vetor[i] = vetor[i + 1];
            if (vetor[i] != sentinela)
               vetor[i + 1] = remove;
        }

        i++;
    }

    for (i = 0; vetor[i] != sentinela; i++)
        printf("%d\n", vetor[i]);
return 0;
}

Link para o comentário
Compartilhar em outros sites

  • 0

Estou usando structs, e tenho um vetor de 100 posições vet[100]. Insiro manualmente os valores no vetor(não preciso preencher ele

até o final) Ex: preencho apenas 5 valores nele o resto fica em branco. Utilizo uma variavel chamada "ultimo", e faço um for

para percorrer de 0 até ultimo(ultima posição preenchida no meu vetor).

Preciso remover um numero que exista no vetor, e alocar todos seus posteriores para esquerda até o final do vetor.

Ex: Digitei isso no vetor: (1,5,20,50,100)

Removi o numero: 5

Ficaria assim: (1,20,50,100).

Obs: não aprendi ainda a utilizar "sentinela", e não posso utilizar funções,ponteiros... tenho que fazer no "for",mesmo.

mas desde já agradeço pela sua atenção.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá!

O código que você criou está quase certo. Como dito pelo mJi, faltou apenas o for que faria a cópia de todos os elementos a seguir, não apenas o seguinte.

Assim o código correto seria:

printf("Remover codigo igual a: \n");
scanf("%d",&removecodigo);

for(i=0;i<ultimo;i++)
{

    if(vet[i].codigo == removecodigo)
    {
       for(j=i; j<ultimo-1; j++)
          vet[j].codigo = vet[j+1].codigo;
       ultimo--;
    }
    printf("codigo = %d\n",vet[i].codigo);
}

Não precisamos "apagar" o valor do último elemento pois ele não será exibido. E devemos subtrair 1 da variável último pois removemos 1 elemento.

O loop do j percorre até último-1 pois dentro do loop acessamos o elemento seguinte ao contador.

Não esqueça de declarar a variável j!

Link para o comentário
Compartilhar em outros sites

  • 0

Fiz um parecido:

#include <stdio.h>

main()

{

int v[12]={3,6,4,7,11,5,78,90,23,90,51,0};

int i, remove;

printf("O vetor atual contem os seguinte numeros: 3,6,4,7,11,5,78,90,23,90,51,0.\n");

printf("Informe o numero que deseja excluir:\n");

scanf("%d", &remove);

for(i=0;i<=11;i++)

{

if (remove==v)

{

v = v[i + 1];

v[i + 1] = remove;

}

}

printf("O novo vetor é:");

for (i = 0; i<=10; i++)

{

printf("%d, ", v);

}

system("pause");

}

Link para o comentário
Compartilhar em outros sites

  • 0
Em 01/11/2011 at 16:28, Marcelo Utikawa da Fonseca disse:

Olá!

 

O código que você criou está quase certo. Como dito pelo mJi, faltou apenas o for que faria a cópia de todos os elementos a seguir, não apenas o seguinte.

Assim o código correto seria:

 

Alguém pode me enviar esse código completo?

 

printf("Remover codigo igual a: \n");
scanf("%d",&removecodigo);

for(i=0;i<ultimo;i++)
{

    if(vet[i].codigo == removecodigo)
    {
       for(j=i; j<ultimo-1; j++)
          vet[j].codigo = vet[j+1].codigo;
       ultimo--;
    }
    printf("codigo = %d\n",vet[i].codigo);
}

 

 

Não precisamos "apagar" o valor do último elemento pois ele não será exibido. E devemos subtrair 1 da variável último pois removemos 1 elemento.

O loop do j percorre até último-1 pois dentro do loop acessamos o elemento seguinte ao contador.

Não esqueça de declarar a variável j!

 

Link para o comentário
Compartilhar em outros sites

  • 0
Em 01/11/2011 at 16:28, Marcelo Utikawa da Fonseca disse:

Olá!

 

O código que você criou está quase certo. Como dito pelo mJi, faltou apenas o for que faria a cópia de todos os elementos a seguir, não apenas o seguinte.

Assim o código correto seria:

 

 

 

printf("Remover codigo igual a: \n");
scanf("%d",&removecodigo);

for(i=0;i<ultimo;i++)
{

    if(vet[i].codigo == removecodigo)
    {
       for(j=i; j<ultimo-1; j++)
          vet[j].codigo = vet[j+1].codigo;
       ultimo--;
    }
    printf("codigo = %d\n",vet[i].codigo);
}

 

 

Não precisamos "apagar" o valor do último elemento pois ele não será exibido. E devemos subtrair 1 da variável último pois removemos 1 elemento.

O loop do j percorre até último-1 pois dentro do loop acessamos o elemento seguinte ao contador.

Não esqueça de declarar a variável j!

 

De qualquer forma, quando o programa encontrar o mesmo valor (dado pelo usuário e guardado na variável removecodigo) na posição subsequente do vetor, ele irá simplesmente ignorá-lo.

Link para o comentário
Compartilhar em outros sites

  • 0
Em 31/10/2011 at 23:51, Binder disse:

Olá pessoal, gostaria de saber como remover um elemento inteiro de um vetor[100]. Após o elemento ser apagado não posso deixar espaço em branco no vetor.

 

Obs: Não posso utilizar função e nem ponteiros... Como devo fazer isso na linguagem C?

 

 

 

 

Exemplo : 10 20 30 40 50. (preenchi apenas as primeiras 5 posições do meu vetor)

Apaguei: 30

Vetor atual : 10 20 40 50.

 

 

 

Obrigado.

Amigo, você pode usar ponteiros para essa ação

Um exemplo bem tosco de como você pode fazer essa operação e obter o resultado que você deseja

    int vetor[5]; // Vetor que contém os valores
    int* vetorNovo=(int *)malloc(sizeof(int)); // Ponteiro para o novo vetor
    int* InicioDoVetorNovo=vetorNovo; // Posição inicial do 'vetorNovo'

    vetor[0]=10; // Simulando entrada de valores
    vetor[1]=20;
    vetor[2]=30;
    vetor[3]=40;
    vetor[4]=50;

	// Aqui vem a 'manha' você pode substituir os valores 'apagados' por algum caractere especial
    vetor[2]='\#'; // No caso usei '#', aqui não ocorre problema de definição de tipo porque o '\#' é o um 'número', por isso esse exemplo não é muito eficiênte. Mas funciona
    vetor[4]='\#';
	
	// Ira mostrar os dados
    printf("%i, %i, %c, %i, %c",vetor[0],vetor[1],vetor[2],vetor[3],vetor[4]); 

    for(int i=0;i<5;i++) // 5 é o tamnho do vetor que pode ser obtido com à função 'strlen'
    {
      	// Caso o valor contido em 'vetor' seja diferente do caractere especial que você usou
        if(vetor[i] != '\#' && vetor[i] != NULL) // 
        {
            *vetorNovo=vetor[i]; // Adiciona esse valor no seu vetor
            vetorNovo++; // Soma '''''+1 int'''''' no vetorNovo
          	/*
            	Caso você desconheça o uso de ponteiros, o melhor é começar a estuda-los quando você estiver um pouco mais afiado na linguagem  
           */
        }
    }
    vetorNovo=InicioDoVetorNovo; // Recupera o ind de mémoria do 'vetorNovo'					   /-----> VETORNOVO ESTÁ REPETIDO
     printf("\n%i, %i, %i, %i, %i",vetorNovo[0],vetorNovo[1],vetorNovo[2],vetorNovo[3],vetorNovo[3]); // Mostra todos os valores do vetor que não foram '''apagados'''

//Você também pode remover o vetor antigo, mas como esse código é básico, não tem a nescessidade de performace

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...