1. 程式人生 > 其它 >PHP資料結構(二)——鏈式結構線性表

PHP資料結構(二)——鏈式結構線性表

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

相關閱讀:

PHP資料結構(一)——順序結構線性表