函數指針作為另一函數的參數和函數的嵌套的區別,感覺都是調用,有什麼不一樣呢?他們都適用在什麼情況下!(我是在學非遞歸遍歷二叉樹時看到的)
Status Visit(TElemType e){
printf("%c\n",e);
return OK;
}
Status InOrderTraverse(BiTree T ,Status(*Visit)(TElemType e)){
SqStack S; InitStack(S); Push(S,T); SElemType p;
while (!StackEmpty(S)){
while(GetTop(S,p)&&p) Push(S,p->lchild);
Pop(S,p);
if(!StackEmpty(S)){
Pop(S,p); if(!Visit(p->data)) return ERROR;
Push(S,p->rchild);
}//if
}//while
return OK;
}
這裡邊Visit是函數指針,而SqStack和InitStack是嵌套,他們都不都是在調用嗎?為什麼在InOrderTraverse的參數中不再加上SqStack和InitStack呢,或者將參數*Visit去掉直接調用呢?
您好,針對這個問題
Status InOrderTraverse(BiTree T ,Status(*Visit)(TElemType e))函數中第2個參數是一個指向函數的指針,這樣做的目的是為了程序的靈活性。試想如果給你一個整型數100,要求分別按照10進行、16進制輸出,你可以寫一個輸出10進制函數與輸出16進制函數,當你有需要輸出16進制時,只需要將16進制函數地址傳給Visit就行,而不需要改變InOrderTraverse函數,這種做法靈活,也符合軟件工程編程思想。
另外,InitStack(S); 就是函數調用,這種就在InOrderTraverse已經寫死了,如果有幾種初始化情況的話,就得在InOrderTraverse增加判斷條件來加以區分,這樣增加了代碼量。
希望我的回答對您幫助!