Может ли структура иметь член, который является указателем на структуру того же типа?

Звучит очень запутанно, но это простая концепция. Скажем, у вас есть структура "foo", если ее члены являются указателем на другую структуру foo (например, связанный список)

Кажется, это работает.

struct foo {
   struct foo* ptr;
};

Но что, если я хочу, чтобы foo был типом?

Как бы мне сделать следующее?

typedef struct foo {
   foo* ptr;
} foo;

Объявление ptr не выполняется, поскольку foo еще не является квалификатором.


person Reuben Crimp    schedule 04.08.2014    source источник
comment
Вы просите c или c ++? Выберите, пожалуйста!   -  person πάντα ῥεῖ    schedule 04.08.2014
comment
Чтобы усилить предыдущий комментарий: C и C ++ различаются в этом отношении, поэтому они получают разные ответы.   -  person Jerry Coffin    schedule 04.08.2014
comment
Похоже, C изменил тег, не стесняйтесь возвращаться, если вы имели в виду иное.   -  person Casper Beyer    schedule 04.08.2014
comment
Вам ничего не мешает делать typedef struct foo { struct foo *ptr; } foo; - вы можете иметь как struct _, так и typedef имя для одной и той же структуры.   -  person sapi    schedule 04.08.2014
comment
Вы новый C программист? Добавление точки с запятой должно быть рефлексом.   -  person Fiddling Bits    schedule 04.08.2014
comment
Если вы спрашиваете о C stackoverflow.com/questions/506366/   -  person 101010    schedule 04.08.2014
comment
Like how would I do the following? В определении просто напишите struct foo* ptr; вместо foo* ptr;.   -  person 101010    schedule 04.08.2014
comment
Это чрезвычайно обычная вещь, необходимая, например, для определения связанных списков и двоичных деревьев. Любой достойный учебник или учебник по Си должен охватывать его.   -  person Keith Thompson    schedule 04.08.2014
comment
Спасибо, ребята :) Да, C был предпочтительнее, но я добавил тег C ++, потому что, если бы это было проще в C ++, я бы не возражал, так как я вроде как изучаю C и C ++ прямо сейчас. И да, я новичок в C и программировании в целом.   -  person Reuben Crimp    schedule 04.08.2014
comment
Вы имеете в виду как связанный список?   -  person djechlin    schedule 04.08.2014


Ответы (2)


Вперед заявляю определение.

typedef struct foo {
    struct foo* ptr
} foo;

Или вы можете переслать объявление объявления типа.

typedef struct node_t node_t;

typedef struct node_t {
   node_t *next;
} node_t;
person Casper Beyer    schedule 04.08.2014
comment

Чтобы продолжить реализацию ответа Casper Von B:

Если у вас есть несколько типов переменных, таких как int и, возможно, массив char в структуре, вам нужно будет использовать malloc:

node_t *ptr = malloc(sizeof(node_t));

Вы можете использовать оператор -> и. оператор для выбора переменной:

ptr -> x = 12;

Затем, когда закончите, используйте free () для сборки мусора:

free(ptr);

Мое последнее замечание: вы можете продолжать связывать структуры вместе с указателями, а затем перемещаться по ним.

person fingaz    schedule 04.08.2014