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 ...
随机推荐
- Markdown速成班
更多内容请参考: http://ibruce.info/2013/11/26/markdown/
- Android 画廊效果之ViewPager显示多个图片
首先来看下面的效果: 从上面的图片可以看到,当添加多张图片的时候,能够在下方形成一个画廊的效果,我们左右拉动图片来看我们添加进去的图片,效果是不是好了很多呢?下面来看看怎么实现吧! 上面的效果类似An ...
- mac和linux下使用Docker,部署SpringBoot项目到docker
主要是看一下如何在linux及mac上安装docker,创建docker镜像,部署SpringBoot项目到docker,并借助于DaoCloud进行docker镜像下载加速等. 我用的电脑是mac, ...
- 网络爬虫必备知识之requests库
就库的范围,个人认为网络爬虫必备库知识包括urllib.requests.re.BeautifulSoup.concurrent.futures,接下来将结对requests库的使用方法进行总结 1. ...
- net core集成CAP
net core集成CAP https://www.cnblogs.com/guolianyu/p/9756941.html 一.前言 感谢杨晓东大佬为社区贡献的CAP开源项目,传送门在此:.NET ...
- 安卓开发第一记 android stdio 安装后 新建测试项目报错
Failed to resolve:com.android.support:appcompat-v7:报错处理 你在使用android studio时是否也出现过上图的报错,你还在为它的出现烦恼? ...
- raw_in_fields
在admin后台类中加入raw_id_fields(只适用于外键)后,会显示外键的详细信息
- json数据格式字符串在java中的转移
说明:项目中遇到请求的json数据字符串,打印出来没有问题,但是想加入到代码中,就需要进行转移 原数据为(用src代替)(没有写完): {"adjust_fee":"0. ...
- Linux环境安装nginx
安装需要以下工具: yum -y install gcc gcc-c++ autoconf automake 模块依赖: yum -y install zlib zlib-devel openssl ...
- Windows下通过Composer安装Yii2 [ 2.0 版本 ]
安装好大于5.4或更高版本的PHP环境并开启openssl扩展.如果是Apache服务器,加载Apache的mod_ssl模块. 下载Composer并安装. 开始->运行[或者WIN+R]-& ...