PHP数据结构之三 线性表中的单链表的PHP实现

线性表的链式存储:用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性表简称线性链表。
链式存储线性表的特点:存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。链表中结点的逻辑顺序和物理顺序不一定相同。
PHP实现单链表
<?php
/**
 *单链表的基本操作
 *1.初始化单链表 __construct()
 *2.清空单链表 clearSLL()
 *3.返回单链表长度 getLength()
 *4. 判断单链表是否为空 getIsEmpty()
 *5.头插入法建表 getHeadCreateSLL()
 *6.尾插入法建表 getTailCreateSLL()
 *7.返回第$i个元素 getElemForPos()
 *8.查找单链表中是否存在某个值的元素 getElemIsExist()
 *9.单链表的插入操作 getInsertElem()
 *10.遍历单链表中的所有元素 getAllElem()
 *11.删除单链中第$i个元素 getDeleteElem()
 *12.删除单链表中值为$value的前$i($i>=1)个结 点 getDeleteElemForValue()
 *13.删除单链表所有重复的值 getElemUnique()
 **/
header("content-type:text/html;charset=gb2312");
class LNode{
 public $mElem;
 public $mNext;
 public function __construct(){
  $this->mElem=null;
  $this->mNext=null;
 }
}
class SingleLinkedList{
 //头结点数据
 public $mElem;
 //下一结点指针
 public $mNext;
 //单链表长度
 public static $mLength=0;
/**
 *初始化单链表
 *
 *@return void
 */
  public function __construct(){
   $this->mElem=null;
      $this->mNext=null;
 }
/**
 *清空单链表
 *
 *@return void
 */
  public function clearSLL(){
  if(self::$mLength>0){
   while($this->mNext!=null){
    $q=$this->mNext->mNext;
    $this->mNext=null;
    unset($this->mNext);
    $this->mNext=$q;
   }
   self::$mLength=0;
  }
 }
/**
 *返回单链表长度
 *
 *@return int
 */
 public static function getLength(){
   return self::$mLength;
   }
/**
*判断单链表是否为空
*
*@return bool 为空返回true,不为空返回false
*/
 public function getIsEmpty(){
  if(self::$mLength==0 && $this->mNext==null){
   return true;
  }else{
   return false;
  }
 }
/**
 *头插入法建表
 *
 *@param array $sarr 建立单链表的数据
 *@return void
 */
 public function getHeadCreateSLL($sarr){
   $this->clearSLL();
   if(is_array($sarr)){
   foreach($sarr as $value){
    $p=new LNode();
    $p->mElem=$value;
    $p->mNext=$this->mNext;
    $this->mNext=$p;
     self::$mLength++;
   }
   }else{
    return false;
   }
  }
/**
 *尾插入法建表
 *
 *@param array $sarr 建立单链表的数据
 *@return void
 */
 public function getTailCreateSLL($sarr){
  $this->clearSLL();
  if(is_array($sarr)){
   $q=$this;
   foreach($sarr as $value){
    $p=new LNode();
    $p->mElem=$value;
    $p->mNext=$q->mNext;
    $q->mNext=$p;
     $q=$p;
    self::$mLength++;
   }
  }else{
   return false;
  }
 }
/**
*返回第$i个元素
*
*@param int $i 元素位序,从1开始
*@return mixed
*/
 public function getElemForPos($i){
  $i=(int)$i;
  if($i>self::$mLength || $i < 1){
   return null;
  }
  $j=1;
  $p=$this->mNext;
  while($j<$i){
   $q=$p->mNext;
   $p=$q;
   $j++;
  }
  return $p;
 }
/**
*查找单链表中是否存在某个值的元素
*如果有返回该元素结点,否则返回null
*
*@param mixed $value 查找的值
*@return mixed
*/
 public function getElemIsExist($value){
  $p=$this;
  while($p->mNext != null && strcmp($p->mElem,$value)!==0){
   $p=$p->mNext;
  }
  if(strcmp($p->mElem,$value)===0){
   return $p;
  }else{
   return null;
  }
 }
/**
*查找单链表中是否存在某个值的元素
*如果有返回该元素位序,否则返回-1
*
*@param mixed $value 查找的值
*@return mixed
*/
    public function getElemPosition($value){
  $p=$this;
  $j=0;
  while($p->mNext != null && strcmp($p->mElem,$value)!==0){
   $j++;
   $p=$p->mNext;
  }
  if(strcmp($p->mElem,$value)===0){
   return $j;
  }else{
   return -1;
  }
 }
/**
*单链表的插入操作
*
*@param int $i 插入元素的位序,即在什么位置插入新的元素,从1开始
*@param mixed $e 插入的新的元素值
*@return boolean 插入成功返回true,失败返回false
*/
 public function getInsertElem($i,$e){
  if($i>self::$mLength || $i<1){
   return false;
  }
  $j=1;
  $p=$this;
  while($p->mNext!=null && $j<$i){
   $p=$p->mNext;
   $j++;
  }
  $q=new LNode();
  $q->mElem=$e;
  $q->mNext=$p->mNext;
  $p->mNext=$q;
  self::$mLength++;
  return true;
 }
/**
*遍历单链表中的所有元素
*
*@return array 包括单链中的所有元素
*/
 public function getAllElem(){
  $slldata=array();
  if($this->getIsEmpty()){
  }else{
   $p=$this->mNext;
   while($p->mNext!=null){
    $slldata[]=$p->mElem;
    $p=$p->mNext;
   }
   $slldata[]=$p->mElem;
  }
  return $slldata;
 }
/**
*删除单链中第$i个元素
*@param int $i 元素位序
*@return boolean 删除成功返回true,失败返回false
*/
 public function getDeleteElem($i){
  $i=(int)$i;
  if($i>self::$mLength || $i<1){
   return false;
  }
  $p=$this;
  $j=1;
  while($j<$i){
   $p=$p->mNext;
   $j++;
  }
  $q=$p->mNext;
  $p->mNext=$q->mNext;
  $q=null;
  unset($q);
  self::$mLength--;
 }
/**
*删除单链表中值为$value的前$i($i>=1)个结 点
*
*@param mixed 待查找的值
*@param $i 删除的次数,即删除查找到的前$i个
@return void
*/
 public function getDeleteElemForValue($value,$i=1){
  if($i>1){
   $this->getDeleteElemForValue($value,$i-1);
  }
  $vp=$this->getElemPosition($value);
  $this->getDeleteElem($vp);
 }
/**
*删除单链表所有重复的值
*
*@return void
*/
 public function getElemUnique(){
  if(!$this->getIsEmpty()){
   $p=$this;
   while($p->mNext!=null){
    $q=$p->mNext;
    $ptr=$p;
    while($q->mNext!=null){
     if(strcmp($p->mElem,$q->mElem)===0){
      $ptr->mNext=$q->mNext;
      $q->mNext=null;
      unset($q->mNext);
      $q=$ptr->mNext;
      self::$mLength--;
     }else{
      $ptr=$q;
      $q=$q->mNext;
     }
    }
    if(strcmp($p->mElem,$q->mElem)===0){
     $ptr->mNext=null;
     self::$mLength--;
    }
    $p=$p->mNext;
   }
  }
 }
}
?>
内容概要:本文详细介绍了PMSM(永磁同步电机)的仿真研究及其两种关键控制方法:三电平SVPWM矢量控制和双环矢量控制。首先阐述了PMSM在现代电机驱动系统中的重要地位及其广泛的应用领域,如电动汽车、机器人和风力发电等。接着讨论了PMSM仿真的重要性,包括电气特性、机械特性和热特性等方面的考量。然后深入探讨了三电平SVPWM矢量控制技术的工作原理及其对电机性能的提升效果,如提高运行效率和减少谐波失真。随后介绍了PMSM双环矢量控制的具体实现方式,即内环电流控制和外环速度控制相结合的方法,强调了这种方法在提高电机动态性能和稳定性方面的优势。最后对比了传统三电平控制方法和双环矢量控制方法的特点,指出了各自的优势和应用场景。 适合人群:从事电机控制系统研究的技术人员、高校相关专业师生、对电机控制感兴趣的工程技术人员。 使用场景及目标:适用于需要深入了解PMSM控制技术和仿真实现的研究项目和技术开发。目标是帮助读者掌握PMSM的仿真建模方法,理解并应用三电平SVPWM和双环矢量控制技术,以优化电机性能。 其他说明:本文不仅提供了理论分析,还通过MATLAB进行了详细的仿真演示,使读者能够直观地看到不同控制方法的效果。这对于实际工程项目的设计和优化具有重要的指导意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值