链表的声明
首先要清楚链表是由数据和指向下一个地址的指针组成的。无论结构体里有多少个数据,必须要有一个地址指针。
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
为什么这个结构体声明为Node,结构体的指针域也是一个Node?
typedef struct Node
{
ElemType data;
xxx *next;
}Node;
上面这两个声明是等效的。
struct Node *next;和xxx *next;都是一个占32bit或者64bit的数据类型。只有在后面使用Node后,struct
Node *next;和xxx *next;才会有区别。
指针本身的大小是固定的,不是4字节就是8字节(编译器选x86就是4字节,选x64就是8字节)。
那为什么这个地址指针是用他本身声明的呢?
因为结构体本身中存放一个本身数据类型的指针,这个指针指向的地址也是一个具有数据和指针的结构体(也就是是本身结构体里面的内容),其目的显而易见,就是形成链表,可方便顺序访问查找。
而下面这个会报错,error: field ‘next’ has incomplete type。因为这个时候Node并没有定义完,编译器都不知道要给他分配多少内存空间。
typedef struct Node
{
ElemType data;
struct Node next;
}Node;