免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 3018857
打印 上一主题 下一主题

数据结构保存问题!急!(高手请进) [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-10-12 15:01 |只看该作者
两个数组,一个存节点,
一个数组保存节点的关系(使用二维) 如果2节点和4节点相连,表达为(2,4),那么建立他们之间的连接。

论坛徽章:
0
32 [报告]
发表于 2007-10-12 15:43 |只看该作者
原帖由 3018857 于 2007-10-12 14:52 发表
说的有理,我的结构确实比较复杂.
请问用ID的方法是指什么,我的每个节点大小不同,如果用ID来区别的话,还是存在文件分段的问题吧!如果不分段,那些属于不同父节点但编号有一样的节点,在从新载入的时候就没办法了吧?


一般的数结构或图结构每个节点大小是相同的,麻烦的是可能节点中除了用于建立自身的树结构的指针外,还有指向其他树结构的指针。

序列化时可对不同结构的对象分别建立各自的数组,遍历时将不同结构的节点或对象序列化到各自的数组中,然后就用数组下标作为ID即可,store时将指针转换为ID存档,load时反之。

论坛徽章:
0
33 [报告]
发表于 2007-10-12 15:45 |只看该作者
另外如果有类的继承关系可能还要麻烦点

论坛徽章:
0
34 [报告]
发表于 2007-10-12 21:43 |只看该作者
原帖由 3018857 于 2007-10-12 14:55 发表
谢谢你能帮助解决问题,万分感谢!
用ID的方法是指什么呢?载入的时候是不是首先都载入,再根据事先约定的ID来建立关系呢?还有我的每个节点都是一个结构( struct),而且大小不同!


我是说存的时候把指针 cast 成32的整数或64位整数(根据你机器来确定)做ID 就可以存储了. 读进来的时候, 你的object 放在什么地址, 就把这地址得到, 取代原来的那个 ID 就可以了. 你若是都在一个内存块里, 就可以只取首地址, 其他的减一下偏移就可以了

论坛徽章:
0
35 [报告]
发表于 2007-10-12 22:05 |只看该作者

回复 #34 jato 的帖子

我读的时候根本不知道我有几个对象啊,需要根据存储的数据及关系自动生成!

论坛徽章:
0
36 [报告]
发表于 2007-10-12 22:15 |只看该作者

回复 #32 woshiwo 的帖子

谢谢!
不过我的问题是:现在结构(struct)相同的节点,他们有不同的父节点,在不同父节点下他们的ID都是1,2,3,.....


            s:          s1   <->         s2

                      /  /  \        /   /  \   \

            f:     1<-> 2<-> 3      1<-> 2<->3<->4

struct ss
{
struct ff *f;
id;
struct ....

} s1,s2;

struct ff
{
struct ss m_pS;
id;
.....

};
f层每个需要时才建立.
即我不知道每个s下面有多少个f!

如果s层作为一个数组存起来,f层也用令一数组存,则出现ID相同的情况啊!

[ 本帖最后由 3018857 于 2007-10-12 22:35 编辑 ]

论坛徽章:
0
37 [报告]
发表于 2007-10-12 22:27 |只看该作者

回复 #31 Maitou 的帖子

你说的情况适合简单的问题,如果我的每个节点大小不同呢?

struct ss
{
struct ff *f;
id;
struct ....

} s1,s2;

struct ff
{
struct ss m_pS;
id;
.....

}

           s:          s1                s2
                      / / \         /  /  \  \

            f:      1 2     3      1  2   3   4

论坛徽章:
0
38 [报告]
发表于 2007-10-12 22:37 |只看该作者
可以这样想问题:

如果计算机休眠了,是不是要将内存全部保存到一个文件?

你也这样做不就可以了? 只不过是只保留你的数据的部分,在将文件中的空洞压缩掉.

论坛徽章:
0
39 [报告]
发表于 2007-10-12 23:16 |只看该作者
不过我的问题是:现在结构(struct)相同的节点,他们有不同的父节点,在不同父节点下他们的ID都是1,2,3,.....


            s:          s1   <->         s2

                      /  /  \        /   /  \   \

            f:     1<-> 2<-> 3      1<-> 2<->3<->4

struct ss
{
struct ff *f;
id;
struct ....

} s1,s2;

struct ff
{
struct ss m_pS;
id;
.....

};
f层每个需要时才建立.
即我不知道每个s下面有多少个f!

如果s层作为一个数组存起来,f层也用令一数组存,则出现ID相同的情况啊!



不同父节点下的相同结构的子节点应该使用相同的全局数组,ID当然也应该统一编码才对。

你这个其实不是真正的树结构。但同样可以实现:
定义ff层数组:struct ff ffff[many];
定义ss层数组:struct ss ssss[many-many];

遍历ff:

int  ff_index, ss_index;

for_each_ff (ff) {     
     ffff[ff_index] = ff;
     ff->ff_ID = ff_index;
     ff_index++;
   
    ff->fist_ss_ID = ss_index;

    for_each_sub_ss(ss) {
        ssss[ss_index] = ss;
        ss->ss_ID = ss_index;
        ss->ff_ID = ff->ff_ID;
        ss_index++;
   }

   ff->last_ss_ID = ss_index - 1;
}

然后将ffff ssss存档。load时,先载入ffff ssss,再依据ID重建结构。

只是粗略的想法……

论坛徽章:
0
40 [报告]
发表于 2007-10-13 01:23 |只看该作者
如果不太在乎效率,用XML方便、可扩展性强
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP