好吧……我对CS数据结构的介绍是如此生疏,我需要在这里提出这个问题.
我有一个链表,其结构是:
struct Data_Struct { char *Name; char *Task; char *Pos; struct Data_Struct *Next; }; typedef struct Data_Struct MyData;
现在,在我的应用程序的某个时刻,我用数据填充了列表.
问题是,如何获得存储在那里的数据的总大小?有多少个字符?就像是
sizeof(MyData);
这将返回列表中存储的信息的大小.
代码表示赞赏.
谢谢!
编辑:
不幸的是,这不是功课.我在20多年前完成了学业,坦率地说,我从来没有在任何事情上使用链接列表.我只是不记得了.
我正在做的是迭代列表并获取每个元素的strlen()并将其保持在全局大小但我想知道是否有更好的方法.
和NO,我不需要链接的大小(节点数),我只想知道那里存储了多少个字符.
谢谢
解决方法
您通常会遍历列表,直到您到达尾部项目,同时计数,代码应该是这样的:
int listLength(struct Data_Struct* item) { struct Data_Struct* cur = item; int size = 0; while (cur != null) { ++size; cur = cur->Next; } return size; }
请注意,此操作的复杂性与列表的大小成线性关系,因此它是O(n)并且效率非常低.您可以在某处存储大小并使用列表插入和删除进行更新,以避免任何开销并能够在恒定时间O(1)内计算它.
编辑:
没有注意到你想要将整个数据的大小包含在列表中.在您的情况下,您可以保持用于计算长度的相同方法,但是为每个元素添加1,您应该添加字符串的总长度:
size += strlen(Name)+strlen(Task)+strlen(Pos);
请注意,由于list元素中的数据(如果是char *类型)Data_Struct的有效大小只有4个指针,这就是为什么你需要使用像strlen这样的支持函数,否则你无法获得字符串的真实维度.
有什么区别?
sizeof(Data_Struct) == 16
因为Data_Struct类型包含4个指针,3个用于指向char的指针,1个指针用于列表中的下一个元素
sizeof(Name) == sizeof(Task) == sizeof(Pos) == 4
因为这些变量是指向char的类型指针,所以它们是指针,没有具体的值,它通常是4个字节(我假设是32位架构)
strlen(Name) == length in chars of the string
因为该函数完全用于计算字符串的长度.