¥¥请各位来看这个高难度问题¥¥(200分)

  • 主题发起人 主题发起人 drmy
  • 开始时间 开始时间
D

drmy

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在有一个一维数组叫做MyArray,这个数组中的每一个元素都是一个结构体,
而这个结构体中不仅包含多个字符串和数字类型变量,还包含一个子数组,
而这个子数组的每一个元素又是一个结构体。
我希望把这个总数组MyArray存到Stream中,总之是希望把它转成BLOB方式,
我好把这个自定义的数据包用http的方式传送给网络上的另一台机器。

请问如何做?不知道的给点提示也好。
 
一个字节一个字节往里存啊,子数组的就要做个标志了,不然怎么知道有几级?
 
先给每个结构体加一个ID字段和ParentID字段,ID是每个节点(结构体)的编号,要全局唯一,
然后,每个子节点的ParentID指向它的父节点,这样就可以组成一个树。然后用树的遍历算法将
其线性输出到流中。恢复的时候,按照ID和Parent重新组合成树即可。
例如:
struc mystruc {
int id;
int parentid;
其他的数据、数组什么的;
}
 
fatalexception:
可否给点代码提示?你说的很有道理,可是我不会具体实现
 
告诉我你的树是怎么结束的啊,不可能没有终端节点啊。
 
采用数据链,可以保存到一个自己定义的数据文件里面。
 
fatalexception:
具体结构没有定,你可以按照自己按照2层或3层自己定个结构样子,做下程序试试看。
谢谢了。
 
L0.L1[j].L2[k]......一直下去,肯定能到最底层的!
 
好的。试试看吧,不过我只会点pascal,不会c,就用pascal写了。
 
每个数据结构都取一个标识名,
将标识名和数据按数据结构定义的顺序写入流中,
但要注意标识名和数据内容的重复!可以考虑转义符。
 


//假设数组有三个元素,即树的度为3
//假设树的末端(叶子节点)结束在数组元素中,哪个数组元素为nil,就表示它没有子树
了(但不表示它的兄弟没有子树)
//由于是数组,不是指针链表,不能置nil,只能用标志域来表示nil。假设ID=0表示为空。

Type
TNode=Record
ID:Integer;
PID:Integer;
Data:String;
Child:TNodeArray;
End;
TNodeArray=Array[1..3] of TNode;

procedure SaveNodeToStream(ANode:TNode);
begin
将一个结构体ANode写入流,你自己写吧。
end;

procedure SaveTree(root:TNodeArray);
begin
SaveNodeToStream(root);
if root.Child[1].ID<>0 then
SaveTree(root.Child[1]);
if root.Child[2].ID<>0 then
SaveTree(root.Child[2]);
if root.Child[3].ID<>0 then
SaveTree(root.Child[3]);
end;

Var
GenRoot:TNodeArray; //总的根

begin
//初始化树(建立根,根据数据建立节点,在此过程中给每个节点编号,空者ID为0,并将子节点的PID指向父节点)
InitTree(GenRoot);

//将树存入流
SaveTree(GenRoot);

end.
 
不过啊,我对你设计的这种结构不是很赞同……你自己推敲推敲……
 
老兄,真是不好意思,可否告知怎么将一个结构体ANode写入流?
 
  
  我感觉数据结构好象有问题。你想啊,你以数组为基本单位,一个数组,内存固定分配
了的,数组元素呢,不论值是多少,元素本身(结构体)也是已经存在了的,每个结构体自
然又有数组,数组又有结构体,这样的话根本就没有尽头!
  应该用结构体为基本单位,用指针做连接。例如:
  
TNode=Record
pC:PNode; // Pointer to the first child
pB:PNode; // Pointer to the immediate younger brother
Data:String; //数据域可有多个,可有各种类型,现在以字符串为例。
End;
PNode:^TNode;

这样可以构成一个链表实现的树。不知道你是否认可。:-)
   
 
接受答案了.
 
后退
顶部