C语言二叉树遍历程序

C语言二叉树遍历程序,第1张

先看下creat这个函数:

status creat(bitnode t)/先序建立二叉树/

{

char ch;

ch=getch();putch(ch);

if(ch=='0') t=NULL;

else

{

t=(bitnode )malloc(sizeof(bitnode));

if(!t)

exit(OVERFLOW);

t->data=ch;

creat(t->lchild);

creat(t->rchild);

}

return OK;

}

其中有句代码是t=(bitnode )malloc(sizeof(bitnode));

这是给t赋值,由于t是参数,这样做是不能返回的。

我知道你的意思是想通过指针返回,但是那样的用法应该是对t所指向的变量赋值,也就是对t赋值。

如果你还没理解的话看下函数里的递归调用:creat(t->lchild);调用函数后,本意是要给t->lchild赋值的,但是是做不到的,因为要改变一个变量的值的话,应该传的是它的地址。

可能你觉得有点乱了,我举个函数中用指针做参数来返回的例子:

假如要用指针返回一个整型的变量,那么指针应该是指向整型变量的,即int

这里应该是要返回一个struct bitnode 类型的,也就是返回的值就是个指针,那么参数就应该是一个指向这种指针的指针,即struct bitnode

可以这么修改:

status creat(bitnode t) //多了个

{

char ch;

ch=getch();putch(ch);

if(ch=='0') t=NULL; //多了个

else

{

t=(bitnode )malloc(sizeof(bitnode)); //多了个

if(!t) //多了个

exit(OVERFLOW);

(t)->data=ch;

creat(&(t)->lchild); //注意不同

creat(&(t)->rchild);

}

return OK;

}

主函数这么改

status main()

{

bitnode t1; //多了个

creat(&t1);

pre(t1,print); //少了个&

getch();

return 0;

}

另外一个编译错误就是

int pre(bitnode t,status (visit)())

指针函数后面应该带参数,改为

int pre(bitnode t,status (visit)(bitnode ))

是随机输出的。

我写了个测试程序你可以看一下:

package dataStructure;

import javautil;

public class TestMap {

public static void main(String[] args) {

Map<String,Integer> hashMap=new HashMap<String,Integer>();

hashMapput("Smith", 30);

hashMapput("Cool", 29);

hashMapput("Lewis", 31);

Systemoutprintln(hashMap);

}

}

输出结果:

{Smith=30, Lewis=31, Cool=29}

你可以看到这个跟key或者value的顺序都没关系的,java书上又讲到的,只有LinkedHashMap是有序的输出,HashMap是无序的

mysql的INFORMATION_SCHEMA中的COLUMNS记录所有字段的信息。

可以直接查询这个表就可以。

例:查询所有字段的名称:

select COLUMN_NAME from INFORMATION_SCHEMACOLUMNS;

查询某表(a)所有字段的名称:

select COLUMN_NAME from INFORMATION_SCHEMACOLUMNS where TABLE_NAME='a';

1检查一下游标C1中查询语句的执行计划,看看是不是耗时很多。10万数据并不多,而且你做了函数索引。所以我猜这个不是问题产生的原因;

2检查一下你的两层循环到底有多少次,是不是次数过多。目测不会超过10万吧。所以应该也不是问题关键;

以上两点可以通过使用plsql developer工具debug该过程时,点击create profiler report,然后执行,再从debug界面的profiler分页查看。

3你的过程中 update cyd 和 fhz,执行过程的时候,有没有什么其他程序再多两个表做update,有没有锁表。cup使用率是否高;

4通常不要在查询a表的循环中对a表update。你这里查询Cyd内部就对Cyd进行了update,这样有问题。我曾经遇到过,程序会锁住。

对于你的程序,给你个建议,把一下这段代码写成一个function,在由表中查寻结果中直接调用:

FOR i IN 1 Lengthb(Yw_Old) LOOP

Tmp := Substr(Yw_Old, i, 1);

IF (Tmp = 'A') THEN

Yw_New := Yw_New || 'B3';

ELSIF (Tmp = 'B') THEN

Yw_New := Yw_New || 'B3';

ELSIF (Tmp = 'C') THEN

Yw_New := Yw_New || 'C1';

ELSIF (Tmp = 'D') THEN

Yw_New := Yw_New || 'D1';

END IF;

END LOOP;

假设function叫做fun_pack,游标改成这样:

CURSOR C1 IS

SELECT Cyh,

fun_pack(Yw),

Pzyw,

Djyw

FROM Cyd

WHERE Substr(Slsj, 1, 4) = Yearc;

MySql数据库中存在大量的表结构,而且这些表都存在一个共同点,就是表中都有相同字段,比如id,name,city,adress,lat,lng。表中字段id,name,city,adress不允许为空,所以表中这几个字段的数据都是已经赋给实值的,而lat与lng(经纬度)是为空的。

现在要写一个程序,根据city,adress请求获取数据,把循环每一表中根据city,adress请求获取的数据更新到相应表,相应表中对应的那一行数据。这句话,可能你有点晕,说白了就是,先循环查询遍历表中city与adress的值,根据city,adress的值请求获取数据,更新到相应行中,这个表循环更新完了就跳到下个表中再循环更新,以此类推,直到全部更新。

用记录集对象打开数据库表,对记录集遍历即可:

Do while not rsEOF

rsfields(i)="aa"'对当前记录某列赋值

rsMoveNext

loop

以上就是关于C语言二叉树遍历程序全部的内容,包括:C语言二叉树遍历程序、我用的for(Map.Entry<String, Integer> m:temp.entrySet())进行的遍历,确定是随机的我遍历整个表、MySQL数据表遍历问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10121422.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存