c语言结构体小问题

dingyuanpu 2010-07-26 10:15:18
讨论一下技巧,怎样省略双链表中的根节点的值字段?

答:如果根节点是动态分配内存的,我们可以通过只为节点的一部分分配内存来达到目的。
Node *root;
root = malloc(sizeof(Node) – sizeof(ValueType));

一种更安全的方法是声明一个只包含指针的结构。指针就是这类结构之一,每个节点只包含这类结构中的一个。这种方法的有趣之处在于结构之间的相互依赖,每个结构都包含了一个对方类型的字段。这种相互依赖性就在声明它们是产生了一个“先有鸡还是先有蛋”的问题:哪个结构先声明呢?这个问题只是通过其中一个结构标签的不完整声明来解决。
struct DLL_NODE;

struct DLL_POINTERS
{
struct DLL_NODE *fwd;
struct DLL_NODE *bwd;
};

struct DLL_NODE
{
struct DLL_POINTERS pointers;
int value;
};



红色部分不明白,到底如何省略双链表中的根节点的值字段了?????
...全文
102 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
眼睛猥琐男 2010-07-27
  • 打赏
  • 举报
回复
设计模式?
zhangweiit 2010-07-26
  • 打赏
  • 举报
回复
同时,我也同意2楼的观点

这个链表的设计,与我平常用的,有点不一样
我不太习惯用这样的方法设计

我宁可多一个根值的空间,也要代码可读性强一点

zhangweiit 2010-07-26
  • 打赏
  • 举报
回复
这就相当于,
假设,MyClass,很大,占用1000个字节
MyClass obj;
这个obj就去了1000字节
而,MyClass *pObj;
这个pObj,只占4个字节,因为是指针类型
nossiac 2010-07-26
  • 打赏
  • 举报
回复
不知道你这段话哪里弄来的,我觉得,根本没有必要有所谓根结点.
一个指针就可以搞定.


struct DLL_POINTERS
{
struct DLL_NODE *fwd;
struct DLL_NODE *bwd;
};

strunt DLL_POINTER * pRoot = NULL; //这就是"根结点",现在链表为空
链接第一个元素的时候,该元素的bwd为空即可.
zhangweiit 2010-07-26
  • 打赏
  • 举报
回复
struct DLL_POINTERS
{
struct DLL_NODE *fwd;
struct DLL_NODE *bwd;
};

它这里的意思是指,
只需要声明一个DLL_POINTERS为根节点,而这个根节点,
只占据两个指针类型的空间,不需要占用DLL_NODE类型的实际空间

其实,上面那个代码,在值 类型为int的时候,基本是没有省空间的
因为一个指针类型也相当于一个int类型的空间
但是,当值类型不是int类型的时候,上面的代码就发挥作用了

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧