程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 二叉樹算法引發的思考:指針參數傳遞、引用的陷阱

二叉樹算法引發的思考:指針參數傳遞、引用的陷阱

編輯:關於C語言

最近想熟悉一下基本的數據結構和算法,於是寫了一個二叉樹程序,功能很簡單,只有二叉樹的建立和遍歷。在這個過程中,卻發現了一些平時沒有注意到的細節問題,寫出來作為總結和大家分享。

 

待討論和遇到的細節問題如下:

(1)常見的定式思維:指針作為參數傳遞,是否就不需要再賦值,因為指針指向的值會同步更改,但是,你有考慮過,如果指針變量本身的值被更改了呢?怎麼辦?

(2)比較不常用的用法,針對指針變量的引用,你用過嗎?

 

前提:

(1)筆者考慮到自己一直混淆使用C和C++,於是,打算這個簡單的算法程序采用純C來寫,因此使用的是C編譯器。

(2)關於C和C++的一些區別,筆者打算另外寫一些系列文章來總結分析。

(3)另外,因為是練習寫的程序,暫時還沒有添加內存釋放的方法。

程序的頭部定義以及通用的方法:

#include <stdio.h><malloc.h>

 TRUE 1
 FALSE -1 _BinaryTreeNode* _BinaryTreeNode** PreOrderTraverse(BinareTreeNode* pNode, (* (NULL !=->->->

筆者最初寫的程序如下:

 PreOrderCreateBinaryTree(BinareTreeNode*, & ( ==== (BinareTreeNode*)malloc(->elem =->->* pHeadNode = 

 

 

具體問題現象:

原本以為這樣寫是沒有問題的,實際上,main函數中的pHeadNode的值一直都是NULL,導致PreOrderTraverse時沒有任何值輸出。
輸入:ABD##E##C## 遍歷後輸出:無,原因是傳入的參數值pHeadNode為NULL。

 

具體問題分析:

為什麼會這樣呢?

本文討論的第一個問題浮出水面:常見的定式思維:指針作為參數傳遞,是否就不需要再賦值?

分析:

雖然是指針傳遞,main函數中的pHeadNode,是一個指針變量,指針變量的值為空,不存在指向的值。

PreOrderCreateBinaryTree函數中的形參pNode卻是另一個指針變量,剛開始的時候其值由main函數中傳入,也是NULL,後來pNode經過malloc被重新賦值。

問題是,main函數中的pHeadNode有沒有被同步改變呢?不是說指針傳遞,值會一起改變嗎?

其實,這裡犯了一個低級錯誤,就是說使用指針作為函數的參數,指針沒有被重新賦值的情況下,指針指向的值一定是會被同步更改的,但是如果指針作為一個變量,本身的值發生更改,那麼參數源是不會發生改變的。

舉個例子:

( FuncChangeObj(**pInt)++ FuncNoChangeObj(*= (*)malloc((*pInt = 

上例二叉樹程序先序遍歷不成功,就是因為先序創建二叉樹的時候,並沒有將二叉樹的根節點返回,導致pHeadNode一直為NULL。

那麼,是不是說,上述程序其實創建二叉樹成功,只是沒有返回樹的根節點呢?不然,因為也是同樣的原因,導致這個二叉樹並沒有創建成功,各個樹節點之間並無關聯,全是孤立的節點。

 

具體問題解決之道:

如何修改呢?
給出答案如下:
方法一:函數返回指針,對源指針進行賦值

BinareTreeNode* PreOrderCreateBinaryTree(BinareTreeNode*, & ( ==== (BinareTreeNode*)malloc(->elem =
pNode->left = PreOrderCreateBinaryTree(pNode->->right = PreOrderCreateBinaryTree(pNode->* pHeadNode == 

 

方法二:使用指針的引用進行傳值,即對指針變量本身進行引用,而不是指針變量值傳遞
注:本方法即是對第二個問題的闡釋,但是要要注意,此方法在C語言編譯器中是無法編譯成功過的,因為C語言中並不存在引用的概念。

 PreOrderCreateBiTree2(BiTree&, & ( ==== (BinareTreeNode *)malloc(->elem =->->= 

 

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