自引用结构定义?

自引用结构定义?

我写C的时间不长,所以我不确定该如何做这些递归的事情.我希望每个单元格包含另一个单元格,但是我会得到一个错误,类似于“字段‘子”有不完整的类型“。出什么事啦?

typedef struct Cell {
  int isParent;
  Cell child;} Cell;


小怪兽爱吃肉
浏览 393回答 3
3回答

忽然笑

显然,一个单元格不能包含另一个单元格,因为它变成了一个永无止境的递归.但是,单元格可以包含指向另一个单元格的指针。typedef struct Cell {   bool isParent;   struct Cell* child;} Cell;

天涯尽头无女友

在C中,您不能引用您正在创建的类型-使用结构本身。您必须使用结构名称,如下所示:#include&nbsp;<stdio.h>#include&nbsp;<stdlib.h>typedef&nbsp;struct&nbsp;Cell&nbsp;{ &nbsp;&nbsp;int&nbsp;cellSeq; &nbsp;&nbsp;struct&nbsp;Cell*&nbsp;next;&nbsp;/*&nbsp;'tCell&nbsp;*next'&nbsp;will&nbsp;not&nbsp;work&nbsp;here&nbsp;*/}&nbsp;tCell;int&nbsp;main(void)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i; &nbsp;&nbsp;&nbsp;&nbsp;tCell&nbsp;*curr; &nbsp;&nbsp;&nbsp;&nbsp;tCell&nbsp;*first; &nbsp;&nbsp;&nbsp;&nbsp;tCell&nbsp;*last; &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Construct&nbsp;linked&nbsp;list,&nbsp;100&nbsp;down&nbsp;to&nbsp;80.&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;=&nbsp;malloc&nbsp;(sizeof&nbsp;(tCell)); &nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;=&nbsp;first; &nbsp;&nbsp;&nbsp;&nbsp;first->cellSeq&nbsp;=&nbsp;100; &nbsp;&nbsp;&nbsp;&nbsp;first->next&nbsp;=&nbsp;NULL; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;20;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curr&nbsp;=&nbsp;malloc&nbsp;(sizeof&nbsp;(tCell)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curr->cellSeq&nbsp;=&nbsp;last->cellSeq&nbsp;-&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curr->next&nbsp;=&nbsp;NULL; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last->next&nbsp;=&nbsp;curr; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;=&nbsp;curr; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Walk&nbsp;the&nbsp;list,&nbsp;printing&nbsp;sequence&nbsp;numbers.&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;curr&nbsp;=&nbsp;first; &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(curr&nbsp;!=&nbsp;NULL)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;("Sequence&nbsp;=&nbsp;%d\n",&nbsp;curr->cellSeq); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curr&nbsp;=&nbsp;curr->next; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}虽然在标准中它可能比这个复杂得多,但是您可以将它看作是编译器知道的struct Cell的第一行typedef但不知道tCell直到最后一行:-)我就是这样记住这条规则的。

慕容森

有一种方法可以解决这个问题:struct&nbsp;Cell&nbsp;{ &nbsp;&nbsp;bool&nbsp;isParent; &nbsp;&nbsp;struct&nbsp;Cell*&nbsp;child;};struct&nbsp;Cell;typedef&nbsp;struct&nbsp;Cell&nbsp;Cell;如果您这样声明它,它会正确地告诉编译器,structCell和plan-ol‘-cell是相同的。所以你可以像正常人一样使用细胞。但是,在初始声明本身中仍然必须使用structCell。
打开App,查看更多内容
随时随地看视频慕课网APP