typedef struct
{
int idno;
char name[max];
float cgpa;
}student;
struct node
{
student s;
Link next;
};
typedef struct node Node;
typedef Node *Link;
这不起作用,因为编译器不知道Link,但是这可行
在函数'main'中:| 错误:未知类型名称'链接'|
typedef struct {
int idno;
char name[max];
float cgpa;
}student;
typedef struct node Node;
typedef Node *Link;
struct node
{
student s;
Link next;
};
但是这里编译器在结构声明之前如何知道,因此可以定义它们的类型?
答案 0 :(得分:5)
typedef struct node Node;
告诉编译器存在一个在某处定义了标记node
的结构类型,Node
是该类型的另一个名称。
typedef Node *Link;
告诉编译器Link
是struct node *
的另一个名称。由于所有指向结构类型的指针都需要具有相同的表示和对齐要求,因此编译器需要知道在
struct node
{
student s;
Link next;
};
答案 1 :(得分:0)
来自C std:
typedef声明不会引入新类型,只会引入同义词 对于如此指定的类型。
C std似乎没有提到typedef在使用后是否会发生...我怀疑这不是标准C,而是2遍编译器的副产品......
现在回答的批评和ramblings部分:
这里有几个问题要问自己:
1)学生可以重复使用
2)做节点cary不在学生的额外信息......
让我们假设student
是可重用的,即它们可以存在于多个列表中......
现在node
不能包含整个student
,因为如果您更改了一个,则不会全部更改它们...
typedef struct
{
int idno;
char name[max];
float cgpa;
}student;
typedef struct
{
student * s;
node * next;
}node;
Link
是node *
的错误名称,node *
是一个非常好的名称,您将习惯于阅读,或者如果您必须node_ptr
。
如果只有一个列表且node
s不包含任何额外内容(不在student
中)
然后你可以把链接放在学生中:
typedef struct
{
int idno;
char name[max];
float cgpa;
student * next;
student * prev; //if you want to be doubly linked
}student;