繁体   English   中英

声明链接列表节点

[英]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分配给结构。

因为nodestruct的名称,而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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM