1. 程式人生 > >線性表--鏈表(PHP實現)

線性表--鏈表(PHP實現)

操作 ror head ret display OS tst color empty

上一篇文章寫了線性表的基本概念以及用C語言實現鏈表,有興趣的同學可以看看:線性表--鏈表(C語言實現)。

現在,我們來看看用PHP來實現鏈表。

我們都知道,鏈表由一個個結點組成。在c語言中,我們用結構來定義一個結點,那麽在PHP中我們用什麽來定義結點?

當然是類。

<?php

//用面向對象的思想定義結點
class Node
{
    public $value;
    public $next = null;
}

先給出創建和遍歷鏈表的代碼,我們再說說鏈表的插入和刪除操作,比起用順序存儲結構實現線性表的插入或者刪除操作(也就是用一維數組實現線性表),鏈表為什麽更快。

<?php
/** * LinkedList * Author: TianJiankun */

// 定義結點 class Node { public $value; public $next = null; }
class LinkedList { public $list;
//傳入一個數組,創建鏈表 public function createList($arr) { $head = new Node(); $a = $head; for ($i = 0; $i<count($arr) ; $i++) {
$pNode = new Node(); while ($a->next) { $a = $a->next; } $pNode->value = $arr[$i]; $a->next = $pNode; } $this->list = $head; } //打印鏈表的數據 public function printList() { $list = $this->list
; $pNode = $list->next; if (! $pNode) { echo "empty list"; } while ($pNode != null) { echo $pNode->value."\r\n"; $pNode = $pNode->next; } } //打印整個鏈表(可以清晰的看到內部結構) public function printStructure() { $list = $this->list; $pNode = $list->next; if (! $pNode) { echo "empty list"; } $str = ‘<pre style="display: block;padding: 9.5px;margin: 44px 0 0 0;">‘; $show_data = print_r($pNode, true); $str .= $show_data; $str .= ‘</pre>‘; echo $str; } } $list = new LinkedList(); $list->createList([1,2,3,4,5]);$list->printStructure(); $list->printList();

我們舉個例子來說明順序存儲結構插入的劣勢之處。

假設你有一個十層書架,並且你有一千本書,你把書按字母A~Z排序,整整齊齊放在書架上。

後來,你買了一本《計算機程序的構造和解釋》,這個時候你要把這本書插入字母J的位置,那麽,你就得在新書插入的這個位置開始,把後面所有的書都往後移動一個位置。也就是說,如果插入的位置後面有500個元素的話,你就得做500個操作。這就是順序存儲結構的插入操作。

而鏈表依靠指針域,就不會這麽麻煩。上代碼。

    //在第n個位置插入一個元素,如果成功返回true
    public function insert($value, $n)
    {
        $p = $this->list;
        $i = 1;
        while ($p->next && $n>$i) {
            $p = $p->next;
            ++$i;
        }
        //$q就是第n個元素
        $q = $p->next;
        if (! $q || $n<$i) {
            echo ‘insert error‘;
            die;
        }
        $s = new Node();
        $p->next = $s;
        $s->value = $value;
        $s->next = $q;
        return true;
    }

  //刪除第n個元素,如果成功返回被刪除元素的值
    public function delete($n)
    {
        $p = $this->list;
        $i = 1;
        while ($p->next && $n>$i) {
            $p = $p->next;
            ++$i;
        }
        //$q就是第n個元素
        $q = $p->next;
        if (! $q || $n<$i) {
            echo ‘delete error‘;
            die;
        }
        $p->next = $q->next;
        $value = $q->value;
        unset($q);
        return $value;
    }

整體代碼:

<?php

class Node
{
    public $value;
    public $next = null;
}
class LinkedList
{
    public $list;
    //傳入一個數組,創建鏈表
    public function createList($arr)
    {
        $head = new Node();
        $a = $head;
        for ($i = 0; $i<count($arr) ; $i++) {
            $pNode = new Node();
            while ($a->next) {
                $a = $a->next;
            }
            $pNode->value = $arr[$i];
            $a->next = $pNode;
        }
        $this->list = $head;
    }

    //打印鏈表的數據
    public function printList()
    {
        $list = $this->list;
        $pNode = $list->next;
        if (! $pNode) {
            echo "empty list";
        }
        while ($pNode != null) {
            echo $pNode->value."\r\n";
            $pNode = $pNode->next;
        }
    }

    //打印整個鏈表(可以清晰的看到內部結構)
    public function printStructure()
    {
        $list = $this->list;
        $pNode = $list->next;
        if (! $pNode) {
            echo "empty list";
        }
        $str = ‘<pre style="display: block;padding: 9.5px;margin: 44px 0 0 0;">‘;
        $show_data = print_r($pNode, true);
        $str .= $show_data;
        $str .= ‘</pre>‘;
        echo $str;
    }
    
    //判斷鏈表是否為空
    public function isEmpty()
    {
        return $this->list->next == null;
    }

    //刪除第n個元素,如果成功返回被刪除元素的值
    public function delete($n)
    {
        $p = $this->list;
        $i = 1;
        while ($p->next && $n>$i) {
            $p = $p->next;
            ++$i;
        }
        //$q就是第n個元素
        $q = $p->next;
        if (! $q || $n<$i) {
            echo ‘delete error‘;
            die;
        }
        $p->next = $q->next;
        $value = $q->value;
        unset($q);
        return $value;
    }

    //在第n個位置插入一個元素,如果成功返回true
    public function insert($value, $n)
    {
        $p = $this->list;
        $i = 1;
        while ($p->next && $n>$i) {
            $p = $p->next;
            ++$i;
        }
        //$q就是第n個元素
        $q = $p->next;
        if (! $q || $n<$i) {
            echo ‘insert error‘;
            die;
        }
        $s = new Node();
        $p->next = $s;
        $s->value = $value;
        $s->next = $q;
        return true;
    }

    //讀取第i個元素
    public function getElem($n)
    {
        $p = $this->list->next;
        $i = 1;
        while ($p && $n>$i) {
            $p = $p->next;
            ++$i;
        }
        if (! $p && $n<$i) {
            echo "get error";
            die;
        }
        $value = $p->value;
        return $value;
    }
    
    //整表刪除,成功返回true
    public function clearList()
    {
        $p = $this->list->next;
        while ($p) {
            $q = $p->next;
            unset($p);
            $p = $q;
        }
        $this->list->next = null;
        return true;
    }
}
$list = new LinkedList();
$list->createList([1,2,3,4,5]);
echo $list->delete(5)."\r\n";
$list->insert(100,2);
echo $list->getElem(3);
$list->printStructure();
$list->printList();
$list->clearList();
var_dump($list->isEmpty());
$list->printStructure();

線性表--鏈表(PHP實現)