Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
jpedro20

Cinema - malloc

Recommended Posts

jpedro20

Podiam-me ajudar aqui?

typedef struct sCinema
{
  Sala s;
  struct sCinema *seg;
} *Cinema, NCinema;


Cinema inserirSala (Cinema c, Sala s)
{
  Cinema aux;
  
  if(!c)
  {
    aux = (Cinema) malloc (sizeof(NCinema));
    aux->s=s;
    aux->seg=NULL;
    return aux;
  }
  else
    c->seg=inserirSala (c->seg,s);
}

Não estou a conseguir inserir duas salas. Se for listar as salas apenas me dá a última. Parece que "grava" por cima da anterior. O que estou a fazer de errado?

Obrigado

Share this post


Link to post
Share on other sites
Baderous

O problema é que estás a fazer return da última estrutura que crias, isto é, o aux.

Share this post


Link to post
Share on other sites
jpedro20

Mas não tenho de retornar? No main eu tenho algo do genero:

c1=inserirSala (c1,s1);

c1=inserirSala(c1,s2);

e mesmo tirando o return continua continua só a aparecer a última sala inserida (s2)

Share this post


Link to post
Share on other sites
Baderous

O problema é que estás a retornar o endereço da última célula da lista, tens de retornar o da 1ª.

Share this post


Link to post
Share on other sites
Baderous

O teu algoritmo insere a nova sala de cinema no fim da lista e no fim retorna essa última sala, por isso é que tu só estás a ver a última sala, em vez de as veres todas. Tens é de encontrar forma de guardar o início da lista, depois inseres tudo o que há a inserir e no fim retornas o início. Só assim poderás aceder a toda a lista.

Share this post


Link to post
Share on other sites
jpedro20

Ah já percebi. Obrigado pela ajuda. Vou tentar e se não conseguir posto mais dúvidas  :)

EDIT: Já consegui. Uma coisa tão fácil e estava a complicar.

Share this post


Link to post
Share on other sites
jpedro20

Já agora deixo aqui a solução para inserir a sala no fim:

Cinema inserirSala (Cinema c, Sala s)
{
  Cinema aux;
  
  if(!c)
  {
    aux = (Cinema) malloc (sizeof(NCinema));
    aux->s=s;
    aux->seg=NULL;
    return aux;
  }
  else
  {
    c->seg=inserirSala (c->seg,s);
    return c;
  }
}

Share this post


Link to post
Share on other sites
jpedro20

Obrigado. Eu já tinha visto isto no teu blogue (que por acaso acompanho) e percebi. O meu professor usa muito a recursividade por isso é que fiz assim também.

Mas alguma razão por não gostares de usar a recursividade em listas ligadas?

Share this post


Link to post
Share on other sites
Localhost

Tenta fazer um loop assim grande e chamar a função com esse loop e com dados aleatórios e vê o que acontece.


here since 2009

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  

×

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.