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 ...
随机推荐
- Games Delphi developers play
Original link: Games Delphi developers play Delphi game developers are stupid people having too ma ...
- Unity3d 相关文档
Unity3D研究院之处理摄像机跟随避免相机穿墙拉近或透明的方法 http://www.apkbus.com/android-498-1.html
- 一个高性能RPC框架原理剖析
业务与底层网络通信分离 Server大部分主要分为两层: 网络接收层:负责监听端口,负责收包,编码,解码工作,负责将响应包回传给客户端. 业务处理层:负责接收网络接收层完整的包,如果是RPCserve ...
- INIT: vesion 2.88 booting
/***************************************************************************** * INIT: vesion 2.88 b ...
- JavaScript test//href
目录 JavaScript test//href JavaScript test//href href 其实这个问题并不属于这里的.但是呢,由于一天晚上因为这个问题扰我"一夜不能眠" ...
- 启动mysql 失败,“Warning:The /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql' ”
一.Mac OS X的升级或其他原因可能会导致MySQL启动或开机自动运行时 在MySQL操作面板上会提示“Warning:The /usr/local/mysql/data directory is ...
- SQL面试题-行列互换-if、【case when】
http://www.cda.cn/view/21469.html tb_lemon_grade中,表中字段id,student_name,course,score分别表示成绩id,学生姓名,课程名称 ...
- leetcode_sql_3,181,182,183
181. Employees Earning More Than Their Managers The Employee table holds all employees including the ...
- 【sqlite】错误代码整理
这两天为了一个问题折腾了好久,记载一下. SQLite语句一定要严格按例子来写,例如: "CREATE TABLE PunchData (Id Text primary key, Heigh ...
- Linq:从XML获取数据
实体类 public class Customer { public string CustomerID { get; set; } public string CompanyName { get; ...