在一般的头文件 都有包含 若编译过程 报错 则可以自己定义 : #define NULL (void*)0
2.在函数声明的时候 可以 给参数 一个默认值 -------定义的时候不给写 如下:
node( ElemType e,node<ElemType>* link =NULL);
template<typename ElemType>
node<ElemType>::node( ElemType e,node<ElemType>* link)
{
data=e;
next=link;
}
3. for(表达式1;表达式2;表达式3)=====for(初始化条件,循环条件,变量改变)
for语句是常用的循环语句 : 今天尝试了在 循环终止区==表达式3 写了一个逗号表达式 程序一直没有正常run
于是怀疑 for表达式中不能用逗号, 开玩笑 记得是可以的 -----原来是循环条件写错了 不会进入循环体 也就不会执行 表示3
程序:用来从链表中 特定节点或取元素的值
template<typename ElemType>
bool LinkList<ElemType>::GetElem(int addr,ElemType& e)
{
bool ret =0;
node<ElemType>*p= head;
int k=10;
if( (addr >1) && (addr <=length))
{
// for(;addr==1;addr--,p=p->next,k--); ERROR addr ==1 will not run for
for(;addr!=1;addr--,p=p->next,k--);// not {}
cout<<"k=="<< k<<endl;
/* while(addr != 1 )
{
//p=p->next;
addr--;
}
*/
e= p->data;
ret=1;
}
return ret;
}
结果:在 纠正 循环条件后 ,表达式3 也就执行了 ,k 是用类似测试 到底有没有进行 逗号表达式的,while的实现和for一样
ct@ubuntu:~/Desktop$ g++ 1.cpp
ct@ubuntu:~/Desktop$ ./a.out
k==8
get len3
num 1 value 5
num 2 value 3
num 3 value 2
3
4. 以函数指针作为函数的参数 ---我居然 搞不清楚怎么调用了
c中函数的指针的主要作用:起回调 作用 -----这个可以参考关于 函数指针的博客
现在想---函数指针的回调 有点 c++ 中多态的赶脚
:函数指针 指向的是 一类函数 只要类型一致 函数体实现不一样(可以理解是不同的定义)那么调用就会有不同的结果
template<typename ElemType>
void LinkList<ElemType>::traverse(void (*view)(ElemType &e) ) //--------function point argument
{
assert(!IsEmpty());
node<ElemType>* p =head->next;
for(int i=1;i<length;i++) //from 1 start while( p!=NULL)
{
(*view)(p->data); //use the function
p=p->next;
}
}
template<typename ElemType> //----------define
void view(ElemType& e)
{
cout<<" the current element is "<<e<<endl;
}
traverse( ) 遍历函数: 有个参数是 函数指针----指向的函数类型是: 有个EelmType 类型的参数 返回值为void
只要符合该类型的函数----在 void LinkList<ElemType>::traverse(void (*view)(ElemType &e) ) 该函数中 带入实际函数地址(函数名) 就可以实现对应函数的调用
接下来看一下今天的错误:
int a=0;
TLINK.traverse(view(a));
^
1.cpp:34:25: error: invalid use of void expression
TLINK.traverse(view(a));
错误:直接在参数的位置调用函数了 ,而且该函数没有返回值 ,即使想隐式类型转换也是不可能的 所以相当与这里是没有参数的
实际上会犯这个错误---说明我对函数参数 和 函数指针 的使用都不 熟悉。
函数是个函数指针 只要传入函数地址即可(就是把要执行的函数 的地址 赋值给参数 ,有个方法:类比成一般的参数就会好理解很多)