Ir ao conteúdo

Posts recomendados

Postado

Entao... eu tenho que fazer a implementação um procedimento para inserir um item em uma determinada posição da lista.

Ja tenho a função de inserir,  remover, buscar, mas de inserir em uma determinada posição eu to travado.

Eu sei o que tenho que fazer...

Que é inserir na posição que eu quero, e pegar os elementos que estão la e arrastar pra direita. Mas nao to conseguindo passar isso pro codigo

 

<CODE>

#include <stdio.h>
#include <stdlib.h>
#define M 100

void inserePosicao (int pos, int *n, int *L) 
{
    int i, pos;
    if (pos>0 && pos <=M)
        if (pos==0)
            inserir(x,&n, L);
        else
            //......
    
    
    
}

int buscarSeq( int x, int n, int *L) {
    int i=0; 
    while (i<= n){
        if (L[i] == x) {
            return i;
        }
        i++;    
    }
    return -1;
}
void inserir(int x, int *n, int *L){
       if (*n < M-1) {
        if (buscarSeq(x,*n,L) == -1){
            *n = (*n)+1;
            L[*n]=x;
        }
        else
            printf("\nElemento j? existe\n");
    }
    else
                  printf("\nLista cheia!\n");
} 

void remover(int x, int *n, int *L){
    int i, indice;      
    if (*n >= 0) {
        indice= buscarSeq(x,*n,L);
        if (indice != -1){
            for (i=indice; i<*n; i++) 
                   L[i]=L[i+1];
            (*n)--;
        }
        else
            printf("\nElemento n?o existe\n");
    }
    else
           printf("\nLista vazia!\n"); 
}

void imprimir(int n, int *L){
    int i;
    if (n>=0){
        printf("\nIMPRESS?O DA LISTA\n");
        for(i=0; i<=n;i++){
            printf("%d ",L[i]);
        }
        printf("\n");
    }
    else{
        printf("\nLista vazia!\n");
    }
    
}

int main(){
    int L[M];
    int n=-1, op,x, pos;
    do{
        system("cls");
        printf("\nMenu de op??es - Lista Sequencial\n");
        printf("1- Inserir valor\n");
        printf("2- Buscar por um valor\n");
        printf("3- Remover um valor\n");
        printf("4- Exibir a lista\n");
        printf("5- Sair\n");
        printf ("6- Inserir posicao");
        printf("Informe sua op??o: ");
        scanf("%d", &op);
        switch(op){
            case 1:{
                printf("Informe o valor a ser inserido na lista: ");
                scanf("%d",&x);
                inserir(x,&n, L);
                break;
            }
            case 2:{
                int res;
                printf("Informe o valor a ser encontrado na lista: ");
                scanf("%d",&x);
                res = buscarSeq(x,n,L);
                if(res==-1){
                    printf("\nO valor n?o foi encontrado na lista!\n");
                }
                else{
                    printf("\nO valor %d foi encontrado na posi??o %d da lista\n",L[res], res);
                }
                break;
            }
            case 3:{
                printf("Informe o valor a ser removido da lista: ");
                scanf("%d",&x);
                remover(x, &n, L);
                break;
            }
            case 4:{
                imprimir(n, L);
                break;
            }
            case 5:{
                printf("\nFinalizando o programa\n");
                break;
            }
            case 6:{
                printf("Em que posicao [de 1 a %d] voce deseja inserir : ", M);
                scanf("%d",&pos);
                inserePosicao (pos,L);
                
            }
            default:{
                printf("\nOp??o inv?lida!\n");
                break;
            }
        }
        system("Pause");
    }while(op!=5);
    
}

 

  • Obrigado 1
Postado

Boa Noite,

 

6 horas atrás, Victor Vilardo disse:

Que é inserir na posição que eu quero, e pegar os elementos que estão la e arrastar pra direita. Mas nao to conseguindo passar isso pro codigo

 

Essas estruturas primitivas não permitem desligar e ligar células de memória em qualquer ponto, isso é perturbador quando precisas inserir um novo dado, e não é no fim delas. Uma alternativa é copiar tudo uma posição a esquerda a partir do seu último elemento (tail) até a posição desejada inclusive ela, livrando-a para o novo dado.

"

 

Basicamente, programe um 'loop' que percorre o vetor de trás para frente (do último elemento até aquela na posição desejada) enquanto copia no próprio array seus dados, para isso faça o índice a direta (do sinal de atribuição''='') 1+ que o da esquerda.

 

array [index + 1]= array [index]

Antes de tudo é preciso determinar se o novo dado é uma duplicata, logo essa parte das ações de inserir é necessário aqui também.

 

Depois fazer de inserir (que insere na última posição) um método derivado de inserePosicao é fácil só para reutilizar o código, porém não é necessário.

 

"

 

  • Curtir 1
Postado
15 horas atrás, Victor Vilardo disse:

Eu sei o que tenho que fazer...

Que é inserir na posição que eu quero, e pegar os elementos que estão la e arrastar pra direita. Mas nao to conseguindo passar isso pro codigo

 

  • Sua lista não deve ser só o modesto vetor. Só vai te dar mais trabalho assim:
     
     int L[M];


    do que por exemplo
     

    typedef struct 
    {
    	unsigned	tamanho;
    	unsigned 	limite;
        int			L[M];
      
    }   Lista;


    Se usar a segunda opção pode manter dentro da Lista o tamanho máximo e a contagem atual de ítens
     

  • main() deve ser sempre a primeira função de seu programa. Se possível em um arquivo separado. Se imagina que não vá compilar o código da lista a vida toda, por exemplo.

De volta ao programa:
 

A lógica para inserir na posição não muda quase nada em relação a inserir no fim ou no início ou --- o mais útil --- inserir na ordem. Em geral numa lista se quer inserir por alguma ordem, de título, de peça, de peso, de distância, qualquer coisa. São poucos casos --- exceto os exercícios para estudantes --- em que se insere apenas no início por exemplo.
 

Para inserir Y na posição N você precisa antes de tudo determinar se sua lista tem ao menos (N-1) elementos. E resolver o que fazer se não tem: insere no final ou cancela a operação.

 

Se tem ao menos (N-1) elementos, apenas se posicione na origem e num simples loop avance (N-1) elementos. Se você não tem um controle atualizado do tamanho da lista vai mesmo começar por aqui ;) 

 

Ao avançar (N-1) está na posição de inserção, onde está um X. Apenas precisa saber se este elemento X era o último. X claro vai apontar para Y o novo cara. O anterior a Y será claro X.

E se X não era o último o que vinha depois dele vai vir agora depois de Y. E o que vinha antes do sucessor de X não será mais X e sim Y.

Nada mais. 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

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

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!