链表中的节点是单独的结构还是同一结构的一部分?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表中的节点是单独的结构还是同一结构的一部分?相关的知识,希望对你有一定的参考价值。

我在C中有一个链表如下:

typedef struct intSet *link;

typedef struct intSet 
    int num;
    link next;
 intSet;

当我打印结构的各个成员的大小时,我得到以下内容:

sizeof(List) = 8 bytes  //List is a newly created list
sizeof(curr->num) = 4 bytes  // curr is just a node within the list
sizeof(curr->next) = 8 bytes

我的问题是:无论我们在列表中有多少元素,结构本身总是具有8字节的大小,或者那些仅与第一个节点有关的8个字节以及列表中的下一个节点是不同的实例。相同的结构?

我问的原因是因为我打算在PostgreSQL中将其实现为用户定义的数据类型,因此它要求我声明数据类型的长度是常量还是变量:

CREATE TYPE list (
    internallength = 8? or internallength = variable
    input = ..., output = ... );

如果它是变量我必须将我的结构表示更改为:

typedef struct intSet 
    int size;
    int num;
    link next;
 intSet;

我怀疑如果节点是独立的,我可能不得不不断更新大小,而下一个节点的结构不同,结构的大小可能比最后一个节点多4个字节。任何提示或指示将不胜感激。

答案

关于sizeof的关注不是主要问题,特别是在32位sizeof(intSet)将是8并且在64位中sizeof(intSet)将是32位。

关于PostgreSQL,您要存储的对象是int容器,因此长度可变。因此,您要处理的对象不是intSet,而是包含列表大小和第一个元素的结构。

typedef struct intSet *link;

typedef struct intSet 
    int num;
    link next;
;

struct intSetSized

    int size;
    intSet begin;
;

您想要在intSetSized中声明为用户定义类型的udt

每个你添加或删除列表中的东西,你调整size

小心你如何为你的对象intSetSized实现输入和输出函数,这比udt中给出的例子更棘手。

另一答案

你的类型link是一个指针,如果你没有用typedef混淆它会更明显。指向的是一个单独的struct(它也有自己的next点等),它需要自己的存储空间。

现在sizeof(curr->next)sizeof(List)是指向struct的指针的大小,而不是struct intSet的大小。 sizeof(*(curr->next))sizeof(struct intSet)都是结构本身的大小,即你需要为单个结构分配的空间量。

sizeof永远不会遍历指针以找出整个列表的大小。如果你需要找出列表的整个大小,你需要自己遍历它并计算元素,然后总大小是count * sizeof(struct intSet)。但是,您不太可能需要链接列表的这些信息,因为如果您一次分配整个列表,您可以使用没有next链接的数组...

另一答案

sizeof指针在系统中是相同的。在你的情况下,无论它指向什么(无论是int,char,struct等),它总是4个字节。在你的情况下它将是4个字节。因此,您的结构大小将始终为8个字节(int为4个字节,指针为4个字节)。

以上是关于链表中的节点是单独的结构还是同一结构的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

链表一

链表中元素比较功能的实现

数据结构链表中,p是指针,L是链表,那么p=L是啥意思,是p指向L的头结点,还是p等于L的每个值

双链表的实现(C语言)---数据结构

双链表的实现(C语言)---数据结构

双链表的实现(C语言)---数据结构