链接列表的结构声明

时间:2013-05-25 13:33:45

标签: c

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

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

2 个答案:

答案 0 :(得分:5)

typedef struct node Node;

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

typedef  Node  *Link;

告诉编译器Linkstruct 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;

Linknode *的错误名称,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;