(2021年整理)C和C++經(jīng)典面試題(面試必備)_第1頁
(2021年整理)C和C++經(jīng)典面試題(面試必備)_第2頁
(2021年整理)C和C++經(jīng)典面試題(面試必備)_第3頁
(2021年整理)C和C++經(jīng)典面試題(面試必備)_第4頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、c和c+經(jīng)典面試題(面試必備)c和c+經(jīng)典面試題(面試必備) 編輯整理:尊敬的讀者朋友們:這里是精品文檔編輯中心,本文檔內(nèi)容是由我和我的同事精心編輯整理后發(fā)布的,發(fā)布之前我們對文中內(nèi)容進(jìn)行仔細(xì)校對,但是難免會(huì)有疏漏的地方,但是任然希望(c和c+經(jīng)典面試題(面試必備))的內(nèi)容能夠給您的工作和學(xué)習(xí)帶來便利。同時(shí)也真誠的希望收到您的建議和反饋,這將是我們進(jìn)步的源泉,前進(jìn)的動(dòng)力。本文可編輯可修改,如果覺得對您有幫助請收藏以便隨時(shí)查閱,最后祝您生活愉快 業(yè)績進(jìn)步,以下為c和c+經(jīng)典面試題(面試必備)的全部內(nèi)容。c/c+經(jīng)典面試題(面試必備)面試題 1:變量的聲明和定義有什么區(qū)別為變量分配地址和存儲(chǔ)空間的

2、稱為定義,不分配地址的稱為聲明。一個(gè)變量可以在多個(gè)地方聲明,但是只在一個(gè)地方定義。加入 extern 修飾的是變量的聲明, 說明此變量將在文件以外或在文件后面部分定義.說明:很多時(shí)候一個(gè)變量,只是聲明不分配內(nèi)存空間,直到具體使用時(shí)才初始化,分配內(nèi)存空間,如外部變量. 面試題 2:寫出 bool 、 int、 float、指針變量與“零值” 比較的 if 語句bool 型數(shù)據(jù):if( flag )a;elseb;int 型數(shù)據(jù):if( 0 != flag )a;elseb;指針型數(shù):if( null = flag )a;elseb;float 型數(shù)據(jù):if ( ( flag = norm ) &

3、 ( flag = norm ) )a; 2注意:應(yīng)特別注意在 int、指針型變量和“零值”比較的時(shí)候,把“零值放在左邊,這樣當(dāng)把“ =”誤寫成“ =”時(shí),編譯器可以報(bào)錯(cuò),否則這種邏輯錯(cuò)誤不容易發(fā)現(xiàn),并且可能導(dǎo)致很嚴(yán)重的后果。 面試題 3: sizeof 和 strlen 的區(qū)別sizeof 和 strlen 有以下區(qū)別:q sizeof 是一個(gè)操作符, strlen 是庫函數(shù)。q sizeof 的參數(shù)可以是數(shù)據(jù)的類型,也可以是變量,而 strlen 只能以結(jié)尾為0的字符串作參數(shù)。q 編譯器在編譯時(shí)就計(jì)算出了 sizeof 的結(jié)果。而 strlen 函數(shù)必須在運(yùn)行時(shí)才能計(jì)算出來。并且 size

4、of計(jì)算的是數(shù)據(jù)類型占內(nèi)存的大小,而 strlen 計(jì)算的是字符串實(shí)際的長度。q 數(shù)組做 sizeof 的參數(shù)不退化,傳遞給 strlen 就退化為指針了.注意:有些是操作符看起來像是函數(shù),而有些函數(shù)名看起來又像操作符,這類容易混淆的名稱一定要加以區(qū)分,否則遇到數(shù)組名這類特殊數(shù)據(jù)類型作參數(shù)時(shí)就很容易出錯(cuò)。最容易混淆為函數(shù)的操作符就是 sizeof。面試題 4: c 語言的關(guān)鍵字 static 和 c+ 的關(guān)鍵字 static 有什么區(qū)別在 c 中 static 用來修飾局部靜態(tài)變量和外部靜態(tài)變量、函數(shù)。而 c+中除了上述功能外,還用來定義類的成員變量和函數(shù)。即靜態(tài)成員和靜態(tài)成員函數(shù)。注意:編程

5、時(shí) static 的記憶性,和全局性的特點(diǎn)可以讓在不同時(shí)期調(diào)用的函數(shù)進(jìn)行通信,傳遞信息,而 c+的靜態(tài)成員則可以在多個(gè)對象實(shí)例間進(jìn)行通信,傳遞信息.面試題 5: 中的 malloc 和中的 new 有什么區(qū)別malloc 和 new 有以下不同:( 1) new、 delete 是操作符,可以重載,只能在 c+中使用.( 2) malloc、 free 是函數(shù),可以覆蓋, c、 c+中都可以使用。( 3) new 可以調(diào)用對象的構(gòu)造函數(shù),對應(yīng)的 delete 調(diào)用相應(yīng)的析構(gòu)函數(shù).( 4) malloc 僅僅分配內(nèi)存, free 僅僅回收內(nèi)存,并不執(zhí)行構(gòu)造和析構(gòu)函數(shù)( 5) new、 delet

6、e 返回的是某種數(shù)據(jù)類型指針, malloc、 free 返回的是 void 指針.注意: malloc 申請的內(nèi)存空間要用 free 釋放,而 new 申請的內(nèi)存空間要用 delete 釋放,不要混用。因?yàn)閮烧邔?shí)現(xiàn)的機(jī)理不同。 面試題 6: 寫一個(gè)“ 標(biāo)準(zhǔn)” 宏 min#define min(a,b)((a)=(b)?(a):(b))注意:在調(diào)用時(shí)一定要注意這個(gè)宏定義的副作用,如下調(diào)用:(+p)=(x)?(+p):(x).p 指針就自加了兩次,違背了 min 的本意。3 面試題 7: 一個(gè)指針可以是 volatile 嗎可以,因?yàn)橹羔樅推胀ㄗ兞恳粯?,有時(shí)也有變化程序的不可控性。常見例:子中斷

7、服務(wù)子程序修改一個(gè)指向一個(gè) buffer 的指針時(shí),必須用 volatile 來修飾這個(gè)指針.說明:指針是一種普通的變量,從訪問上沒有什么不同于其他變量的特性.其保存的數(shù)值是個(gè)整型數(shù)據(jù),和整型變量不同的是,這個(gè)整型數(shù)據(jù)指向的是一段內(nèi)存地址。 面試題 8: a 和a 有什么區(qū)別請寫出以下代碼的打印結(jié)果,主要目的是考察 a 和&a 的區(qū)別。#includevoid main( void )int a5=1,2,3,4,5;int ptr=(int *)(a+1);printf(”d,d,(a+1),(ptr1);return;輸出結(jié)果: 2, 5.注意:數(shù)組名 a 可以作數(shù)組的首地址,而&a 是數(shù)

8、組的指針.思考,將原式的 int *ptr=(int *)(&a+1);改為 int ptr=(int *)(a+1);時(shí)輸出結(jié)果將是什么呢? 面試題 9: 簡述 c、 c+程序編譯的內(nèi)存分配情況c、 c+中內(nèi)存分配方式可以分為三種:( 1) 從靜態(tài)存儲(chǔ)區(qū)域分配:內(nèi)存在程序編譯時(shí)就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。 速度快、 不容易出錯(cuò),因?yàn)橛邢到y(tǒng)會(huì)善后。 例如全局變量, static 變量等。( 2) 在棧上分配:在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。(

9、3) 從堆上分配:即動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用 malloc 或 new 申請任意大小的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用 free 或 delete 釋放內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期由程序員決定,使用非常靈活。 如果在堆上分配了空間,就有責(zé)任回收它,否則運(yùn)行的程序會(huì)出現(xiàn)內(nèi)存泄漏, 另外頻繁地分配和釋放不同大小的堆空間將會(huì)產(chǎn)生堆內(nèi)碎塊.一個(gè) c、 c+程序編譯時(shí)內(nèi)存分為 5 大存儲(chǔ)區(qū):堆區(qū)、棧區(qū)、全局區(qū)、文字常量區(qū)、程序代碼區(qū).4 面試題 10: 簡述 strcpy、 sprintf 與 memcpy 的區(qū)別三者主要有以下不同之處:( 1) 操作對象不同, strcpy 的兩個(gè)操作對象均為字符串,

10、sprintf 的操作源對象可以是多種數(shù)據(jù)類型,目的操作對象是字符串, memcpy 的兩個(gè)對象就是兩個(gè)任意可操作的內(nèi)存地址,并不限于何種數(shù)據(jù)類型。( 2) 執(zhí)行效率不同, memcpy 最高, strcpy 次之, sprintf 的效率最低。( 3) 實(shí)現(xiàn)功能不同, strcpy 主要實(shí)現(xiàn)字符串變量間的拷貝, sprintf 主要實(shí)現(xiàn)其他數(shù)據(jù)類型格式到字符串的轉(zhuǎn)化, memcpy 主要是內(nèi)存塊間的拷貝。說明: strcpy、 sprintf 與 memcpy 都可以實(shí)現(xiàn)拷貝的功能,但是針對的對象不同,根據(jù)實(shí)際需求,來選擇合適的函數(shù)實(shí)現(xiàn)拷貝功能。 面試題 11: 設(shè)置地址為 0x67a9 的

11、整型變量的值為 0xaa66int *ptr;ptr = (int )0x67a9;ptr = 0xaa66;說明:這道題就是強(qiáng)制類型轉(zhuǎn)換的典型例子,無論在什么平臺(tái)地址長度和整型數(shù)據(jù)的長度是一樣的,即一個(gè)整型數(shù)據(jù)可以強(qiáng)制轉(zhuǎn)換成地址指針類型,只要有意義即可。 面試題 12: 面向?qū)ο蟮娜筇卣髅嫦驅(qū)ο蟮娜筇卣魇欠庋b性、繼承性和多態(tài)性:q 封裝性:將客觀事物抽象成類,每個(gè)類對自身的數(shù)據(jù)和方法實(shí)行 protection( private, protected,public)。q 繼承性:廣義的繼承有三種實(shí)現(xiàn)形式: 實(shí)現(xiàn)繼承( 使用基類的屬性和方法而無需額外編碼的能力)、可視繼承(子窗體使用父窗體的

12、外觀和實(shí)現(xiàn)代碼)、接口繼承(僅使用屬性和方法,實(shí)現(xiàn)滯后到子類實(shí)現(xiàn))。q 多態(tài)性:是將父類對象設(shè)置成為和一個(gè)或更多它的子對象相等的技術(shù).用子類對象給父類對象賦值之后,父類對象就可以根據(jù)當(dāng)前賦值給它的子對象的特性以不同的方式運(yùn)作。說明:面向?qū)ο蟮娜齻€(gè)特征是實(shí)現(xiàn)面向?qū)ο蠹夹g(shù)的關(guān)鍵,每一個(gè)特征的相關(guān)技術(shù)都非常的復(fù)雜,程序員應(yīng)該多看、多練. 面試題 13: c+的空類有哪些成員函數(shù)q 缺省構(gòu)造函數(shù).q 缺省拷貝構(gòu)造函數(shù)。q 缺省析構(gòu)函數(shù).q 缺省賦值運(yùn)算符。q 缺省取址運(yùn)算符。q 缺省取址運(yùn)算符 const。注意:有些書上只是簡單的介紹了前四個(gè)函數(shù).沒有提及后面這兩個(gè)函數(shù).但后面這兩個(gè)函數(shù)也是空類的默認(rèn)

13、函數(shù)。另外需要注意的是,只有當(dāng)實(shí)際使用這些函數(shù)的時(shí)候,編譯器才會(huì)去定義它們.5 面試題 14: 談?wù)勀銓截悩?gòu)造函數(shù)和賦值運(yùn)算符的認(rèn)識(shí)拷貝構(gòu)造函數(shù)和賦值運(yùn)算符重載有以下兩個(gè)不同之處:( 1)拷貝構(gòu)造函數(shù)生成新的類對象,而賦值運(yùn)算符不能.( 2)由于拷貝構(gòu)造函數(shù)是直接構(gòu)造一個(gè)新的類對象,所以在初始化這個(gè)對象之前不用檢驗(yàn)源對象是否和新建對象相同。而賦值運(yùn)算符則需要這個(gè)操作,另外賦值運(yùn)算中如果原來的對象中有內(nèi)存分配要先把內(nèi)存釋放掉注意:當(dāng)有類中有指針類型的成員變量時(shí),一定要重寫拷貝構(gòu)造函數(shù)和賦值運(yùn)算符,不要使用默認(rèn)的. 面試題 15: 用 c+設(shè)計(jì)一個(gè)不能被繼承的類template typename

14、 t class afriend t;private:a() a() ;class b : virtual public abpublic:b() b() ;class c : virtual public bpublic:c() c() ;void main( void )b b;/c c;return;注意:構(gòu)造函數(shù)是繼承實(shí)現(xiàn)的關(guān)鍵,每次子類對象構(gòu)造時(shí),首先調(diào)用的是父類的構(gòu)造函數(shù),然后才是自己的. 面試題 16: 訪問基類的私有虛函數(shù)寫出以下程序的輸出結(jié)果:#include iostream。hclass a 6virtual void g()cout ”a::g” endl;privat

15、e:virtual void f()cout ”a::f endl;class b : public avoid g()cout ”b::g endl;virtual void h()cout b::h endl;;typedef void( *fun )( void );void main()b b;fun pfun;for(int i = 0 ; i next)p-next = null;elsep-next = snext; pdata = data; /初始化新結(jié)點(diǎn)snext = p; /插入新結(jié)點(diǎn)return s;出棧函數(shù):node pop( linkstack &s)node te

16、mp;temp。data = 0;temp.next = null;if( null = s) /檢驗(yàn)棧printf(there no node in stack!);return temp;temp = s;10if( s-next = null )printf(the stack is null,cant pop!n”);return temp;linkstack p = s -next; /節(jié)點(diǎn)出棧s-next = s-next-next;temp = p;free( p );p = null;return temp;雙棧實(shí)現(xiàn)隊(duì)列的入隊(duì)函數(shù):linkstack stacktoqueupu

17、sh( linkstack &s, int data)node n;linkstack s1 = null;createnullstack( s1 ); /創(chuàng)建空棧while( null != snext ) /s 出棧入 s1n = pop( s );push( s1, n。data );push( s1, data ); /新結(jié)點(diǎn)入棧while( null != s1-next ) /s1 出棧入 sn = pop( s1 );push( s, n.data );return s;說明:用兩個(gè)棧能夠?qū)崿F(xiàn)一個(gè)隊(duì)列的功能,那用兩個(gè)隊(duì)列能否實(shí)現(xiàn)一個(gè)隊(duì)列的功能呢?結(jié)果是否定的,因?yàn)闂J窍冗M(jìn)后出,將

18、兩個(gè)棧連在一起,就是先進(jìn)先出。而隊(duì)列是現(xiàn)先進(jìn)先出,無論多少個(gè)連在一起都是先進(jìn)先出,而無法實(shí)現(xiàn)先進(jìn)后出.面試題 23: 計(jì)算一顆二叉樹的深度深度的計(jì)算函數(shù):int depth(bitree t)if(!t) return 0; /判斷當(dāng)前結(jié)點(diǎn)是否為葉子結(jié)點(diǎn)11int d1= depth(tlchild); /求當(dāng)前結(jié)點(diǎn)的左孩子樹的深度int d2= depth(trchild); /求當(dāng)前結(jié)點(diǎn)的右孩子樹的深度return (d1d2?d1:d2)+1;注意:根據(jù)二叉樹的結(jié)構(gòu)特點(diǎn),很多算法都可以用遞歸算法來實(shí)現(xiàn)。 面試題 24: 編碼實(shí)現(xiàn)直接插入排序直接插入排序編程實(shí)現(xiàn)如下:#includevoi

19、d main( void )int array10 = 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 ;int i,j;for( i = 0; i 10; i+)coutarrayi ”;coutendl;for( i = 2; i = 10; i+ ) /將 array2,arrayn依次按序插入if(arrayi arrayi1) /如果 arrayi大于一切有序的數(shù)值,/arrayi將保持原位不動(dòng)array0 = arrayi; /將 array0看做是哨兵,是 arrayi的副本j = i 1;do /從右向左在有序區(qū) array1 i1中/查找 arrayi的插入位置ar

20、rayj+1 = arrayj; /將數(shù)值大于 arrayi記錄后移j ;while( array0 arrayj );arrayj+1=array0; /arrayi插入到正確的位置上for( i = 0; i 10; i+)coutarrayi” ”;coutendl;12注意: 所有為簡化邊界條件而引入的附加結(jié)點(diǎn)( 元素) 均可稱為哨兵。引入哨兵后使得查找循環(huán)條件的時(shí)間大約減少了一半, 對于記錄數(shù)較大的文件節(jié)約的時(shí)間就相當(dāng)可觀。類似于排序這樣使用頻率非常高的算法,要盡可能地減少其運(yùn)行時(shí)間.所以不能把上述算法中的哨兵視為雕蟲小技. 面試題 25: 編碼實(shí)現(xiàn)冒泡排序冒泡排序編程實(shí)現(xiàn)如下:in

21、clude define len 10 /數(shù)組長度void main( void )int array10 = 0, 6, 3, 2, 7, 5, 4, 9, 1, 8 ; /待排序數(shù)組printf( ”n” );for( int a = 0; a = i; j- ) /對當(dāng)前無序區(qū) arrayi.。len自下向上掃描if( arrayj+1 arrayj ) /交換記錄array0 = arrayj+1; /array0不是哨兵,僅做暫存單元arrayj+1 = arrayj;arrayj = array0;ischange = 1; /發(fā)生了交換,故將交換標(biāo)志置為真printf( n );

22、for( a = 0; a len; a+) /打印本次排序后數(shù)組內(nèi)容printf( %d , arraya );if( !ischange ) /本趟排序未發(fā)生交換,提前終止算法break;printf( ”n” );return;13 面試題 26: 編碼實(shí)現(xiàn)直接選擇排序#include”stdio.h#define len 9void main( void )int arraylen= 5, 6, 8, 2, 4, 1, 9, 3, 7 ; /待序數(shù)組printf(before sorted:n);for( int m = 0; m len; m+ ) /打印排序前數(shù)組printf( ”

23、d , arraym );for (int i = 1; i = len 1; i+) /選擇排序int t = i - 1;int temp = 0;for (int j = i; j len; j+)if (arrayj arrayt)t = j;if (t != (i 1)temp = arrayi - 1;arrayi 1 = arrayt;arrayt = temp;printf( n );printf(”after sorted:n”);for( i = 0; i len; i+ ) /打印排序后數(shù)組printf( ”d ”, arrayi );printf( n );注意:在直接

24、選擇排序中,具有相同關(guān)鍵碼的對象可能會(huì)顛倒次序,因而直接選擇排序算法是一種不穩(wěn)定的排序方法。在本例中只是例舉了簡單的整形數(shù)組排序,肯定不會(huì)有什么問題.但是在復(fù)雜的數(shù)據(jù)元素序列組合中,只是根據(jù)單一的某一個(gè)關(guān)鍵值排序,直接選擇排序則不保證其穩(wěn)定性,這是直接選擇排序的一個(gè)弱點(diǎn)。 面試題 27: 編程實(shí)現(xiàn)堆排序堆排序編程實(shí)現(xiàn):#include stdio。h14void createheep(int array,int spoint, int len) /生成大根堆while( ( 2 * spoint + 1 ) len )int mpoint = 2 spoint + 1 ;if( ( 2 * s

25、point + 2 ) len )if(array 2 * spoint + 1 array 2 spoint + 2 )mpoint = 2spoint+2;if(array spoint = 0; i- ) /將 hr0, lenght1建成大根堆createheep(array, i, len);for ( i = len 1; i 0; i- )int tmpdata = array0; /與最后一個(gè)記錄交換array0 = arrayi;arrayi = tmpdata;createheep( array, 0, i ); /將 h。r0。i重新調(diào)整為大根堆return;int ma

26、in( void )15int array = 5, 4, 7, 3, 9, 1, 6, 8, 2;printf(before sorted:n); /打印排序前數(shù)組內(nèi)容for ( int i = 0; i 9; i+ )printf(”d , arrayi);printf(”n);heepsort( array, 9 ); /堆排序printf(after sorted:n); /打印排序后數(shù)組內(nèi)容for( i = 0; i 9; i+ )printf( ”%d ”, arrayi );printf( n” );return 0;說明:堆排序,雖然實(shí)現(xiàn)復(fù)雜,但是非常的實(shí)用。另外讀者可是自己設(shè)

27、計(jì)實(shí)現(xiàn)小堆排序的算法。雖然和大堆排序的實(shí)現(xiàn)過程相似,但是卻可以加深對堆排序的記憶和理解。 面試題 28: 編程實(shí)現(xiàn)基數(shù)排序#include front = ( queuenode )malloc( sizeof( node ) );qrear = ( queuenode )malloc( sizeof( node ) );if( null = q-front | null = q-rear )printf(fail to malloc a new queues fornt or rear!n);return null; qrear = null;qfrontnext= q-rear;retur

28、n q;int lendata( node data, int len) /計(jì)算隊(duì)列中各結(jié)點(diǎn)的數(shù)據(jù)的最大位數(shù)int m = 0;int temp = 0;int d;for( int i = 0; i len; i+)d = datai.data;while( d 0)d /= 10;temp +;if( temp m )m = temp;temp = 0;return m;queuelink push( queuelink q , node node ) /將數(shù)據(jù)壓入隊(duì)列queuenode p1,p;p =( queuenode )malloc( sizeof( node ) );if( n

29、ull = p )printf(fail to malloc a new node!n”);return null;p1 = q-front;while(p1next != null)p1 = p1next; p-data = node。data;p1next = p;pnext = q-rear;17return null;node pop( queuelink q) /數(shù)據(jù)出隊(duì)列node temp;temp。data = 0;temp。next = null;queuenode p;p = qfront-next;if( p != q-rear )temp = *p;q-front-nex

30、t = p-next;free( p );p = null;return temp;int isempty( queuelink q)if( q-frontnext = q-rear )return 0;return 1;int main( void )int i = 0;int max = 0; /記錄結(jié)點(diǎn)中數(shù)據(jù)的最大位數(shù)int d = 10;int power = 1;int k = 0;node arraylen =450, null, 32,null, 781,null, 57 ,null,組 145,null, 613,null, 401,null, 594,null;/隊(duì)列結(jié)點(diǎn)數(shù)q

31、ueuelink queue10;for( i = 0; i 10; i+)createnullqueue( queuei); /初始化隊(duì)列數(shù)組for( i = 0; i len; i+)printf(”d ,arrayi.data);printf(”n”);max = lendata( array, len ); /計(jì)算數(shù)組中關(guān)鍵字的最大位數(shù)printf(%dn,max);18for(int j = 0; j max; j+) /按位排序if(j = 0) power = 1;else power = power d;for(i = 0; i next;ppath q = h;while(

32、null != p )20q = p;p = p-next;p = ( ppath )malloc( sizeof( path ) ); /申請新結(jié)點(diǎn)p-next = null; /初始化新結(jié)點(diǎn)p-tree = t;q-next = p; /新結(jié)點(diǎn)入棧樹結(jié)點(diǎn)打印函數(shù):void print_path( ppath l )ppath p = lnext;while( null != p ) /打印當(dāng)前棧中所有數(shù)據(jù)printf(d, ”, p-treedata);p = p-next;樹結(jié)點(diǎn)出棧函數(shù):void pop_path( ppath h )ppath p = h-next;ppath q =

33、 h;if( null = p ) /檢驗(yàn)當(dāng)前棧是否為空printf(stack is null!n”);return;p = pnext;while( null != p ) /出棧q = qnext;p = pnext;free( qnext ); /釋放出棧結(jié)點(diǎn)空間q-next = null;判斷結(jié)點(diǎn)是否為葉子結(jié)點(diǎn):int isleaf(pbtree t)return ( t-lchild = null )&( t-rchild=null );查找符合條件的路徑:int find_path(pbtree t, int sum, ppath l)21push_path( l, t);rec

34、ord += tdata;if( ( record = sum ) & ( isleaf( t ) ) ) /打印符合條件的當(dāng)前路徑print_path( l );printf( ”n );if( t-lchild != null ) /遞歸查找當(dāng)前節(jié)點(diǎn)的左孩子find_path( t-lchild, sum, l);if( t-rchild != null ) /遞歸查找當(dāng)前節(jié)點(diǎn)的右孩子find_path( t-rchild, sum, l);record -= tdata;pop_path(l);return 0;注意:數(shù)據(jù)結(jié)構(gòu)一定要活學(xué)活用,例如本題,把所有的結(jié)點(diǎn)都?jí)喝霔#环蠗l件的結(jié)點(diǎn)彈出棧,很容易實(shí)現(xiàn)了有效路徑的查找.雖然用鏈表也可以實(shí)現(xiàn),但是用棧更利于理解這個(gè)問題,即適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)為更好的算法設(shè)計(jì)提供了有利的條件。 面試題 34: 寫一個(gè)“標(biāo)準(zhǔn)” 宏 min寫一個(gè)“標(biāo)準(zhǔn)宏 min,這個(gè)宏輸入兩個(gè)參數(shù)并且返回較小的一個(gè).【 答案】#define min(a,b)((a)=(b)?(a):(b))注意:在調(diào)用時(shí)一定要注

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論