Jump to content
waza

Duvida em estruturas dinamicas

Recommended Posts

waza

boas,

nao estou a conseguir entender nada desta parte da linguagem s:

algum me pode dar uma orientaçãozita? xD

obrigado !

Share this post


Link to post
Share on other sites
brunoais

Não sei ao que é que te estás a referir.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok, eu então explico estruturas dinâmicas : NÃO EXISTEM

uma estrutura é sempre estática. está declarada e a sua definição nunca pode ser alterada.

exemplo:

// nunca poderás alterar esta definição sem recompilar toda a apliação !!!
struct XPTO {
 int i;
 double d;
 char f[256];
}

------------------

aquilo a que muita gente chama de estruturas dinâmicas não é mais do que o uso de "alocação dinâmica de memória".

agora, o que não percebes exactamente na alocação dinâmica de memória ?

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pmg

Será que o waza estava a falar de FAM (C99)

struct header {
   size_t len;
   unsigned char data[]; /* flexible array member */
};


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
waza

boas pessoal,

o que eu nao entendo é como é que, de forma recursiva, isto guarda em prox o endereço da proxima "casa" da estrutura ...

void inserir(FILA * Fila, int idade )
{
if(*Fila == NULL)
 {
 *Fila = (FILA) malloc(sizeof(pessoa));
  if(*Fila == NULL)
   return;
 (*Fila)-> idade = idade;
 (**Fila).prox = NULL;
 }
else
 inserir( & (**Fila).prox, idade);
}

nao sei se me estou a explicar bem :/

Share this post


Link to post
Share on other sites
HappyHippyHippo

para perceber melhor, não uses o typedef FILA. escreve o tipo de dados do género "struct fila" e ter a sua definição é praticamente obrigatória para se responder à tua questão


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HappyHippyHippo

podes dar um exemplo sff, nao entendi muito bem xD

apresenta a definição de FILA


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
waza

aqui está :

typedef struct sPessoa{
int idade;
struct sPessoa * prox;
}PESSOA;
typedef PESSOA * FILA;

Edited by waza

Share this post


Link to post
Share on other sites
HappyHippyHippo

apresenta a definição de FILA

typedef struct sPessoa{
int idade;
struct sPessoa * prox;
}PESSOA;
typedef PESSOA * Fila;

eu nem sei o que responder ... o post tinha 5 palavras

- apresenta

- a

- definição

- de

- FILA

parece que percebeste bem as 4 primeiras, mas parece que a partir dai apresentas problemas com o português


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
waza

oh, pus em minusculas, mas é em maiusculas xD ja alterei

Edited by waza

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok ... então faz isto:

/*
typedef struct sPessoa{
int idade;
struct sPessoa * prox;
}PESSOA;
typedef PESSOA * FILA;
*/
struct sPessoa{
 int idade;
 struct sPessoa * prox;
};

e altera todo o restante código para não dar erros


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HappyHippyHippo

e apos isso?! continuo sem perceber como funciona aquilo dos endereços :confused:

não ... mas já é um primeiro passo para ficar simples de explicar.

já tens isso alterado ?

se sim, apresenta o código da função que tinhas com a alteração


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
waza

era este o objectivo certo?

void inserir(struct sPessoa * Fila, int idade )
{
if(*Fila == NULL)
 {
 *Fila = (struct sPessoa) malloc(sizeof(struct sPessoa));
  if(*Fila == NULL)
   return;
 (*Fila)-> idade = idade;
 (**Fila).prox = NULL;
 }
else
 inserir( & (**Fila).prox, idade);
}

Share this post


Link to post
Share on other sites
waza

com este codigo nao obtenho nenhum erro e/ou warning !

#include <stdio.h>
#include <stdlib.h>
struct sPessoa{
   int idade;
   struct sPessoa * prox;
};
void inserir(struct sPessoa ** Fila, int idade )
{
   if(*Fila == NULL)
   {
    *Fila = (struct sPessoa *) malloc(sizeof(struct sPessoa));
    if(*Fila == NULL)
	    return;
    (*Fila)-> idade = idade;
    (**Fila).prox = NULL;
   }
   else
    inserir( & (**Fila).prox, idade);
}
int main(int argc, const char * argv[])
{
   struct sPessoa * f = NULL;
   inserir(&f, 10);

   return 0;
}

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok ... finalmente.

primeiro vamos normalizar a maneira de fazer as indirecções

// a função deverá sinalizar se houve erro ou não = valor de retorno
int inserir(struct sPessoa ** Fila, int idade )
{
 if(*Fila == NULL)
 {
   *Fila = malloc(sizeof(struct sPessoa));
   if(*Fila == NULL)
   {
     return -1; // retornar erro
   }

   (*Fila)->idade = idade;
   (*Fila)->prox = NULL;

   return 0; // returnar ok
 }

 return inserir(&(*Fila)->prox, idade); // retornar o valor da recursividade
}

vamos lá à explicação:

inserir o primeiro elemento (f = NULL)

int inserir(struct sPessoa ** Fila, int idade )
{
 if(*Fila == NULL)                          // yep, *File tem o valor de NULL (**Fila == *f == NULL)
 {
   *Fila = malloc(sizeof(struct sPessoa));  // alocar memória e guardar em **Fila == *f
   if(*Fila == NULL)                        // verificar se houve erro
   {
     return -1;                             // retornar erro
   }

   (*Fila)->idade = idade;                  // guardar idade em (*Fila)->idade = (f)->idade
   (*Fila)->prox = NULL;                    // marcar a nulo o ponteiro para o próximo em (*Fila)->prox = (f)->prox

   return 0;                                // returnar ok
 }

 return inserir(&(*Fila)->prox, idade);     // <----------- NAO EXECUTADO
}

inserir o segundo elemento (f != NULL)

int inserir(struct sPessoa ** Fila, int idade )
{
 if(*Fila == NULL)                          // nop, *Fila == f != NULL
 {
   // ...
 }

 return inserir(&(*Fila)->prox, idade);     // retornar a recursividade mas agora o valor de Fila da chamada não será f, mas f->prox
}

int inserir(struct sPessoa ** Fila, int idade )
{
 if(*Fila == NULL)                          // yep, *File tem o valor de NULL (**Fila == *(f->prox) == NULL)
 {
   *Fila = malloc(sizeof(struct sPessoa));  // alocar memória e guardar em **Fila == *(f->prox)
   if(*Fila == NULL)                        // verificar se houve erro
   {
     return -1;                             // retornar erro
   }

   (*Fila)->idade = idade;                  // guardar idade em (*Fila)->idade = (f->prox)->idade
   (*Fila)->prox = NULL;                    // marcar a nulo o ponteiro para o próximo em (*Fila)->prox = (f->prox)->prox

   return 0;                                // returnar ok
 }

 return inserir(&(*Fila)->prox, idade);     // <----------- NAO EXECUTADO
}

inserir o terceiro elemento (f != NULL & f->prox != NULL)

int inserir(struct sPessoa ** Fila, int idade )
{
 if(*Fila == NULL)                          // nop, *Fila == f != NULL
 {
   // ...
 }

 return inserir(&(*Fila)->prox, idade);     // retornar a recursividade mas agora o valor de Fila da chamada não será f, mas f->prox
}

int inserir(struct sPessoa ** Fila, int idade )
{
 if(*Fila == NULL)                          // nop, *Fila == f->prox != NULL
 {
   // ...
 }

 return inserir(&(*Fila)->prox, idade);     // retornar a recursividade mas agora o valor de Fila da chamada não será f->prox, mas f->prox->prox
}

int inserir(struct sPessoa ** Fila, int idade )
{
 if(*Fila == NULL)                          // yep, *File tem o valor de NULL (**Fila == *(f->prox->prox) == NULL)
 {
   *Fila = malloc(sizeof(struct sPessoa));  // alocar memória e guardar em **Fila == *(f->prox->prox)
   if(*Fila == NULL)                        // verificar se houve erro
   {
     return -1;                             // retornar erro
   }

   (*Fila)->idade = idade;                  // guardar idade em (*Fila)->idade = (f->prox->prox)->idade
   (*Fila)->prox = NULL;                    // marcar a nulo o ponteiro para o próximo em (*Fila)->prox = (f->prox->prox)->prox

   return 0;                                // returnar ok
 }

 return inserir(&(*Fila)->prox, idade);     // <----------- NAO EXECUTADO
}

etc, etc, etc ....


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.