版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年貨運(yùn)從業(yè)資格證考幾門
- 2025年云南普通貨運(yùn)從業(yè)資格證考試
- 智能物流系統(tǒng)合作開發(fā)合同(2篇)
- 景德鎮(zhèn)市勞動(dòng)合同(2篇)
- 2025年北京經(jīng)濟(jì)管理職業(yè)學(xué)院高職單招語文2018-2024歷年參考題庫(kù)頻考點(diǎn)含答案解析
- 2025至2031年中國(guó)透光瓷造型小夜燈行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國(guó)多回路恒流柜行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年度餐飲商鋪裝修設(shè)計(jì)租賃合同
- 2025年度美容院跨區(qū)域入股合作合同協(xié)議書
- 2025年退休返聘人員解除工作合同協(xié)議
- 2024年公安機(jī)關(guān)理論考試題庫(kù)附答案【考試直接用】
- 課題申報(bào)參考:共同富裕進(jìn)程中基本生活保障的內(nèi)涵及標(biāo)準(zhǔn)研究
- 2025中國(guó)聯(lián)通北京市分公司春季校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024年度中國(guó)郵政集團(tuán)公司縣分公司工作總結(jié)
- 產(chǎn)程中的人文關(guān)懷護(hù)理
- 開工第一課安全教育記錄表
- 2024年黑龍江農(nóng)業(yè)職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫(kù)含答案解析
- 基于數(shù)據(jù)驅(qū)動(dòng)的鋰離子電池剩余使用壽命預(yù)測(cè)方法研究
- 《內(nèi)臟疾病康復(fù)》課件
- 家具廠各崗位責(zé)任制匯編
- 提高檢驗(yàn)標(biāo)本合格率品管圈PDCA成果匯報(bào)
評(píng)論
0/150
提交評(píng)論