某知名自營(yíng)電子商務(wù)公司PHP工程師面試筆試真題及答案_第1頁(yè)
某知名自營(yíng)電子商務(wù)公司PHP工程師面試筆試真題及答案_第2頁(yè)
某知名自營(yíng)電子商務(wù)公司PHP工程師面試筆試真題及答案_第3頁(yè)
某知名自營(yíng)電子商務(wù)公司PHP工程師面試筆試真題及答案_第4頁(yè)
某知名自營(yíng)電子商務(wù)公司PHP工程師面試筆試真題及答案_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

某知名自營(yíng)電子商務(wù)公司PHP工程師面試筆試真題及答案一、選擇題1、PHP可以與HTML混編,當(dāng)get請(qǐng)求傳遞一個(gè)rgb顏色,命名為bgcolor時(shí),自動(dòng)改變背景顏色的PHP代碼為______

A.<?php<bodybgcolor="$_GET['bgcolor']"></body>?>

B.<html><bodybgcolor="<?php$_GET['bgcolor'];?>"></body></html>

C.<bodybgcolor="<?phpecho$_GET['bgcolor'];?>"></body>

D.<?phpecho'<bodybgcolor='.$_GET['rgbcolor'].'></body>'?>

2、解釋性語言的特性包括______

A.非獨(dú)立

B.效率低

C.獨(dú)立

D.效率高

3、1,4,5,6,7,9,11,______

A.8

B.12

C.15

D.100

4、取得搜索語句的結(jié)果集中的記錄總數(shù)的函數(shù)是______

A.mysql_fetch_row

B.mysql_rowid

C.mysql_num_rowsD.mysql_fetch_array

5、當(dāng)聲明函數(shù)時(shí),不能給參數(shù)賦默認(rèn)值的是______

A.當(dāng)參數(shù)是布爾值時(shí)

B.當(dāng)函數(shù)是類中的成員時(shí)

C.當(dāng)參數(shù)是通過引用傳遞時(shí)

D.當(dāng)函數(shù)只有一個(gè)參數(shù)時(shí)

E.永遠(yuǎn)不會(huì)

6、下面PHP代碼的輸出結(jié)果是______

<?php

classA{

public$num=100;

}

$a=newA();

$b=clone$a;

$a->num=200;

echo$b->num;

?>

A.100

B.200

C.沒有輸出

D.程序報(bào)錯(cuò)!

7、在向某臺(tái)特定的計(jì)算機(jī)中寫入帶有效期的Cookie時(shí)總是會(huì)失敗,而這在其他計(jì)算機(jī)上都正常。在檢查了客戶端操作系統(tǒng)傳回的時(shí)間后,發(fā)現(xiàn)這臺(tái)計(jì)算機(jī)上的時(shí)間和Web服務(wù)器上的時(shí)間基本相同,而且這臺(tái)計(jì)算機(jī)在訪問大部分其他網(wǎng)站時(shí)都沒有問題。原因是______(雙選)

A.瀏覽器的程序出了問題

B.客戶端的時(shí)區(qū)設(shè)置不正確

C.用戶的殺毒軟件阻止了所有安全的Cookie

D.瀏覽器被設(shè)置為阻止任何Cookie

E.Cookie里使用了非法的字符

8、如果想要自動(dòng)加載類,那么下面函數(shù)聲明中,正確的是______

A.functionautoload($class_name)

B.function__autoload($class_name,$file)

C.function__autoload($class_name)

D.functionautoload($class_name,$file)

9、以下關(guān)于PHP命名空間的說法中,不正確的是______

A.訪問任意全局類、函數(shù)或常量,都可以使用完全限定名稱,例如,\strlen()或\Exception或INT_ALL

B.關(guān)鍵字namespace可用來顯式訪問當(dāng)前命名空間或子命名空間中的元素,它等價(jià)于類中的this操作符

C.任意合法的PHP代碼都可以包含在命名空間中,但只有三種類型的代碼受命名空間的影響,它們是類、函數(shù)和常量

D.常量__NAMESPACE__的值是當(dāng)前命名空間名稱的字符串。如果是在全局中,那么它不包括任何命名空間中的代碼,本身是一個(gè)空字符串

10、創(chuàng)建一個(gè)自定義的流處理器的方法是______

A.調(diào)用stream_wrapper_register()函數(shù),并定義一個(gè)進(jìn)行流操作的類

B.用stream_wrapper_register()注冊(cè)一個(gè)處理函數(shù)

C.創(chuàng)建一個(gè)和要處理的流封裝器同名的類,并用fopen()打開

D.用stream_load()加載流封裝器

二、填空題11、MySQL中count函數(shù)的作用是______。

12、final關(guān)鍵字的用法可以用于______。

13、借助繼承,可以創(chuàng)建其他類的派生類。那么在PHP中,子類最多可以繼承的父類個(gè)數(shù)為______。

14、版本控制工具市場(chǎng)占有率比較高的是______和______。

15、可以獲得對(duì)象的類名的函數(shù)是______。

三、簡(jiǎn)答題16、如果某段與數(shù)據(jù)庫(kù)交互的程序運(yùn)行較慢,那么你將如何處理?

17、簡(jiǎn)述怎么合理地使用Memcache緩存?如果緩存數(shù)據(jù)量過大,那么怎么部署?(分布式,緩存時(shí)間,優(yōu)化緩存數(shù)據(jù))

18、請(qǐng)談?wù)剶?shù)據(jù)庫(kù)中的事務(wù)。

19、請(qǐng)寫出內(nèi)核線程和用戶線程的區(qū)別。

20、什么是MAC地址?

四、編程題21、公雞5文錢1只,母雞3文錢1只,小雞1文錢買3只,現(xiàn)在用100文錢共買了100只雞,問:在這100只雞中,公雞、母雞和小雞各是多少只?(設(shè)每種至少一只)

22、請(qǐng)用快速排序算法,對(duì)數(shù)組array(49,38,65,97,76,13,27,49)從小到大排序。

23、給定兩個(gè)單鏈表,鏈表的每個(gè)結(jié)點(diǎn)代表一位數(shù),計(jì)算兩個(gè)數(shù)的和。例如,輸入鏈表(3->1->5)和鏈表(5->9->2),輸出8->0->8,即513+295=808,注意個(gè)位數(shù)在鏈表頭。

24、給定以非遞減順序排序的三個(gè)數(shù)組,找出這三個(gè)數(shù)組中的所有公共元素。例如,給出下面三個(gè)數(shù)組:ar1=[2,5,12,20,45,85],ar2=[16,19,20,85,200],ar3=[3,4,15,20,39,72,85,190]。那么這三個(gè)數(shù)組的公共元素為[20,85]。

答案:

一、選擇題

1、C[解析]

在HTML中嵌入PHP需要使用<?php?>tags標(biāo)簽,在標(biāo)簽內(nèi)可以正常使用PHP代碼,選項(xiàng)B雖然獲取到了bgcolor的值,但是沒有輸出導(dǎo)致bgcolor的值為空,選項(xiàng)C把獲取到的顏色值輸出,則bgcolor可以獲取到值。選項(xiàng)B錯(cuò)誤,選項(xiàng)C正確。

所以,本題的答案為C。2、AB[解析]

解釋性語言的程序不需要預(yù)先編譯,在運(yùn)行程序時(shí)才翻譯成機(jī)器語言,每種解釋性語言都是執(zhí)行時(shí)才翻譯,所以每執(zhí)行一次就翻譯一次效率非常低,并且依靠編譯器才能將解釋性語言翻譯成機(jī)器語言,所以是非獨(dú)立的。

所以,本題的答案為AB。3、C[解析]

本題中,最重要的解題方法就是找出數(shù)列的規(guī)律,從而推導(dǎo)出最后一個(gè)數(shù)是多少。通過研究已有的7個(gè)數(shù),不難發(fā)現(xiàn):第二項(xiàng)+第七項(xiàng)=4+11=15,第三項(xiàng)+第六項(xiàng)=5+9=14,第四項(xiàng)+第五項(xiàng)=6+7=13,兩個(gè)數(shù)的和依次遞減??梢酝瞥鲞@樣一個(gè)結(jié)論:第一項(xiàng)+第八項(xiàng)=16,因?yàn)榈谝豁?xiàng)的值為1,所以,第八項(xiàng)=16-1=15。

所以,本題的答案為C。4、C[解析]

對(duì)于選項(xiàng)A,mysql_fetch_row()函數(shù)的作用是從結(jié)果集中取得一行作為數(shù)字?jǐn)?shù)組。選項(xiàng)A錯(cuò)誤。

對(duì)于選項(xiàng)B,不存在mysql_rowid()函數(shù)。選項(xiàng)B錯(cuò)誤。

對(duì)于選項(xiàng)C,mysql_num_rows()可以返回結(jié)果集中行的數(shù)目。選項(xiàng)C正確。

對(duì)于選項(xiàng)D,mysql_fetch_array()函數(shù)從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組或數(shù)字?jǐn)?shù)組,或二者兼有。選項(xiàng)D錯(cuò)誤。

所以,本題的答案為C。5、C[解析]

當(dāng)參數(shù)被聲明為通過引用傳遞時(shí),不能給它賦默認(rèn)值,此時(shí)解釋器期望獲得一個(gè)能在函數(shù)內(nèi)部進(jìn)行修改的變量。選項(xiàng)C正確。

所以,本題的答案為C。6、A[解析]

在用clone時(shí),復(fù)制出來的對(duì)象與原對(duì)象沒有任何關(guān)系,它是把原來的對(duì)象從當(dāng)前的位置重新復(fù)制了一份,而此過程相當(dāng)于在內(nèi)存中新開辟一塊空間。選項(xiàng)A正確。

所以,本題的答案為A。7、BD[解析]

由于瀏覽器訪問其他網(wǎng)站都正常,所以,不可能是瀏覽器程序出了問題。殺毒軟件通常不會(huì)選擇性地只阻止安全的Cookie(不過有可能會(huì)阻止所有的Cookie)。首先應(yīng)當(dāng)檢查瀏覽器是否被設(shè)置為阻止所有Cookie,這是最有可能導(dǎo)致該問題的原因。同時(shí),錯(cuò)誤的時(shí)區(qū)設(shè)置也可能是根源,給Cookie設(shè)置有效期時(shí)用的是GMT時(shí)間,可能會(huì)出現(xiàn)Cookie在寫入時(shí)就立刻過期,從而無法被腳本接收的情況。

所以,本題的答案為BD。8、C[解析]

自動(dòng)加載類的函數(shù)的語法格式為__autoload($class),$class指的是待加載的類名。選項(xiàng)C正確。

所以,本題的答案為C。9、B[解析]namespace關(guān)鍵字是用來聲明命名空間用的,它并不能等價(jià)于this操作符的功能。所以,選項(xiàng)B說法不對(duì)。

所以,本題的答案為B。10、A[解析]stream_wrapper_register()函數(shù)能注冊(cè)一個(gè)新的流封裝器,它需要接收操作流的類名稱。

所以,本題的答案為A。二、填空題11、返回匹配指定條件的行數(shù)。

12、聲明方法和類,分別表示方法不可被覆蓋、類不可被繼承(不能再派生出新的子類)。13、一個(gè)。[解析]

盡管其他編程語言允許多重繼承,但PHP類只能繼承一個(gè)父類,并且用關(guān)鍵字“extends”來實(shí)現(xiàn)繼承。14、Git和SVN。[解析]

目前市面上存在比較的版本控制器有SVN(Subversion)、CVS(ConcurrentVersionsSystem)、Git、VSS(VisualSourceSafe)等,而被人們常用和市場(chǎng)占有率最高的是SVN和Git。15、get_class()。三、簡(jiǎn)答題16、1)首先提高數(shù)據(jù)庫(kù)的查詢速度,比如增加索引、優(yōu)化表的結(jié)構(gòu)。

2)優(yōu)化程序代碼,如果查詢比較多,那么可以盡量用條件查詢,減少查詢語句,比如能用一條查詢語句就不用兩條。

3)提高服務(wù)器的配置,優(yōu)化服務(wù)器,把不必要的進(jìn)程關(guān)掉。

17、要合理地使用Memcache緩存,需要注意以下幾點(diǎn):

1)因?yàn)镸emcache支持的最大存儲(chǔ)對(duì)象大小為1MB,所以不能往Memcache存儲(chǔ)一個(gè)大于1MB的數(shù)據(jù)。

2)往Memcache存儲(chǔ)的所有數(shù)據(jù),如果數(shù)據(jù)大小分布于各種chunk大小區(qū)間,從64B到1MB都有,那么會(huì)造成內(nèi)存的極大浪費(fèi)和Memcache的異常。所以需要注意數(shù)據(jù)大小的分布區(qū)間。

3)key的長(zhǎng)度不能大于250個(gè)字符。

4)虛擬主機(jī)不允許運(yùn)行Memcache服務(wù),所以不能把Memcache部署到虛擬主機(jī)中。

5)因?yàn)镸emcache可以輕松訪問到,所以可以運(yùn)行在不安全的環(huán)境中,如果對(duì)數(shù)據(jù)安全要求高,那么需要著重考慮運(yùn)行環(huán)境的安全問題。

6)因?yàn)镸emcache存儲(chǔ)的數(shù)據(jù)都在內(nèi)存中,如果服務(wù)器中掛掉,那么就會(huì)被清空,所以緩存的數(shù)據(jù)盡量是丟失了也不會(huì)有太大影響的數(shù)據(jù)。

如果緩存的數(shù)據(jù)量過大,那么可以采取以下的辦法:

1)使用Memcache服務(wù)器集群的方法。首先是將數(shù)據(jù)安排放在不同的Memcache服務(wù)器上,可以將不同硬件服務(wù)器上的Memcache服務(wù)器再做成一個(gè)數(shù)據(jù)互相備份的組,避免數(shù)據(jù)的單點(diǎn)丟失問題。

2)緩存數(shù)據(jù)到數(shù)據(jù)庫(kù)中。在數(shù)據(jù)庫(kù)中先建一張表來說明Memcache服務(wù)器集群中緩存數(shù)據(jù)的存放邏輯,然后把緩存數(shù)據(jù)存到數(shù)據(jù)庫(kù)中,可以保證數(shù)據(jù)庫(kù)和緩存的數(shù)據(jù)雙向存取。

18、事務(wù)是作為一個(gè)單元的一組有序的數(shù)據(jù)庫(kù)操作。如果組中的所有操作都成功,則認(rèn)為事務(wù)成功,即使只有一個(gè)操作失敗,事務(wù)也不成功。如果所有操作完成,事務(wù)則提交,那么其修改將作用于所有其他數(shù)據(jù)庫(kù)進(jìn)程。如果一個(gè)操作失敗,則事務(wù)將回滾,該事務(wù)所有操作的影響都將取消。

19、根據(jù)操作系統(tǒng)內(nèi)核是否對(duì)線程可感知,可以把線程分為內(nèi)核線程和用戶線程。

內(nèi)核線程的建立和銷毀都是由操作系統(tǒng)負(fù)責(zé)、通過系統(tǒng)調(diào)用完成的,操作系統(tǒng)在調(diào)度時(shí),參考各進(jìn)程內(nèi)的線程運(yùn)行情況做出調(diào)度決定。如果一個(gè)進(jìn)程中沒有就緒態(tài)的線程,那么這個(gè)進(jìn)程也不會(huì)被調(diào)度占用CPU。和內(nèi)核線程相對(duì)應(yīng)的是用戶線程,用戶線程指不需要內(nèi)核支持而在用戶程序中實(shí)現(xiàn)的線程,其不依賴于操作系統(tǒng)核心,用戶進(jìn)程利用線程庫(kù)提供創(chuàng)建、同步、調(diào)度和管理線程的函數(shù)來控制用戶線程。用戶線程多見于一些歷史悠久的操作系統(tǒng),如UNIX操作系統(tǒng),不需要用戶態(tài)/核心態(tài)切換,速度快,操作系統(tǒng)內(nèi)核不知道多線程的存在,因此一個(gè)線程阻塞將使得整個(gè)進(jìn)程(包括它的所有線程)阻塞。由于這里的處理器時(shí)間片分配是以進(jìn)程為基本單位的,所以每個(gè)線程執(zhí)行的時(shí)間相對(duì)減少。為了在操作系統(tǒng)中加入線程支持,采用了在用戶空間增加運(yùn)行庫(kù)來實(shí)現(xiàn)線程,這些運(yùn)行庫(kù)被稱為“線程包”,用戶線程是不能被操作系統(tǒng)所感知的。

引入用戶線程有以下4個(gè)方面的優(yōu)勢(shì):

1)可以在不支持線程的操作系統(tǒng)中實(shí)現(xiàn)。

2)創(chuàng)建和銷毀線程、線程切換等線程管理的代價(jià)比內(nèi)核線程少得多。

3)允許每個(gè)進(jìn)程定制自己的調(diào)度算法,線程管理比較靈活。

4)線程能夠利用的表空間和堆??臻g比內(nèi)核級(jí)線程多。

用戶線程的缺點(diǎn)主要有以下兩點(diǎn):

1)同一進(jìn)程中只能同時(shí)有一個(gè)線程在運(yùn)行,如果有一個(gè)線程使用了系統(tǒng)調(diào)用而阻塞,那么整個(gè)進(jìn)程都會(huì)被掛起。

2)頁(yè)面失效也會(huì)導(dǎo)致整個(gè)進(jìn)程都會(huì)被掛起。

內(nèi)核線程的優(yōu)缺點(diǎn)剛好與用戶線程相反。實(shí)際上,操作系統(tǒng)可以使用混合的方式來實(shí)現(xiàn)線程。

20、MAC地址,也稱為物理地址,用來定義網(wǎng)絡(luò)設(shè)備的位置,它總共有48位,以十六進(jìn)制表示,由兩大塊組成:IEEE(電氣和電子工程師學(xué)會(huì))分配給廠商的識(shí)別碼和廠商內(nèi)部定義的唯一識(shí)別碼(如00-36-76-47-D6-7A)。

MAC地址會(huì)被燒入進(jìn)網(wǎng)卡中,每塊網(wǎng)卡的MAC地址在全世界都是唯一的。MAC地址應(yīng)用在OSI參考模型中的數(shù)據(jù)鏈路層,通過MAC地址能夠轉(zhuǎn)發(fā)數(shù)據(jù)幀。四、編程題21、根據(jù)百錢買百雞的要求,可以設(shè)有$i只公雞,$j只母雞,$k只小雞,并且$i+$j+$k的總數(shù)為100,$i*5+$j*3+$k*1總價(jià)為100。依次對(duì)公雞、母雞、小雞的總數(shù)循環(huán)求解出符合這兩個(gè)公式的最優(yōu)解。

實(shí)現(xiàn)代碼如下:

<?php

header("Content-type:text/html;charset=utf-8");

for($i=1,$i<100;$i++){

for($j=1,$j<100;$j++){

for($k=1;$k<100;$k++){

if(($i+$j+$k==100)&&($i*5+$j*3+$k/3==100)){

echo"公雞:".$i,'只,母雞:',$j,'只,小雞:',$k,'只<br>';

}

}

}

}

?>

程序的運(yùn)行結(jié)果為

公雞:4只,母雞:18只,小雞:78只

公雞:8只,母雞:11只,小雞:81只

公雞:12只,母雞:4只,小雞:84只

22、快速排序是一種非常高效的排序算法,它采用“分而治之”的思想,把大的問題拆分為小的問題,小的問題再拆分為更小的問題。其原理如下:對(duì)于一組給定的記錄,通過一趟排序后,將原序列分為兩部分,其中前一部分的所有記錄均比后一部分的所有記錄小,然后依次對(duì)前后兩部分的記錄進(jìn)行快速排序,遞歸該過程,直到序列中的所有記錄均有序?yàn)橹埂?/p>

對(duì)于給定數(shù)組A[0],…,A[N-1],首先任意選取一個(gè)數(shù)據(jù)(通常選用數(shù)組的第一個(gè)元素)作為關(guān)鍵數(shù)據(jù),然后將所有比它小的數(shù)都放到它前面,所有比它大的數(shù)都放到它后面,這個(gè)過程稱為一趟快速排序。由此可見,一趟快速排序的算法如下:

1)設(shè)置兩個(gè)變量i、j,并初始化為i=0,j=N-1。

2)以第一個(gè)數(shù)組元素作為關(guān)鍵數(shù)據(jù)(假設(shè)這個(gè)關(guān)鍵數(shù)據(jù)為key)。

3)從i開始向前搜索,即由后開始向前搜索(j--),找到第一個(gè)小于key的值A(chǔ)[j],將A[j]和A[i]互換。

4)從i開始向后搜索,即由前開始向后搜索(i++),找到第一個(gè)大于key的A[i],將A[i]和A[j]互換。

5)重復(fù)第3)、4)步,直到i=j(3)、(4)步中,沒找到符合條件的值,即3中A[j]不小于key,4中A[i]不大于key的時(shí)候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進(jìn)行交換的時(shí)候i、j指針位置不變。另外,i==j這一過程一定正好是i+或j-完成的時(shí)候,此時(shí)令循環(huán)結(jié)束)。

以數(shù)組array(49,38,65,97,76,13,27,49)為例。

第一趟排序過程如下:

初始狀態(tài):[4938659776132749]

j向左掃描,第一次交換后:[2738659776134949]

i向右掃描,第二次交換后:[2738499776136549]

j向左掃描,位置不變,第三次交換后:[2738139776496549]

i向右掃描,位置不變,第四次交換后:[2738134976976549]

j向左掃描[2738134976976549]

整個(gè)排序過程如下:

初始狀態(tài):[4938659776132749]

一趟排序之后:[273813]49[76976549]

二趟排序之后:[13]27[38]49[4965]76[97]

三趟排序之后:1327384949[65]7697

最后的排序結(jié)果:1327384949657697

根據(jù)以上的實(shí)現(xiàn)原理,具體的實(shí)現(xiàn)代碼如下:

<?php

header("Content-type:text/html;charset=utf-8");

functionquickSort(&$arr,$low,$hight){

if($low>=$hight){

return;

}

$first=$low;

$last=$hight;

$key=$arr[$first];

while($first<$last){

while($first<$last&&$arr[$last]>=$key){

--$last;

}

$arr[$first]=$arr[$last];

while($first<$last&&$arr[$first]<=$key){

++$first;

}

$arr[$last]=$arr[$first];

}

$arr[$first]=$key;

quickSort($arr,$low,($first-1));

quickSort($arr,($first+1),$hight);

}

$arr=array(49,38,65,97,76,13,27,49);

echo"排序前:";

foreach($arras$k=>$val){

echo$val.'';

}

echo"<br>排序后:";

quickSort($arr,0,intval(count($arr)-1));

foreach($arras$k=>$val){

echo$val.'';

}

?>

程序的運(yùn)行結(jié)果為

排序前:4938659776132749

排序后:1327384949657697

快速算法是通過分治遞歸來實(shí)現(xiàn)的,其效率很大程度上取決于參考元素的選擇,可以選擇數(shù)組的中間元素,也可以隨機(jī)得到三個(gè)元素,然后選擇中間的那個(gè)元素(三數(shù)中值法)。另外還有一點(diǎn),就是當(dāng)分割時(shí),如果分割出來的子序列的長(zhǎng)度很小(小于20),那么通常遞歸的排序效率就沒有諸如插入排序或希爾排序那么快了。因此可以先判斷數(shù)組的長(zhǎng)度,如果小于10,那么直接用插入排序,而不是遞歸調(diào)用快速排序。

23、主要思路:對(duì)鏈表中的結(jié)點(diǎn)直接進(jìn)行相加操作,把相加的和存儲(chǔ)到新的鏈表對(duì)應(yīng)的結(jié)點(diǎn)中,同時(shí)還要記錄結(jié)點(diǎn)相加后的進(jìn)位。如下圖所示。

使用這個(gè)方法需要注意如下幾個(gè)問題:①每組結(jié)點(diǎn)進(jìn)行相加后需要記錄其是否有進(jìn)位;②如果兩個(gè)鏈表h1與h2的長(zhǎng)度不同(長(zhǎng)度分別為L(zhǎng)1和L2,且L1<L2),當(dāng)對(duì)鏈表的第L1位計(jì)算完成后,接下來只需要考慮鏈表h2剩余結(jié)點(diǎn)的值(需要考慮進(jìn)位);③對(duì)鏈表所有結(jié)點(diǎn)都完成計(jì)算后,還需要考慮此時(shí)是否還有進(jìn)位,如果有進(jìn)位,則需要增加新的結(jié)點(diǎn),此結(jié)點(diǎn)的數(shù)據(jù)域?yàn)?。實(shí)現(xiàn)代碼如下:

<?php

header("content-type:text/html;charset=utf-8");

//鏈表結(jié)點(diǎn)

classnode{

public$data;

//存儲(chǔ)元素

public$next;

//下一結(jié)點(diǎn)

publicfunction__construct($data){

$this->data=$data;

$this->next=NULL;

}

}

//單鏈表

classlinkList{

public$header;

//鏈表頭結(jié)點(diǎn)

//構(gòu)造方法

publicfunction__construct($data=NULL){

$this->header=newnode($data);

}

//獲取鏈表長(zhǎng)度

publicfunctiongetLinkLength(){

$i=0;

$current=$this->header;

while($current->next!=NULL){

$i++;

$current=$current->next;

}

return$i;

}

//添加結(jié)點(diǎn)數(shù)據(jù)

publicfunctionaddLink($node){

$current=$this->header;

while($current->next!=NULL){

$current=$current->next;

}

$node->next=$current->next;

$current->next=$node;

}

//清空鏈表

publicfunctionclear(){

$this->header=NULL;

}

//獲取鏈表

publicfunctiongetLinkList(){

$current=$this->header;

if($current->next==NULL){

echo("鏈表為空!");

return;

}

while($current->next!=NULL){

echo$current->next->data."";

if($current->next->next==NULL){

break;

}

$current=$current->next;

}

}

}

/*

**函數(shù)功能:對(duì)兩個(gè)帶頭結(jié)點(diǎn)的單鏈表所代表的數(shù)相加

**輸入?yún)?shù):h1:第一個(gè)鏈表頭結(jié)點(diǎn);h2:第二個(gè)鏈表頭結(jié)點(diǎn)

**返回值:相加后鏈表的頭結(jié)點(diǎn)

*/

functionadd($h1,$h2){

$h1=$h1->header;

$h2=$h2->header;

if($h1==NULL||$h1->next==NULL)

return$h2;

if($h2==NULL||$h2->next==NULL)

return$h1;

$c=0;

//用來記錄進(jìn)位

$sum=0;

//用來記錄兩個(gè)結(jié)點(diǎn)相加的值

$p1=$h1->next;

//用來遍歷h1

$p2=$h2->next;

//用來遍歷h2

$tmp=NULL;

//用來指向新創(chuàng)建的存儲(chǔ)相加和的結(jié)點(diǎn)

$resultHead=newlinkList();

//相加后鏈表頭結(jié)點(diǎn)

$p=$resultHead;

//用來指向鏈表resultHead最后一個(gè)結(jié)點(diǎn)

while($p1&&$p2){

$tmp=newlinkList();

$sum=$p1->data+$p2->data+$c;

$tmp->header->data=$sum%10;

//兩結(jié)點(diǎn)相加和

$c=$sum/10;

//進(jìn)位

$p->header->next=$tmp;

$p=$tmp;

$p1=$p1->next;

$p2=$p2->next;

}

//鏈表h2比h1長(zhǎng),接下來只需要考慮h2剩余結(jié)點(diǎn)的值

if($p1=NULL){

while($p2){

$tmp=newlinkList();

$sum=$p2->header->data+$c;

$tmp->header->data=$sum%10;

$c=$sum/10;

$p->header->next=$tmp;

$p=$tmp;

$p2=$p2->next;

}

}

//鏈表h1比h2長(zhǎng),接下來只需要考慮h1剩余結(jié)點(diǎn)的值

if($p2==NULL){

while($p1){

$tmp=newlinkList();

$sum=$p1->data+$c;

$tmp->header->data=$sum%10;

$c=$sum/10;

$p->header->next=$tmp;

$p=$tmp;

$p1=$p1->next;

}

}

//如果計(jì)算完成后還有進(jìn)位,那么增加新的結(jié)點(diǎn)

if($c==1){

$tmp=newlinkList();

$tmp->header->data=1;

$p->header->next=$tmp;

}

return$resultHead;

}

$head1=newlinkList();

$head2=newlinkList();

for($i=1;$i<7;$i++){

$head1->addLink(newnode($i+2));

}

$num=0;

for($i=9;$i>4;$i--){

$head2->addLink(newnode($i));

$num++;

}

printf("Head1:

");

print_r($head1->getLinkList());

printf("<br>Head2:

");

print_r($head2->getLinkList());

printf("<br>相加后:");

$addResult=add($head1,$head2);

while($addResult->header->next!=NULL){

echo$addResult->header->data."";

if($addResult->header->next==NULL){

break;

}

$addResult=$addResult->header->next;

}

echo$addResult->header->data;

//釋放鏈表所占的空間

$head1->clear();

$head2->clear();

?>

程序的運(yùn)行結(jié)果為

Head1:

345678

Head2:

98765

相加后:233339

前五位可以按照整數(shù)相加的方法依次從左到右進(jìn)行計(jì)算,第五位7+5+1(進(jìn)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論