[英]Declaring a Linked List Node
如果它的基本结构太愚蠢,请耐心等待,但是我想知道,当我们的节点结构为:-
struct node {
int data ; //data
struct node* next; //pointer
}
为什么我们将一个节点声明为:-
struct node* new_node = null;
要么
struct node* new_node= (struct node*)malloc(sizeof(struct node));
为什么不仅仅struct node new_node = null
?
在前两个中,您声明了指向结构或节点的指针:
struct node* new_node;
是指针,还是结构的地址
在您的建议下,您声明整个结构或节点:
struct node new_node;
这是将存在于堆栈中的结构。
并且至少在这种情况下,您不能将null分配给结构。
因为node
是struct
的名称,而new_node
是变量的名称。 *
表示new_node
只是该struct
的地址,因此您需要使用malloc
为其分配内存。
您可以为结构定义自己的自定义类型:
typedef struct node_struct_tag //tag, for use within the struct
{
int data ; //data
struct node_struct_tag* next; //pointer
} node, *node_pointer; //types
现在,您可以使用建议的简化语法声明新节点。
node_pointer newNode = null;
您可以以这种方式声明节点,但随后需要正确地对其进行初始化。
struct node new_node = {5,NULL}; 将创建一个名为new_node的节点,其数据设置为5,下一个设置为NULL。
问题是您实际上需要什么。 当您在函数中创建这样的节点时,如果您不复制该节点,则在函数完成后该节点将不复存在。 这通常是不希望的。
但是,如果您仍然需要对此类节点进行复制,则只需使用malloc首先获取“副本”的内存,然后仅通过指向该节点的指针将数据填充到“副本”中即可将节点放在函数堆栈上的过程。
您可以这样定义一个更具可读性的结构
typedef int Type;
typedef struct node * Ptr;
typedef struct node {
Type Element;
Ptr Next;
} Node;
可以将新节点明确定义为
Ptr newNode = NULL;
要么
Ptr newNode = malloc(sizeof(Node));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.