Dúvida em lista criada em C

8 respostas
M

Bom dia pessoal estou no 1º ano do curso de Ciência da Computação e estou com muitas dúvidas nas aulas de estrutura de dados =/. O professor me passou o exercicio de uma lista em C, só que eu não estou entendendo o código dele para inserir valor na lista. Vou postar o código para vocês verem:

#include <iostream>
#include <string.h>
#include <conio.h>

using namespace std;

#define tam_max 10

typedef int LISTA[tam_max];

int inserir_antes (LISTA l, int tam, int pos, int &fim, int valor);
int acessar_lista (LISTA l, int tam, int pos, int fim, int &valor);
int remover_lista (LISTA l, int tan, int pos, int &fim, int &valor);
int altera_lista (LISTA l, int tam, int pos, int fim, int nvalor);


void mostrar_lista (LISTA l, int fim);

int main() 
{
  LISTA minhalista;
  int valor, final = 0, posicao,r;
  char op;
  
  do
   {
      system("cls");
      mostrar_lista (minhalista, final);
      puts ("\n\nMenu principal");
      puts ("\n\nEscolha a operacao que deseja realizar:");
      puts ("\n\n1- Inserir valor:");
      puts ("\n\n2- Acessar valor de uma posicao:");
      puts ("\n\n3- Alterar valor de uma posicao");
      puts ("\n\n4- Remover posicao:");
      puts ("\n\n5- Sair\n\nDigite a opcao:");
      op = getchar();

      switch (op) 
      
      {
           case '1':    puts ("\n\nDigite o valor (inteiro) a inserir: ");
                        scanf ("%d",&valor);
                        fflush(stdin);
                        puts ("\n\nDigite a posicao em que deseja inserir: ");
                        scanf ("%d",&posicao);
                        fflush(stdin);
                        r=inserir_antes(minhalista, tam_max, posicao-1, final, valor);
                        if (r==1) puts ("\n\nValor inserido com sucesso!");
                        else puts ("\n\nERRO NA INSERCAO!");
                        getchar();
                        break;
        
             case '2':  puts ("\n\nDigite a posicao a ser acessada: ");
                        scanf ("%d",&posicao);
                        fflush(stdin);
                        r=acessar_lista(minhalista, tam_max, posicao-1, final, valor);
                        if (r==1) printf ("\n\nValor %d encontrado na posicao %d da lista.", valor, posicao);
                        else puts ("\n\nERRO NO ACESSO!");
                        getchar();
                        break;
      
           case '3':    puts ("\n\nDigite o valor (inteiro) a ser alterado: ");
                        scanf ("%d",&valor);
                        fflush(stdin);
                        puts ("\n\nDigite a posicao em que deseja alterar: ");
                        scanf ("%d",&posicao);
                        fflush(stdin);
                        r=altera_lista(minhalista, tam_max, posicao-1, final, valor);
                        if (r==1) printf ("\n\nValor da posicao %d alterado com sucesso para %d.", posicao, valor);
                        else puts ("\n\nERRO NA ALTERAÃ?Ã?O!");
                        getchar();
                        break;
      
           case '4':    puts ("\n\nDigite a posicao em que deseja remover: ");
                        scanf ("%d",&posicao);
                        fflush(stdin);
                        r=remover_lista(minhalista, tam_max, posicao-1, final, valor);
                        if (r==1) printf ("\n\nValor %d removido com sucesso!", valor);
                        else puts ("\n\nERRO NA REMOÃ?Ã?O!");
                        getchar();
                        break;
      }    
      
    } while (op!='5');
    
}


void mostrar_lista (LISTA l, int fim)
 {
    puts ("\n\nSITUACAO DA LISTA\n\n");
    for (int i = 0; i < fim; i++)
         printf ("%d  ", l[i]);
    if (fim == 0) puts ("Lista Vazia");
    puts ("\n");
}

int inserir_antes (LISTA l, int tam, int pos, int &fim, int valor) 

{
    int ret, i;
    
    if (fim < tam)
    {
        if (pos < 0 || pos > fim)
           {
            puts ("\n\nPosicao Invalida para a insercao\n\n");
            ret=0;
           }
        else 
           {
            for (i=fim; i>pos; i--) 
            l[i]=l[i-1];   
            l[pos]=valor;
            fim++;
            ret =1;
           }
    }
      else
       {
        puts ("\n\nLista Cheia\n\n");
        ret = 0;
       };
    return (ret);
}

int acessar_lista (LISTA l, int tam, int pos, int fim, int &valor) 

{
    int ret, i;
    
    if (pos < 0 || pos >= fim)
           {
            puts ("\n\nPosicao Invalida para acesso\n\n");
            ret=0;
           }
        else 
             {
              valor=l[pos];
              ret =1;
            }
    
      
    return (ret);
}


int altera_lista (LISTA l, int tam, int pos, int fim, int nvalor) 

{
    int ret, temp;
    
    if (pos < 0 || pos >= fim)
           {
            puts ("\n\nPosicao Invalida para alteracao\n\n");
            ret=0;
           }
        else 
             {               
              l[pos]=nvalor;
              ret =1;
              }
    
      
    return (ret);
}

int remover_lista (LISTA l, int tam, int pos, int &fim, int &valor) 

{
    int ret, i;
    
    if (pos < 0 || pos >= fim)
          {
            puts ("\n\nPosicao Invalida para remocao\n\n");
            ret=0;
           }
        else 
           {
	        valor=l[pos];
            for (i=pos; i<fim-1; i++) 
                 l[i]=l[i+1];
            fim--;
            ret=1;
            }
    
      
    return (ret);

Pelo que eu entendi nas explicações, quando vamos inserir um valor na lista e ela ja está preenchida na posição que queremos adicionar o valor, é necessário alocar os valores depois da posição que será inserido o valor para a direito, e a função de remover valores fará com que os valores depois da posição removida serem alocados para a esquerda. Porém pelo código que o professor passou ele criou um for com um incremento e eu não consigo entender como esse for irá parar.

Alguem pode me explicar a funcão para inserir na lista?

Desde já agradeço.

8 Respostas

JuniorMaia

int valor, final = 0, posicao,r; aqui você esta declarando algumas variavis inteiras, inclusive a posicao.

aqui você diz qual é a posição da inserção

puts ("\n\nDigite a posicao em que deseja inserir: "); scanf ("%d",&posicao);

aqui você chama a função inserir_antes, e passa juntos com os demais parametros a posicao -1

aqui você recebe os valores passados para a função, a variavel int pos se referencia ao valor que será passado la em cima pela posicao-1

aqui o seu for se inicia na posição fim (valor recebido na função) e é decrementado até chegar no próximo valor de pos (i>pos)

quando i for < que pos, seu for para.

douglas_arantes

Cara tenta executar esse trecho de código no papel, ai você vai conseguir entender.

Repare que dentro do FOR só existe uma instrução que é :

for (i=fim; i>pos; i–)
l[i]=l[i-1];

ou seja ele esta movendo os valores desse vetor, um a um, até chegar na posição informada, " i > pos", quando i for menor que pos a instrução FOR se encerra.

E então, o a posição informada do vetor/lista recebe o valor, após isso incrementa a variável FIM, e devolve 1 informando que a inserção teve sucesso.

Espero ter ajudado.

M

Então, por exemplo:

O usuário digitou o valor = 5 e colocou na posição 1 (posicao -1 então sera na posição 0 da lista).
fim = 0
pos = 0
for (i=fim; i>pos; i–)
l[i] = l[i - 1]
l[pos] = valor
fim++
no 1º paso o fim = 0 então ele vai adicionar o 5 na posição 0, mas eu não entendo como essa repetição vai parar por que o i está sempre sendo decrementado e eu não estou conseguindo entender no código como o i será maior que pos para ele parar. Se o ir está sendo decrementado então ele está voltando e não indo pra frente para ele ser maior que o pos. Não estou entendendo nada hehe.

douglas_arantes

Cara mas olha só a variável fim, deve receber o valor do último índice da lista.

M

Então, mas o último indice da lista é a proxima posição vazia ou é a posição preenchida?

Então o FIM é a posição vazia do vetor certo?

douglas_arantes

Está vazia, repare que a função mostra_lista vai até " i < fim". for (int i = 0; i < fim; i++), ou seja não há nada nessa posição.

Quando você faz:

for (i=fim; i>pos; i)

l[i]=l[i-1];

Você “empurra” todos os valores da lista a partir da posição “pos” , um índice a frente, e então atribui o novo valor.

M

Blz, agora o for eu entendi, mas para empurar para frente não deveria ser assim?
l[i] = l[i+1] ??

Então o que está dentro do for é l[i] = l[i -1], quando o i>pos ele não entra no laço de repetição e adiciona o valor em pos e incrementa o fim, correto? Então se eu for inserir um valor na posição 0 ele nem vai entrar na condição por que o fim sera igual ao pos e não maior ai ele já irá colocar o valor na posição 0 e o fim vai ser incrementado, correto?

douglas_arantes

mazoni:
Blz, agora o for eu entendi, mas para empurar para frente não deveria ser assim?
l[i] = l[i+1] ??

Então o que está dentro do for é l[i] = l[i -1], quando o i>pos ele não entra no laço de repetição e adiciona o valor em pos e incrementa o fim, correto? Então se eu for inserir um valor na posição 0 ele nem vai entrar na condição por que o fim sera igual ao pos e não maior ai ele já irá colocar o valor na posição 0 e o fim vai ser incrementado, correto?

Para a seguinte lista:

0 ) 1) 2) 3) 4) 5) FIM
3 1 4 6 5 7 ???

adicionar o número 23 na posição 2

              1. FIM
                3 1 23 4 6 5 7 ???

Observe que “empurrei” os elementos uma posição para frente.

i = fim
ou seja L[i] é o fim da lista, que tem um valor qualquer “lixo”.

L[i] = l[i - 1], o fim ira receber o último número da lista, que a princípio era
o 7, ele vai fazer esse passo até o i ser decrementado e chegar no Posição
informada, ou seja já “empurrou” todos os elementos.
Agora a Posição 2 e posição 3, possuem o valor 4. Então o valor 23 e atribuido
a posição 2 sobrescrevendo o antigo valor.
E por fim a variável fim é incrementada.

Criado 7 de junho de 2012
Ultima resposta 7 de jun. de 2012
Respostas 8
Participantes 3