C语言 为什么链表的变量必须是指针



我在下面有一个代码:

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

这样我们就可以指出它到达列表的开头,因为它是单链表。

相关内容

  • 没有找到相关文章

最新更新