struct node *next;
是什么?next
。struct node *
表示这个指针指向的类型是 struct node
(也就是它自己所在的这个结构体类型)。data
):存放乘客或货物(相当于你的数据)。next
):用来挂载下一节车厢(相当于指针)。next
指针,每个车厢就不知道下一节车厢在哪,无法形成“链”。c复制代码
// 错误写法!会导致结构体无限大
struct node {
int data;
struct node next; // 错误!无法编译
};
假设我们创建两个节点,并用 next
指针连接它们:
c复制代码
// 定义节点类型
typedef struct node {
int data;
struct node *next;
} Node;
int main() {
// 创建第一个节点
Node *node1 = (Node*)malloc(sizeof(Node));
node1->data = 10;
// 创建第二个节点
Node *node2 = (Node*)malloc(sizeof(Node));
node2->data = 20;
// 用 next 指针连接两个节点
node1->next = node2; // node1 指向 node2
node2->next = NULL; // node2 是最后一个节点
// 现在链表结构:node1 → node2 → NULL
return 0;
}
struct node *next;
的作用是让每个节点能指向下一个节点,从而形成链式结构。链表中的每个节点(Node
)必须完全相同的结构,这样才能保证:
data
)和一个指针(next
)。next
指针指向的类型不同,链表就无法形成链式结构。next
指向其他类型假设你强行让 next
指向一个不同的类型(例如 int
或其他结构体):
c复制代码
// 错误示例!
typedef struct node {
int data;
int *next; // 错误的指针类型
} Node;
next
指针指向的是 int
类型,而不是 Node
,因此无法通过 next
找到下一个节点。链表会断掉。next
指向一个 Node
节点,但编译器认为它指向的是 int
,访问 next->data
或 next->next
时会导致内存错误。c复制代码
typedef struct node {
int data;
struct node *next; // 必须指向同类型的节点
} Node;
next
都指向另一个 Node
next
指针逐个访问链表中的每个节点,直到遇到 NULL
(链表末尾)。Node
)都包含一个指向另一个节点(同类型 Node
)的指针。这类似于“俄罗斯套娃”,但每次套的都是相同类型的结构。想象一列火车:
data
)和一个连接钩(next
)。如果错误地直接包含自身结构体(而非指针):
c复制代码
// 错误写法!
typedef struct node {
int data;
struct node next; // 直接包含自身结构体,导致无限嵌套
} Node;
Node
的大小时,会发现 Node
内部又包含一个 Node
,而后者又包含另一个 Node
……最终导致无法编译。struct node *
?next
指针才能正确指向下一个节点。一句话回答:next
指针必须指向同类型的结构体,才能保证链表节点的统一性和内存操作的合法性。就像火车车厢必须用同类型的连接钩,才能形成连贯的列车。