SOS--数据结构及算法(100分)

  • 主题发起人 主题发起人 lemonloveyan
  • 开始时间 开始时间
L

lemonloveyan

Unregistered / Unconfirmed
GUEST, unregistred user!
一个表中的两个字段 ID(ID号) 和 SJid(上级ID):
顶级纪录 ID=SJid
001---11
---12
---13---31
---32---301
---302
---303
002---22
---23
若动态输入一个名称:类别(且无论级次多少) 都能找出该类的所有明细;
假如输入为 名称:明细 也可以找出该明细

在线等待-----------------------------------
 
有意思。gz。
 
是找下级吗?
Select Id from table where sjid='....'
 
不通不顺不知所云。
 
需要学习提问的技巧,看不懂题意.
 
不是吧!???
具体说就是根据一个表中两个字段 id 和 SJid 可以形成一个树型结构,当然会有
多级了!
现在就是我 取一个id (形象的说就是tree中的一个节点名称),结果要找出它的
所有下级(该tree节点的所有叶结点名称)
这里注意: id 是可以等于 SJid 的
比如:
表结构
id SJid
11 001
12 001
13 001
31 13
39 31
32 13
301 32
302 32
303 32
 22  002
23 002
。。。。。。。。

  形象表示为tree 
001-
|--11
|--12
|--13-
|---31-
|---39
|---32-
|---301
|---302
|---303
002 -
|---22
|---23
输入 001 结果为 11,12,13,31,39,32,301,302,303
输入13 结果为 31,32,39,301,302,303
输入32 结果为 301,302,303
输入22 结果为 NULL (没有下级)

一个算法怎么实现(包括具体细节)
 
你是要生成树的算法还是查找子节点的算法
 
siyan
算法啊!
(其实别人帮我设计的物品表是这样的,当查询大类时,就要得出此大类的所有最明细
的物品!)
 
如果你的id和SJid里的数据没有什么特殊规则的话,我个人觉得生成树的算法
不是很好做,至少我不知道怎么获取第一层节点,第一层节点的数据有什么特殊标示吗
 

siyan

哦,这样的,有的:
一级 为 (字段) jc =1
二级 为 (字段) jc =2
.......................
且 若为类别的话,还有 (字段) bs='0' 若为物品 bs='1'
(特殊的是 物品的级次 jc 都为 2 ((要改的话也可以)) )
 
[8D]
很好做,信不信?现在告诉你,还真有点太可惜了,等一会儿吧。
 
不可惜的,何况我明天要交工呢!
我试验了一下,就是到最底级之后返回 是个问题。
至于其他得我都没有仔细考虑了!
把分全给你吧,我都没去吃饭呢,就等这个东西了!
Than You Very Much!!!
 
我觉得好象是树的遍历
 
有个笨办法
slist:tstrings;
count:integer;
query:tquery;
sqlstr:string;

sqlstr:='select id from TABLENAME where sjid=XXX '
do
query.sql.clear;
query.sql.add(sqlstr);
query.open;
count:=query.recordcount;
if count>0 then
begin
; ////将query的值加到slist中,你要的东东就在这里面了
end;
sqlstr:='select id from TABLENAME where sjid in ('+sqlstr+')';
until count=0; //就这样一层层递增归查询,只是不知道有没有层数限制

其实你就可以将slist中的值一个一个地写入到SQL语句中去,那样就没有问题了。
我的感觉,你的表设计有一些欠缺,可能需要增加一个辅助字段。


 
[8D][8D]
可以了,我是用SQL完成的,如果你是用DELPHI,就改一下吧:

假设你原来的表叫A
你建立一个表B,表结构如下:
ID FLAG

再假如你输入的变量叫X
[red]再补充一下,在正常运行时要先删除原有记录:
DELETE FROM B[/red]
先插入第一层下节点:
INSERT INTO B SELECT ID,1 FROM A WHERE SJID = X
然后用一个循环
WHILE (SELECT COUNT(*) FROM A INNER JOIN B ON A.SJID = B.ID AND FLAG = 1) > 0
BEGIN
INSERT INTO B SELECT A.ID,0 FROM A INNER JOIN B ON A.SJID = B.ID AND FLAG = 1
UPDATE B SET FLAG = 2 WHERE FLAG = 1
UPDATE B SET FLAG = 1 WHERE FLAG = 0
END

可以了,多少层都无所谓,B表中就是你要的类别,取出明细记录不用我说了吧。
有没有更好的办法,请高手们指正!
 
都不是可行的方法,我觉得!
 
[:(!]
兄弟,说话要凭良心啊,为什么不行?
 
如果SQL熟的话,做个存储过程试一试。
如果一定要用DELPHI的话,就把它翻译马DELPHI语言的。
也许有个别错别字。
如果方法真不行,我倒给你300分。你要再说不行,我就删了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部