Ir para o conteúdo
waza

Duvida em estruturas dinamicas

Mensagens Recomendadas

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%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 ?

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 :/

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
waza

aqui está :

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

Editado por waza

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.