我在下面有一个代码:
#include<stdio.h>
typedef struct node{
int value;
struct node *next;
}node;
int main(){
node *a;
return 0;
}
谁能向我解释为什么a必须是指针而不是变量类型节点? TKS 为您提供帮助
链表的下一个节点由struct node *next;
根据定义,这必须是一个指针。不能将struct node
变量包含在另一个变量struct node
typedef struct node{
int value;
struct node next; //-- Not Allowed
}node;
上述声明不会编译,因为struct node
的大小将是无限的。
链表的头部可能是非指针,但这不必要地使代码复杂化,因为您需要为头和其他节点分别有两个代码段。
简短回答:
在"C"中,参数传递是按值完成的。为了允许被调用的函数对数据结构进行更改,或与将来对数据结构的更改保持同步,函数将传递指向对象的指针。
长答案: 考虑一个调用方和一个被调用方函数,其中被调用方必须更改链表上的第一个元素。由于被调用方将获得链接列表头节点的 COPY,因此它对 head->next 所做的更改是在副本上完成的。"调用方"函数 'head1' 不会被修改,当callee
返回时,更改(和 malloc(将丢失。
void callee(struct node head)
{
struct node new_node = malloc(...)
new_node = head.next ;
head->next = new_node ;
}
void called(void) {
struct node head1 = ...
callee(head1) ;
} ;
作为旁注,对于以下情况,技术上可以使用"结构节点"来表示链表(对被调用方(。但是,这里有一些论点反对在同一代码中使用两种表示形式,并记住使用哪一种是recipe for disaster
- 被调用方不会修改链接列表
head
项。 - 如果被调用方存储链表以供将来调用(例如,静态变量(,则无法修改链接列表。
我的个人建议,始终使用指针
在 C 中,链表用作动态数组。与 C 中的普通数组不同,它不必具有特定大小,并且可以根据需要不断扩展或减少。
由于结构节点有 2 个数据成员:
1.它存储的数据(整数值(
2.下一个地点的地址(*下一个(
因此,为了使链表正常工作,我们将"a"声明为指针,以便只有一个变量 我们可以用它来遍历整个列表 .我们可以简单地将"a"指向列表中的下一个元素,以便我们可以访问它。 我们可以使用一个基本元素,我假设它是
struct node node;
这样我们就可以指出它到达列表的开头,因为它是单链表。