1. 程式人生 > >大話數據結構之php實現單鏈表

大話數據結構之php實現單鏈表

線性表 單鏈表

最近想起來兩件事1.大話數據結構和大話設計模式


這兩本書很有意思,C語言有指針,所以實現起來容易理解,所以突然想到用PHP寫一下來熟悉一下數據結構的線性表,不過看的比較慢。一般兩三天才看完一部分,畢竟還要工作,老板還安裝攝像頭看著每天幹了啥。。。。。老板事業興隆,嘻嘻。


線性表的概念不贅述,直接去看大話數據結構,代碼也是在參考眾多實現方案,比較符合大話數據結構的原本思想,就是基本上還原C語言的實現過程。


直接上代碼

  1. 線性表


  2. <?php
    /*
     *文件名:linearList.php 
     * 功能:數據結構線性表的順序存儲實現
     * author:jack
     * @copyright:www.gifttodj.com
     */
    	
    	class linearList{
    		private $length;		//當前長度
    		private $arr;			//當前存儲位置
    		const MAXSIZE=100;		//最大長度
    		
    		   /*
             *構造函數,判斷空表還是非空表,並且進行實例化,定義一個數組 
             * @param array $arr 輸入的數組
             * @param int $n 輸入數組的長度
             * @ruturn void;
            */
    		
    		function __construct($arr,$n){
    			if($n>self::MAXSIZE){
    				echo "對不起,數組的長度超過了最大允許值".self::MAXSIZE;
    			}elseif($n<0){
    				echo ‘異常,數組長度不能為負數‘;
    			}elseif($n==0){
    				echo ‘<br/>... 你創建了一張空表,數組長度為0‘;
    				$this->arr=$arr;
    				$this->length=$n;
    			}else{
    				echo ‘<br/>... 你成功創建了一張表<br/>‘;
    				$this->arr=$arr;
    				$this->length=$n;
    			}
    		}
    		
    		  /*
               *按位查找,返回查找到的值
    		   [email protected]
/* */ int $n 查找的位置 * @ruturn string; */ function findValue($n){ if($n<1||$n>$this->length){ echo ‘輸入的位置有誤,請在1到‘.$this->length.‘範圍內選擇‘; } return ‘你要找的第‘.$n.‘位的值為‘.$this->arr[$n-1]; } /* *按值查找,返回查找到的位置 * @ruturn string; * @param int $n 查找的值 */ function findLocation($n){ $v=true; foreach($this->arr as $key=>$value){ if($value==$n){ $b=$key+1; return ‘你要找的‘.$n.‘的位置是‘.$b;; }else{ $v=false; } } if(!$v){ return ‘你要找的值‘.$n.‘不存在‘; } } /* *在選定的位置處插入某個值 * @param int $i 插入位置 * @param int $v 插入的值 * @ruturn array; */ function insertValue($i,$v){ if($i<1||$i>self::MAXSIZE){ echo ‘輸入的位置有誤,請在1到‘.self::MAXSIZE.‘範圍內選擇‘; return; } //現將所有i之後的值往後移動一位 for($h=$this->length;$h>=$i;$h--){ $this->arr[$h]=$this->arr[$h-1]; } if($i>$this->length){ $this->arr[$this->length]=$v; }else{ $this->arr[$i-1]=$v; } $this->length++; return $this->arr; } /* *在選定的位置刪除某個值 * @param int $i 位置 * @ruturn array; */ function deleteValue($i){ if($i<1||$i>self::MAXSIZE){ echo ‘輸入的位置有誤,請在1到‘.self::MAXSIZE.‘範圍內選擇‘; return; } //現將所有i之後的值往前移動一位 for($j=$i;$j<$this->length;$j++){ $this->arr[$j-1]=$this->arr[$j]; } unset($this->arr[$this->length-1]); $this->length--; return $this->arr; } function __destruct(){ if($this->length==0){ echo ‘<br/>...銷毀一張空表...<br/>‘; }else{ echo ‘<br/>...成功銷毀一張表..<br/>‘; } } } ?>
  • 線性表測試
    require_once(‘linearList.php‘);
    
    $arr=array(10,125,123,1,4);
    $n=5;
    $list = new linearList($arr,$n);
    echo $list->findValue(5).‘<br/>‘;
    
    echo $list->findLocation(4).‘<br/>‘;
    
    echo ‘<pre>‘;
    print_r($list->insertValue(20,300));
    echo ‘</pre>‘;
    echo ‘<pre>‘;
    print_r($list->deleteValue(1));
    echo ‘</pre>‘;
  • 單鏈表<?php
    class LNode{
    	public  $data;
    	public  $next;
    	
    	public function __construct($data=‘‘){
    		$this->data=$data;
    		$this->next=null;
    	}
    }
    class SingleLinkList{
    	public  $data;
    	public  $next;
    	//單鏈表的創建都是從空表逐漸增加上去的
    	//這相當於頭結點
    	public function __construct(){
    		$this->data=null;//公用信息
    		$this->next=null;
    	}
    	
    	//每個節點的數據這麽傳進來呢
    	//頭插法,每個新數據都是第一個位置
    	public function CreateListHead($num){
    		for($i=0;$i<$num;$i++){
    			$node = new LNode();
    			$node->data = mt_rand(100,200);
    			$node->next=$this->next;
    			var_dump($node);
    			$this->next=$node;
    		}
    	}
    	//尾插法
    	public function CreateListTail($num){
    		$tail=$this;
    		//把新節點當成當前節點的下一節點
    		for($i=0;$i<$num;$i++){
    			$node = new LNode();
    			$node->data = mt_rand(100,200);
    			$tail->next=$node;
    			$tail=$node;
    			var_dump($node);
    		}
    		$node->next=null;
    	}
    	//銷毀單鏈表
    	public function DestroyList(){
    		//
    		$that=$this;
    		while($that){
    			$temp=$that->next;
    			unset($that);
    			$that=$temp;
    		}
    	}
    	
    	//清空單鏈表
    	//只留下頭結點
    	public function ClearList(){
    		$temp=$this->next;
    		while($temp){
    			$tmp=$temp->next;
    			unset($temp);
    			$temp=$tmp;
    		}
    		$this->next=null;
    	}
    	
    	//判斷單鏈表是否為空
    	public function ListEmpty(){
    		if($this->next){
    			return false;
    		}else{
    			return true;
    		}
    	}
    	
    	//單鏈表的長度
    	public function ListLength(){
    		$temp=$this->next;
    		$count=0;
    		while($temp){
    			$count++;
    			$temp=$temp->next;
    		}
    		return $count;
    	}
    	
    	//查找特定位置的數據
    	public function FindValue($pos){
    		$count=1;
    		$temp=$this->next;
    		//也可以吧count與pos判斷放在循環裏
    		while($temp && $count<$pos){
    			$count++;
    			$temp = $temp->next;
    		}
    		if(!$temp ||$count>$pos){
    			return ‘該位置沒有數據‘;
    		}
    		//這裏可以利用該節點找出下一個值,也就能找出上一個節點
    		return $p->data;		
    	}
    	//查找數據所在的位置
    	public function LocateElem($value){
    		$count=1;
    		$temp=$this->next;
    		//也可以吧count與pos判斷放在循環裏
    		while($temp){
    			$count++;	
    			if($value == $temp->data){
    				return $count;
    			}
    		}
    		if(!$temp){
    			return ‘沒有該數據:‘.$value;
    		}
    	}
    	//特定值的前一個值
    	public function PriorElem($value){
    		$temp=$this->next;
    		if($temp&&$temp->data==$value){
    			 return $p->data.‘已經是第一個元素,已無前驅元素‘;
    		}
    		while($temp&&$temp->next){
    			$tmp=$temp->next;
    			if($tmp->data==$value){
    				return $temp->data;
    			}
    			$temp=$tmp;
    		}
    		return ‘該單鏈表沒有該數值‘.$value;
    	}
    	
    	//特定值的下一個值
    	public function NextElem($value){
    		$temp=$this->next;
    		if($temp&&$temp->next==null){
    			 return $temp->data.‘已經是尾節點數據,已無後續‘;
    		}
    		while($temp){
    			if($this->data==$value){
    				return $temp->data;
    			}
    		}
    		return ‘該單鏈表沒有該數值‘.$value;
    	}
    	
    	//在指定位置之前插入數據
    	/**
    	[email protected] class LNode $node
    	*
    	**/
    	public function ListInsert($pos,$node){
    		$count=1;
    		$temp=$this;
    		//也可以吧count與pos判斷放在循環裏
    		while($temp && $count<$pos){
    			$count++;
    			$temp = $temp->next;
    		}
    		if(!$temp ||$count>$pos){
    			return ‘該位置沒有數據‘;
    		}
    		//這裏可以利用該節點找出下一個值,也就能找出上一個節點
    		$node->next=$temp->next;
    		$temp->next=$node;
    		return ‘ok‘;
    		
    	}
    	//刪除單鏈表指定位置的數據元素
    	public function ListDelete($pos){
    		$count=0;
    		$temp=$this;
            while($temp->next){
                $count++;
                if($count==$pos){
                    $tmp=$temp->next;
                    $temp->next=$tmp->next;
                    unset($tmp);
                    return ‘OK‘;
                }
                $temp=$temp->next;
            }
            return ‘該位置沒有數據‘;
    	}
    	
    	
    	public function ListTraverse(){
    		$arr=array();
    		$temp=$this;
    		
    		while($temp->next){
    			$arr[]=$temp->data;
    			$temp=$temp->next;
    		}
    		return $arr;
    	}
    	
    }
    ?>
  • 單鏈表測試require_once(‘LinkList.php‘);
    
    $list = new SingleLinkList();
    $listt = $list->CreateListHead(5);
    $list = $list->ListTraverse();
    var_dump($listt);
  • 註意:應該沒有註意的了,這個還是很有用武之地,只不過理論偏多,不喜歡的就跳過吧。本來也沒有多大問題
  • 本文出自 “一站式解決方案” 博客,請務必保留此出處http://10725691.blog.51cto.com/10715691/1947480

    大話數據結構之php實現單鏈表