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

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

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实现的更多相关文章

  1. javascript实现数据结构与算法系列:线性表的静态单链表存储结构

    有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构. 在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置.数组的第0分量可看成头结点,其指 ...

  2. 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除。(C语言)

    /* 正整数构成的线性表存放在单链表中,编写算法将表中的所有的奇数删除 */ #include <stdio.h> #include <stdlib.h> typedef st ...

  3. 线性表概述及单链表的Java实现

    一.线性表概述 线性表是指一组数据元素之间具有线性关系的元素序列,它表现为:除第一个元素没有直接前驱元素.最后一个元素没有直接后继元素外,其余所有元素都有且仅有一个直接前驱元素和直接后继元素. 根据存 ...

  4. 线性表:实现单链表和子类栈(Stack)及单向队列(Queue) [C++]

    刚刚开始学习c++.之前c的内容掌握的也不多,基本只是一本概论课的程度,以前使用c的struct写过的链表.用python写过简单的数据结构,就试着把两者用c++写出来,也是对c++的class,以及 ...

  5. PHP数据结构之二 线性表中的顺序表的PHP实现

    线性表 (一)基本特点:最基本.最简单.最常用的一种数据结构 在这种结构中: 1.存在一个唯一的被称为“第一个”的数据元素: 2.存在一个唯一的被称为“最后一个”的数据元素: 3.除第一个元素外,每个 ...

  6. javascript实现数据结构:线性表--简单示例及线性表的顺序表示和实现

    线性表(linear list)是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列.在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成. 其中: 数据元素的个数n定义为 ...

  7. javascript实现数据结构:线性表--线性链表(链式存储结构)

    上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...

  8. Java数据结构之线性表

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  9. 数据结构之线性表(python版)

    数据结构之线性表(python版) 单链表 1.1  定义表节点 # 定义表节点 class LNode(): def __init__(self,elem,next = None): self.el ...

随机推荐

  1. Flask 的 数据库连接 与 DBUtils 数据库连接池

    Flask 的 数据库连接 与 DBUtils 数据库连接池 本地线程:thread_local 为每个线程创建存储数据的空间,用于线程之间的数据隔离 否则多个线程同时访问,会使得数据混乱 1 Fla ...

  2. MS SQL Server2000转换成MySQL

    按计划今天着手进行将后台数据库从MS SQL Server2000转换成MySQL5.1.3.目的是便于发布软件的测试版本. 1. 驱动: mysql-connector-odbc-5.1.11-wi ...

  3. PL/SQL Developer 建立远程连接数据库的配置 和安装包+汉化包+注册机

    PL/SQL Developer ,主要是讲一下如何配置PL/SQL Developer ,连接Oracle数据库. [知识点] 1.PL/SQL Developer 是什么? PL/SQL Deve ...

  4. 剑指offer-第四章解决面试题思路(字符串的排序)

    题目:输入一个字符串,打印出该字符串的全排列. 思路:将整个字符串分成两部分,第一部分为一个字符,将该字符和该字符后面的字符(直到最后一个字符)依次交换,确定第一个字符:然后固定第一个字符,将后面的字 ...

  5. System.Web.HttpRequestValidationException: 从客户端(dbFlag=&quot;&lt;soap:Envelope xmlns...&quot;)中检测到有潜在危险的 Request.Form 值。

    System.Web.HttpRequestValidationException: 从客户端(dbFlag="<soap:Envelope xmlns...")中检测到有潜 ...

  6. computed属性与methods、watched

    一.计算属性 new Vue({ data: { message: 'hello vue.js !' }, computed: { reverseMessage: function () { retu ...

  7. sqlalchemy的基本的使用

    参考链接:http://www.techweb.com.cn/network/system/2016-10-11/2407638.shtml http://www.cnblogs.com/renfan ...

  8. svn服务器端回退版本 (转)

    由于误操作,不小心将错误的代码提交到了svn上,于是想在服务器上撤销本次提交,经过尝试,发现进行以下步骤的操作即可彻底删除本次提交: 1.首先找到本次提交后生成的版本号,例如为r224. 2.登录到s ...

  9. Java 程序员容易犯的10个SQL错误

    Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用“模式-模式”,举个例子,模式可 ...

  10. FTP上传失败报错227 Entering Passive Model (222,111,8,111,10,40)

    昨天为了一个ftp问题折腾了一天.问题背景:原来有个接口涉及到上传文件,服务端更换了ftp服务器,我们这边需要刷新连接服务端的ip和端口配置,代码没动.联调环境和验收环境都测试通过,一到生产环境就歇菜 ...