Jump to content
Sign in to follow this  
Devexz

listas encadeadas/ligadas

Recommended Posts

Devexz

Boas,

Estou a fazer um programa de listas ligadas mas nao sei como se mostra os valor lidos estou  apenas a fazer com dois numeros e se fossem 100 tinha de fazer dois cliclos um  para ler e outro para mostrar.

#include <iostream>
#include<stdlib.h>
using namespace std;

struct estrutura{

int valor;

estrutura *prox;

};

int main(){

estrutura *x;
x = new estrutura;

//declara as variáveis
estrutura * lista=NULL;
int valor_utilizador;


//insere o primeiro valor
cin >> valor_utilizador;                                                           //pede valor ao utilizador
lista = new estrutura;                      
lista->valor=valor_utilizador;                                                 
lista->prox=NULL;                                                                 


cin >> valor_utilizador;                                                           
lista->prox = new estrutura;             
lista->prox->valor=valor_utilizador;                                      
lista->prox->prox=NULL;                                                     

// como transformar esta parte em ciclo?
cout<<lista->valor<<endl;
cout<<lista->prox->valor;







    return 0;
}


Ás vezes, mais vale deixar a assinatura em branco.

Share this post


Link to post
Share on other sites
Edouardo

Criar uma variável ponteiro auxiliar que aponte para a primeira estrutura criada, e que percorra toda a lista até chegar ao NULL, como por exemplo exemplo:

estrutura * p = primeira_estrutura_da_lista; // p aponta para a primeira estrutura criada.
while (p!= NULL) // percorrer a lista encadeada até encontrar o valor NULL
{ 
     cout << p->valor << endl;
     p = p->prox; // p aqui passa a apontar para a próxima estrutura... 
}

Pelo menos a teoria seria essa.

...ou manter uma variável para a contagem das estruturas criadas em memória, depois é só executar um ciclo até ao número de estruturas criadas, mas utilizando mesmo assim um ponteiro auxiliar que percorre a lista até ao último...

Mas nunca te esqueças que cada new tem de ter o seu delete  ;)

Leitura de apoio sobre ponteiros

Leitura de apoio sobre listas encadeadas

Share this post


Link to post
Share on other sites
Devexz

Muito obrigado pela tua ajuda Edouardo :D

Agora resta me fazer um ciclo para ler valores estou a fazer algo assim:

do{

cin >> valor_utilizador; 

lista = new estrutura; 

lista->valor=valor_utilizador;

lista->prox=NULL;

}
while(valor_utilizador!=0);

Mas isto nao funciona!  Podem me ajudar e dizer porque?

obirgado pela vossa atençao!


Ás vezes, mais vale deixar a assinatura em branco.

Share this post


Link to post
Share on other sites
yyajsayy

Não funciona ou não mostra nada?

Não te esqueças que tens de deixar sempre um ponteiro para a cabeça da lista e no final qualquer operação é efectuada através dele.

Faz isso com funções, é de veras mais fácil, prático e eficiente.


"If it don't work the first time, rename it to version 1.0."

http://seguranca-informatica.pt

Share this post


Link to post
Share on other sites
Devexz

ja pensei usar em funcoes mas acho um pouco complicado neste codigo falta alguma coisa ou esta mal mas nao sei o que?

cumps.


Ás vezes, mais vale deixar a assinatura em branco.

Share this post


Link to post
Share on other sites
Edouardo

Parece-me que te estás a esquecer de "ligar" as estruturas entre elas...

Exemplo:


estrutura *  primeira_estrutura_da_lista = NULL;
estrutura * lista = NULL;
do
{
   cin >> valor_utilizador; 

   if(valor_utilizador!=0)  // verificamos que foi entrada válida...não vale a pena alocar sem necessidade...
  {
        if(primeira_estrutura_da_lista ==NULL) // aqui verificamos se é a primeira vez que inserimos dados.
        {
            lista = new estrutura;  
            primeira_estrutura_da_lista = lista; // se for a primeira vez guardamos o local da primeira estrutura.
        }
        else // se não é a primeira estrutura
       {
            estrutura * nova_estrutura = new estrutura; // alocamos nova estrutura
            lista->prox = nova_estrutura;             // e dizemos a "prox" da lista anterior para apontar para ela
            lista = nova_estrutura; // e passamos a dizer a "lista" para apontar para ela também
        }
        lista->valor=valor_utilizador; // guarda valor na lista

        lista->prox=NULL; // e indica a "prox" que "lista" aponta para a última estrutura
   }

}
while(valor_utilizador!=0);

Atenção que o código é um exemplo do que poderás pretender, pode não estar funcional...

cumps.

Aconselho-te a fazer a traçagem do teu programa... Se não sabes o que é, sugiro este documento...

Share this post


Link to post
Share on other sites
Devexz

muito obrigado isso funcionou.

Mas minha duvida era porques criavas ponteiros novos tipo *nova_estrutura ou *primeira_estrutura_da_lista e depois igualavas  ao ponteiro *lista.  Nao é possivel somente fazer com o ponteiro *lista?

cumps.

ps: estou a dar listas ligadas agora por isso tenho pouco conhecimento :D


Ás vezes, mais vale deixar a assinatura em branco.

Share this post


Link to post
Share on other sites
Edouardo

Como disse yyajsayy:

Não te esqueças que tens de deixar sempre um ponteiro para a cabeça da lista e no final qualquer operação é efectuada através dele.

Se não mantiveres uma variável com o endereço da primeira estrutura (no exemplo chamei-a de primeira_estrutura_da_lista), irás perder esse endereço e não saberás onde começa a lista.

Penso que a resposta passa pela noção de "ponteiro" e de alocação de memória...

cumps.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.