当前位置: 首页 > 知识库问答 >
问题:

在C链表中,为什么节点也是指针?[副本]

章丰茂
2023-03-14

当我们尝试实现链表时,我无法理解我们创建节点指针而不是节点结构的原因,如下所示:

typedef struct node {
    int val;
    struct node * next;
} node_t;

node_t * head = NULL;
head = malloc(sizeof(node_t));
if (head == NULL) {
    return 1;
}

head->val = 1;
head->next = NULL;

在这里,为什么我们要将head等节点声明为结构指针而不是直接结构

共有3个答案

太叔凌龙
2023-03-14

为什么我们将诸如head这样的节点声明为结构的指针而不是直接结构

head声明为指针允许我们有一个空列表,即headNULL

茹元魁
2023-03-14

head作为指针可以实现空列表(head==NULL)或通过将head指针移动到列表中的另一个(例如第二个)元素来删除列表前面元素的简单方法。将head作为一个结构,这些操作将不可能实现,或者至少效率要低得多。

田博易
2023-03-14

主要原因是C语言根本不允许它-一个struct类型不能包含自身的实例。原因有两个:

>

  • 在关闭}之前,结构类型是不完整的,您不能创建不完整类型的实例;

    如果struct类型可以包含自身的实例,则该实例将无限大(struct foo包含struct foo的实例,其中包含struct foo的实例,无限大)。

    但是,您可以创建指向不完整类型的指针(因为指针的大小不取决于指向类型的大小)。因此,如果希望一个struct类型包含引用同一类型的另一个实例的成员,则必须通过指针来完成。

  •  类似资料:
    • 指向列表中的下一个节点而不是 我明白,最好使用指针版本;我不打算争论事实,但我不知道为什么这样更好。关于指针如何更好地分配内存,我得到了一个不太清楚的答案,我想知道这里是否有人能帮助我更好地理解这一点。

    • 下面是链接列表代码中的删除节点,它将头指针和要删除的位置作为参数(链接列表中的位置索引从零开始)。删除后,返回指向head的指针。 假设列表:20-2-19-7-3-6。要删除的位置是2(节点19要删除,因为索引从零开始)。 删除并打印后,它会显示:20-2-0-3-6。(即,直接位于已删除节点旁边的节点打印0) 但是如果我删除“free(head)”行,那么它将打印:20-2-7-3-6(正确)

    • 本文向大家介绍什么是指向指针的指针? 相关面试题,主要包含被问及什么是指向指针的指针? 时的应答技巧和注意事项,需要的朋友参考一下 指针指向的变量是一个指针,即具体内容为一个指针的值,是一个地址. 此时指针指向的变量长度也是4位.

    • 我有一个非常简单的节点结构,用于实现迭代深化DFS。然而,我后来在将子节点链接到父节点时遇到了麻烦。 后来在我的代码中,当我试图做这样的事情时,我会遇到严重的错误: 我只想将这个子节点(称为Down_节点)链接到它的父节点(称为Next)。但如果Next本身不是一个节点,我该怎么做呢? 正是指向下一步的指针带来了麻烦。我试过了 编辑:当我尝试使用 在/usr/lib/gcc/x86_64-redh

    • 我正在制作一个方法,将一个节点添加到名为“publicvoidadd(int-index,T-value)”的列表中。 此方法将把一个值放入索引中,然后将有指向列表中下一个和上一个元素的指针。我把指向前面节点的指针搞砸了,我一直坐在那里进行实验,但没有让它工作。 示例:我们有一个包含整数值[2,4,6]实例变量的列表:Node head、tail;整数金额,变动; 内部类的实例变量为:T值;节点p