PHP資料結構(二)——鏈式結構線性表
阿新 • • 發佈:2022-05-03
PHP資料結構(二)——鏈式結構線性表
(原創內容,轉載請註明來源,謝謝)
線性表分為順序結構和鏈式結構,鏈式結構裡每一個數據單元除了有資料之外,還有一個空間指向下一個資料的位置(雙向連結串列裡面還有一個指向前一個單元的位置)。
鏈式結構根據其方向性分為單向連結串列和雙向連結串列,根據其迴圈性分為普通連結串列和迴圈連結串列。
單向連結串列:每個資料單元有資料和指向後繼資料單元的位置。
雙向連結串列:每個資料單元有資料和指向前驅以及後繼單元的位置。
迴圈連結串列:連結串列的最後一個數據指向連結串列的第一個資料。
普通連結串列:連結串列的最後一個數據指向空(Null)。
另外,通常連結串列裡面還有兩個概念:
1:頭指標,表示連結串列的開始,本身沒有資料內容,指向連結串列第一個資料。
2:尾指標,表示連結串列的結束,本身沒有資料內容,指向null(迴圈連結串列中指向頭指標)。
優點:由於連結串列的每個單元之間的連線是根據指向的,因此對於連結串列的插入和刪除操作較為方便,只需要修改連結串列中的指向即可。
缺點:查詢、修改連結串列中的某個元素時,不好查詢,需要遍歷整個連結串列。對於單向連結串列,甚至連結串列前面的元素都無法快速查詢,需要從頭遍歷。
用PHP實現雙向迴圈連結串列的生成、增刪改查。
結果如下:
原始碼如下:
<?php class chain{ //數值、前驅、後繼 public $chaintable; public $prev; public $next; //構造 public function__construct($chaintable=null){ $this->chaintable =$chaintable; } //生成連結串列 public function generate($arrChain){ $tail = new chain(); $this->prev = $tail; $tail->next = $this; $cur = $this; foreach($arrChain as $item){ $tmp = newchain($item); $cur->next =$tmp; $tmp->prev =$cur; $cur = $tmp; } $cur->next = $tail; $tail->prev = $cur; } //展示連結串列 public function show(){ $tmp = $this; while($tmp->next->chaintable!=null){ echo '<br/>'.$tmp->next->chaintable; $tmp =$tmp->next; } } //獲取連結串列長度 public function length(){ $i = 0; $tmp = $this; while($tmp->next->chaintable!=null){ $i++; $tmp = $tmp->next; } return $i; } //查詢第i個元素 public function search($i){ $tmp = $this; $chain_length =$tmp->length(); if($i<=0 ||$i>$chain_length){ echo '<br />元素超出連結串列長度'; }else{ $j = 0; while($j<$i){ $j++; $tmp =$tmp->next; } echo '<br />第'.$i.'個元素是:'.$tmp->chaintable; } } //合併有序連結串列 public function merge($old_chain,$new_chain){ $old_length =$old_chain->length(); $new_length =$new_chain->length(); $old_chain =$old_chain->next;//跳過頭部 $new_chain = $new_chain->next; $i = 1; $j = 1; $k = 1;//迴圈次數 $final_chain = new chain(); $tmp = new chain(); while($i<=$old_length&& $j<=$new_length){ if($old_chain->chaintable<= $new_chain->chaintable){ $old_chain->prev= $final_chain; $final_chain->next= $old_chain; $final_chain= $old_chain;//***把final_chain的指標往後一步 $old_chain= $old_chain->next; $i++; }else{ $new_chain->prev= $final_chain; $final_chain->next= $new_chain; $final_chain= $new_chain;//***把final_chain的指標往後一步 $new_chain= $new_chain->next; $j++; } $k++; } if($i <= $old_length){ $final_chain->next= $old_chain; $old_chain->prev= $final_chain; }else{ $final_chain->next= $new_chain; $new_chain->prev= $final_chain; } echo '<br />合併成功'; return $final_chain; } //修改連結串列第i個元素 public function modify($i, $data){ $tmp = $this; $chain_length =$tmp->length(); if($i<=0 ||$i>$chain_length){ echo '<br />元素超出連結串列長度'; }else{ $j = 0; while($j<$i){ $j++; $tmp =$tmp->next; } $tmp->chaintable= $data; echo '<br />修改成功'; } } //刪除連結串列第i個元素 public function delete($i){ $tmp = $this; $chain_length =$tmp->length(); if($i<=0 ||$i>$chain_length){ echo '<br />元素超出連結串列長度'; }else{ $j = 0; while($j<$i-1){//找到第i個元素的前一個元素 $j++; $tmp =$tmp->next; } $tmp->next =$tmp->next->next; $tmp->next->next->prev= $tmp; echo '<br />刪除成功'; } } } $my_chain = newchain(); $my_chain->generate(array(1,3,7,9,12,15,16)); $my_chain->show(); $chain_length =$my_chain->length(); echo '<br/>連結串列長度:'.$chain_length; $my_chain->search(2); $new_chain = newchain(); $new_chain->generate(array(2,3,5,8,13,19,20)); $my_chain->merge($my_chain,$new_chain); $my_chain->show(); $my_chain->modify(3,6); $my_chain->show(); $my_chain->delete(5); $my_chain->show(); ?>
—— written by linhxx 2017.06.14
相關閱讀: