声明链表节点

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;

你可以这样声明一个节点,但是你需要正确地初始化它。

结构节点new_node = {5 , NULL}; 将创建一个名为 new_node 的节点,数据设置为 5,next 设置为 NULL。

问题或多或少是你实际需要的。当您在函数中创建这样的节点时,如果您不复制它,该节点将在函数完成后不复存在。这通常是不可取的。

但是如果你无论如何都需要复制这样一个节点,你可以首先使用 malloc 获取 "copy" 的内存,然后在 "copy" 中填充数据只是通过指向节点的指针,而不是将节点放在函数堆栈上。

您可以像这样定义一个更具可读性的结构

typedef int Type;
typedef struct node * Ptr;

typedef struct node {
    Type Element;
    Ptr  Next;
} Node;

一个新节点可以清晰地定义为

Ptr newNode = NULL;

Ptr newNode = malloc(sizeof(Node));