Declaraçao da struct

Declaraçao da struct

por Marcel Toniolo -
Número de respostas: 1

O prof sugere esta declaraçao:

typedef struct  _lista_ {
  Elem val;
  struct _lista_ *prox;
} CONJUNTO;

nao entendi o que significa    "_lista_"

Em resposta à Marcel Toniolo

Re: Declaraçao da struct

por Vanessa Sabino -
_lista_ é o identificador da struct.

Talvez fique mais claro se separarmos esse pedaço de código em duas partes:

1) Declaração da struct:
struct _lista_ {
Elem val;
struct _lista_ *prox;
};

2) Definição do tipo de dados:

typedef struct _lista_ CONJUNTO;


Se você fizesse só a parte 1, sempre que quisesse referenciar sua struct teria que ficar escrevendo "struct _lista_". E se a struct não tivesse o identificador, não teria como referenciá-la em outras partes do código, pois falta um nome para identificar de que struct estaríamos falando. Em particular, não daria para você ter o ponteiro para uma struct _lista_ dentro da sua struct.

Aí incluímos o typedef e passamos a chamar toda essa struct simplesmente por CONJUNTO, usando esse nome como um tipo de dados e não preciando mais ficar escrevendo "struct _lista_" toda hora.
De fato, se você fizer algo tipo
typedef struct {
Elem val;
} CONJUNTO;
você não precisa colocar um identificador na sua struct, pois aí a struct está sendo declarada no mesmo lugar que é usada e está perfeitamente claro de que struct estamos falando, não sendo necessário um identificador e sendo possível acessá-la em outras partes do código apenas usando CONJUNTO.

Mas na struct do EP existe algo particular: você vai colocar um ponteiro do tipo daquela struct dentro da própria struct! A declaração está lá antes mesmo de você ter terminado de definir completamente a struct. Logo, você precisa de um identificador para ela. Escrever CONJUNTO ali ao invés struct _lista_ não dá certo, pois naquela linha de código o compilador ainda nem sabe sobre esse tal de CONJUNTO.
Então o que você faz é identificar a sua struct como _lista_ e usar isso dentro da sua declaração.