[MEGOLDVA] Lácolt lista - hiba típusdefiníciónál - C

Sziasztok!

A problémám a következő: lácolt listát szeretnék implementálni C-ben, így létre szeretném hozni a következő típust:

typedef struct
{
    int szam;
    ELEM* kovetkezo;
} ELEM;

Azonban erre hibát dob a fordító. Ha viszont két lépésben csinálom meg, azaz így:

struct t_elem
{
    int szam
    struct t_elem* kovetkezo
};

typedef struct t_elem ELEM;

...akkor minden rendben, lefordul és jó. Azonban a kérdés adott: lehetne mégis ezt a dolgot egyben, nem pedig két lépésben megoldani?

Kicsit bagatell kérdés, tudom, de szeretnék választ kapni rá.

Válaszaitokat előre is köszönöm!

Üdvözlettel,
tloszk

Hozzászólások

Valahogy igy..?

typedef struct _ELEM
{
int szam;
_ELEM* kovetkezo;
} *PELEM, ELEM;

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"

structnak ketszer kell nevet adni C-ben, egyszer a struktura szimbolumneve, masodszor a tipus neve.

A struct volt az elso dolog aminel nem lehetett meguszni a nevre hivatkozast hogy mit akarsz (intnel meg floatnal eleg ha a valtozo nevet tudod), es gondolom kesobb adtak hozza a typedef-et a C-hez.

De itt leirtak szebben: http://stackoverflow.com/questions/612328/difference-between-struct-and…

typedef struct t_elem
{
int szam
struct t_elem* kovetkezo
} ELEM;

Tudom, igy sem az igazi, de ez van.
Meg egy aprosag: lancolt listaban int-et tarolni eleg nagy pazarlas. Nem feltetlenul akarod ezt :P

szerk: meg egy aprosag: ELEM helyett elem-nek hivnam. A csupa nagybetut fenntartanam a #define-os konstansoknak.

A mutató 32 bites rendszeren 32 bit azaz 4 byte. Az int szinten. Azaz egy int tarolásához elhasználsz még egyet. Ez így 100% felesleg. Ha mondjuk elemenként egy 32 elemű int tömböt teszel el plusz egy int -et ahol bitmaszkkal jelzed mely elem szabad, sokkal nagyobb értéket kapsz a hasznos/nyilvántartásra szánt byte-ok arányára.

Ha azert csinalod, h tanulj belole, akkor nem szoltam, de ha munkahoz kell, akkor sokkal jobban jarsz a queue.h-val es thread/mutex kerdeskorrel.

---
pontscho / fresh!mindworkz

Mindenkinek nagyon köszönöm a válaszokat! Talán gondolkodnom kellett volna először, mielőtt postolok... Egyébként tanulás célzatából csinálgattam ezt a kis dolgot. :)

Ugyan a kérdés egy lépésben volt, de a helyesebb megoldás a több lépés. Első körben szükséged van egy előre hozott deklarációra, majd erre deklarálni kell egy pointert. (ezt így megeszi a C fordító, mivel a pointer méretét tudja, függetlenül attól, hogy mire mutat, mert annak a méretét majd csak később adod meg).
Több sorba szétszedés az olvashatóság miatt szükséges, és ugye a változónak helyet foglalni a header fájlban nem szokás, azaz úgyis szét kell szedned.

Javaslatom:

struct t_elem; <-- előre hozott deklaráció

typedef struct t_elem* p_elem; <-- pointert mindenre lehet deklarálni

struct t_elem {
int szam;
p_elem kovetkezo;
};

p_elem lista_gyokere;