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;
}
}
}
}
?>
PHP数据结构之三 线性表中的单链表的PHP实现的更多相关文章
- javascript实现数据结构与算法系列:线性表的静态单链表存储结构
有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构. 在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置.数组的第0分量可看成头结点,其指 ...
- 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除。(C语言)
/* 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除 */ #include <stdio.h> #include <stdlib.h> typedef st ...
- 线性表概述及单链表的Java实现
一.线性表概述 线性表是指一组数据元素之间具有线性关系的元素序列,它表现为:除第一个元素没有直接前驱元素.最后一个元素没有直接后继元素外,其余所有元素都有且仅有一个直接前驱元素和直接后继元素. 根据存 ...
- 线性表:实现单链表和子类栈(Stack)及单向队列(Queue) [C++]
刚刚开始学习c++.之前c的内容掌握的也不多,基本只是一本概论课的程度,以前使用c的struct写过的链表.用python写过简单的数据结构,就试着把两者用c++写出来,也是对c++的class,以及 ...
- PHP数据结构之二 线性表中的顺序表的PHP实现
线性表 (一)基本特点:最基本.最简单.最常用的一种数据结构 在这种结构中: 1.存在一个唯一的被称为“第一个”的数据元素: 2.存在一个唯一的被称为“最后一个”的数据元素: 3.除第一个元素外,每个 ...
- javascript实现数据结构:线性表--简单示例及线性表的顺序表示和实现
线性表(linear list)是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列.在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成. 其中: 数据元素的个数n定义为 ...
- javascript实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
- Java数据结构之线性表
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- 数据结构之线性表(python版)
数据结构之线性表(python版) 单链表 1.1 定义表节点 # 定义表节点 class LNode(): def __init__(self,elem,next = None): self.el ...
随机推荐
- ubuntu android 开始git安装
ubuntu android 开始git安装 git安装: http://source.android.com/source/initializing.html网站提示到以下网址下载: http: ...
- 深入浅出Eclipse Modeling Framework (EMF)
Eclipse Modeling Framework (EMF),简单的说,就是Eclipse提供的一套建模框架,可以用EMF建立自己的UML模型,设计模型的XML格式或编写模型的java代码.EMF ...
- 《深入理解java虚拟机》学习笔记之编译优化技术
郑重声明:本片博客是学习<深入理解Java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序员有一个共识,以编译方式执行本地代码比解释方式更快,之所以有这样的共识,除去虚拟机解释 ...
- As3 Practises : use TheMiner do as3 project swf performance profile , find memory leak!
The second and most universal way is to launch it from the mm.cfg fileTheMiner.swf must be trusted1: ...
- 正则,re模块
一.正则表达式(精准匹配) 匹配字符串内容的一种规则 二.字符组 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 常见字符组格式如下:[0123456789],[0-9],[ ...
- 20165222 实验一java开发环境的熟悉
实验内容及步骤 实验一 Java开发环境的熟悉-1 1 建立“自己学号exp1”的目录 2 在“自己学号exp1”目录下建立src,bin等目录 3 javac,java的执行在“自己学号exp1”目 ...
- System.Web.HttpRequestValidationException: 从客户端(dbFlag="<soap:Envelope xmlns...")中检测到有潜在危险的 Request.Form 值。
System.Web.HttpRequestValidationException: 从客户端(dbFlag="<soap:Envelope xmlns...")中检测到有潜 ...
- fir分布式滤波的fpga实现
此设计的结构包括:1.移位寄存器链,n阶的有n-1个寄存器. 2.第一次累加部分.由fir滤波系数对称可得到对称的寄存器相加可以减小电路规模,所以第一次累加很有必要. 3,锁存并移位部分.此部分是为了 ...
- 【经典】Noip动态规划
一.线性动态规划 最长严格上升子序列 #include<iostream> #include<cstdio> using namespace std; int n,ans; ] ...
- 如何给 FastAdmin 单独设置域名
如何给 FastAdmin 单独设置域名 (声明:不建议给后台固定的域名,主要是安全问题) FastAdmin 是基于 ThinkPHP5 框架编写的,ThinkPHP 5 支持域名路由,可对模块单独 ...