3
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;
};

但是在这里编译器是如何在结构声明之前知道的,因此可以对它们进行类型定义?

4

2 回答 2

5
typedef struct node Node;

告诉编译器有一个结构类型,其标记node在某处定义,这Node是该类型的另一个名称。

typedef  Node  *Link;

告诉编译器这Linkstruct node *. 由于所有指向结构类型的指针都需要具有相同的表示和对齐要求,这就是编译器在使用它时需要知道的全部内容

struct node
{
    student s;
    Link next;
};
于 2013-05-25T13:38:36.677 回答
0

来自 C 标准:

typedef 声明不引入新类型,仅引入指定类型的同义词。

C std 似乎没有提到 typedef 在使用后是否会出现......我怀疑这不是标准 C,而是 2 遍编译器的副产品......

现在是答案的批评和漫谈部分:

这里有几个问题要问自己:

1) 学生是否可重复使用

2)节点是否携带学生中没有的额外信息......

让我们假设students 是可重用的,也就是说它们可以存在于多个列表中......现在node不能包含一个整体student,因为如果你改变一个,你就不会全部改变它们......

typedef struct
{
    int idno;
    char name[max];
    float cgpa;
}student;

typedef struct
{
    student * s;
    node * next;
}node;

Link是一个坏名字node *node *是一个非常好的名字,你会习惯阅读,或者如果你必须阅读node_ptr

如果只有一个列表并且nodes 不包含任何额外内容(不在 中student),那么您可以将链接放在学生中:

typedef struct
{
    int idno;
    char name[max];
    float cgpa;
    student * next;
    student * prev; //if you want to be doubly linked
}student;
于 2013-05-25T14:15:45.417 回答