程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 非遞歸二叉樹遍歷-c語言中函數指針作為參數與函數的嵌套

非遞歸二叉樹遍歷-c語言中函數指針作為參數與函數的嵌套

編輯:編程綜合問答
c語言中函數指針作為參數與函數的嵌套

函數指針作為另一函數的參數和函數的嵌套的區別,感覺都是調用,有什麼不一樣呢?他們都適用在什麼情況下!(我是在學非遞歸遍歷二叉樹時看到的)
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增加判斷條件來加以區分,這樣增加了代碼量。

希望我的回答對您幫助!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved