线性表的链式存储:用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性表简称线性链表。

链式存储线性表的特点:存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。链表中结点的逻辑顺序和物理顺序不一定相同。

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;}}}}?>

转载于:https://www.cnblogs.com/crystaltu/p/6408507.html

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

  1. 线性表的应用 —— 单链表

    线性表的应用 -- 单链表 链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不一定相邻,可以给每个元素都附加一个指针域,指向下一个元素的存储位置. 像这样: 从图中可以看出,每个节点都 ...

  2. C语言线性表之循环单链表

    #include<stdio.h> #include<stdlib.h>int typeOfLinkList;typedef struct LNode{int data;str ...

  3. 线性表基本操作,单链表的建立(头插法,尾插法)、插入、删除、遍历操作的实现(c++ 数据结构 实验二)

    大学数据结构课程的实验题目,掌握线性表的链接存储结构,用c++语言描述 一.实验要求 1.分别用头插法和尾插法建立一个含有若干结点的单链表 2.对已建立的单链表进行插入.删除.遍历输出等操作 二.代码 ...

  4. 数据结构(算法)-线性表2(单链表)

    为什么80%的码农都做不了架构师?>>>    /** 单链表 双链表1,空的线性表setNull(L) 2,insert 加入元素 3,根据位置查找元素 4,查找所有元素 5,删除 ...

  5. [XJTUSE]数据结构学习——第一章 线性表 1.3 单链表的实现(JAVA)

    文章目录 1.3 单链表的实现(JAVA) 1.curr指针与头结点的说明 2.插入和删除操作的说明 插入 删除 1.3 单链表的实现(JAVA) 链表是由一系列叫做表的结点(node)的对象组成的, ...

  6. C语言-线性表基本操作之单链表

    下面是单链表的基本操作: #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct L ...

  7. java线性表合并_单链表的合并(Java实现)

    C语言能做的,Java照样可以做.但是没有指针的操作,可能使人看起来"不舒服".这个博客是为了个人学习算法和数据结构而开的,以后凡是涉及到这方面的内容,我会尽量用Java和C同时实 ...

  8. c语言如何删除数组中的某一个元素_数据结构之线性表高效删除重复元素

    刚刚学完数据结构之线性表中关于顺序表和单链表的知识,我们知道顺序表中存储数据的结构是一个数组,对于数组来说,在尾部插入.删除元素是比较高效的,但是如果在中间或者开头插入.删除元素,就会涉及数据的搬移, ...

  9. 【Java数据结构】线性表

    线性表 线性表是最基本.最简单.也是最常用的一种数据结构. 线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而 ...

最新文章

  1. SQL SERVER 导入EXCEL的存储过程
  2. eval、json.parse()的介绍和使用注意点
  3. 解决Maven管理项目update Maven时,jre自动变为1.5
  4. archlinux详细安装步骤_最新Centos的liunx安装宝塔的详细步骤
  5. flask使用第三方云通讯平台时,出现{'172001':'网络错误'}解决方法
  6. yolo v3制作自己的数据_【手把手AI项目】五、自己制作图像VOC数据集--Objection Detection(目标检测)...
  7. Mac电脑设置鼠标主按钮的方法?
  8. 【Tableau Desktop 企业日常技巧12】Tableau CA或者CDA 考试真题(附带国外面试题目)
  9. 转载:C语言运算符优先级记忆口诀
  10. Microchip PIC系列8位单片机入门教程(五)定时器
  11. [RK3288][Android6.0] 音频输入接口Mic In和Line In
  12. Airbnb短租房源数据分析
  13. 计算机专业毕业设计选题与方向走势
  14. 超市会员积分管理系统
  15. 谈谈你对间隙锁的理解
  16. 指令级并行(ILP)技术
  17. 【雷达通信】滤波及数据融合【滤波包括了常增益滤波、卡尔曼(Kalman)滤波和扩展卡尔曼滤波(EKF) 数据融合采用BC和CC两种,基于KF和EKF实现】(Matlab代码实现)
  18. SpringBoot+Vue项目校园商铺系统
  19. Linux——Crontab定时器
  20. Matlab扫频求传递函数

热门文章

  1. 转收藏:Git常用命令速查表
  2. 页面那些位置是投放广告的最佳位置
  3. 会计电算化算不算计算机专业,成都会计学校会计电算化专业介绍
  4. ubuntu 12.04 /sbin/ldconfig.real: /usr/local/lib/*.so.8 不是符号连接 解决办法
  5. matlab无法读取xls
  6. MATLAB字符串转换函数
  7. MATLAB figure中提取数据
  8. 前端渲染与后端渲染之间的区别?
  9. 异想维度 java_Java实现多字段(维度)复杂排序
  10. 解决Pycharm窗口一闪而过的问题