
先看下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数据表遍历问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)