Enunciado 1: Inserir um novo elemento num vetor ordenado.
Algoritmo:
1) Pesquisar a posição onde inserir o novo elemento (adaptar o algoritmo de pesquisa sequencial,
de forma a que devolva a posição onde inserir o novo elemento)
2) Realocar memória para mais um elemento do vetor
3) Avançar uma posição todos os elementos do vetor desde a posição de inserção
4) Inserir o novo elemento na posição de inserção
Resolução
1) Pesquisar a posição onde inserir o elemento NovoElem no vector V de tamanho tam
k ← -1 // significa que Elem ainda não foi encontrado em V
i ← 0 // índice dos elementos do vector V
Enquanto (i < tam) e (k = -1) Fazer
Se (V[i] = Elem) então
k ← i
// significa que o NovoElem deve ser inserido na posição i do vetor (antes de um
elemento igual)
senão
Se (V[i] < Elem) então
i←i+1
senão
k ← i;
// significa que o NovoElem deve ser inserido na posição i do vetor
Se (k ≥ 0) então
NovoElem deve ser inserido na posição k
senão
NovoElem deve ser inserido na última posição de V (depois de aumentado o tamanho de V)
Função em C:
int DeterminarPosicaoInsercao (int NovoElem, int V[], int tam)
{
int i = 0, k = -1;
// k = posição onde deve ser inserido o NovoElem
// k= -1 significa que NovoElem deve ser inserido na última posição de V depois do tamanho
deste ter sido aumentado em 1 unidade
while ( (i < tam) && (k == -1) )
if (NovoElem == V[i])
k = i;
else
if (V[i] < NovoElem)
i = i + 1;
else
k = i;
return (k);
}
Função em C para inserir o elemento NovoElem num vetor V de tamanho tam:
int *InserirElementoVetor (int NovoElem, int V[], int *tam)
{
int pos, i;
pos = DeterminarPosicaoInsercao (NovoElem, V, *tam);
*tam = (*tam) + 1;
// Aumentar em 1 unidade o tamanho do vetor V
V = (int *) realloc (*tam, sizeof(int)); // Realocar memória após atualização do tamanho de V
if (pos >= 0) { // Avançar uma posição todos os elementos de V desde posição pos
for (i = *tam-1; i > pos; i--)
V[i] = V[i-1];
else
pos = *tam-1;
V[pos] = NovoElem;
// Inserir NovoElem na posição pos
return (V);
}
Enunciado 2: Remover um elemento de um vetor ordenado.
Algoritmo:
1) Procurar o elemento no vetor.
2) Se o elemento não existe no vetor, TERMINAR.
3) Se o elemento existe no vetor,
a) Devolver a posição onde se encontra o elemento a remover (pos)
b) Recuar 1 posição todos os elementos desde a posição pos até ao último elemento
c) Diminuir o tamanho do vetor em 1 unidade, relocando memória para o vetor considerando
que o seu tamanho foi reduzido em 1 unidade
Função em C para remover o elemento Elem num vetor V de tamanho tam:
int *RemoverElementoVetor (int NovoElem, int V[], int *tam)
{
int pos, i;
// Usar a pesquisa binária iterativa – devolve a posição do elemento (se existir) ou -1 (senão)
pos = PesquisaBinaria (Elem, V, *tam);
if (pos < 0)
return (V); // Como Elem não existe em V, devolver o vetor tal como entrou
else // pos >= 0, logo Elem existe em V na posição pos
{
for (i = pos; i < *tam; i++) // Recuar 1 posição todos os elementos desde a posição pos
V[i] = V[i+1];
*tam = (*tam) - 1; // Diminuir em 1 unidade o tamanho do vetor V
V = (int *) realloc (*tam, sizeof(int)); // Realocar memória após atualização do tamanho de V
return (V); // Devolver o vetor depois de atualizado o seu tamanho
}
}
Download

Inserção e remoção de um elemento de um vetor ordenado