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

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

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. CSS:Tutorial two

    1.CSS Text text color, text align... Text Decoration The text-decoration property is used to set or ...

  2. TCP的保活定时器 转

    http://blog.csdn.net/zhangskd/article/details/44177475 TCP的Keepalive,目的在于看看对方有没有发生异常,如果有异常就及时关闭连接. 当 ...

  3. hashlib摘要算法模块,logging日志,configparser配置文件模块

    一.hashlib模块(摘要算法模块) 1.算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢? 摘要算法又称哈希算法.散列算法.它通过一个函数,把 ...

  4. 【MFC】MFC绘图不闪烁——双缓冲技术

    MFC绘图不闪烁——双缓冲技术[转] 2010-04-30 09:33:33|  分类: VC|举报|字号 订阅 [转自:http://blog.163.com/yuanlong_zheng@126/ ...

  5. 1132. Cut Integer (20)

    Cutting an integer means to cut a K digits long integer Z into two integers of (K/2) digits long int ...

  6. C#网络编程(同步传输字符串) - Part.2

    服务端客户端通信 在与服务端的连接建立以后,我们就可以通过此连接来发送和接收数据.端口与端口之间以流(Stream)的形式传输数据,因为几乎任何对象都可以保存到流中,所以实际上可以在客户端与服务端之间 ...

  7. CLR值类型和引用类型

    知识点:引用类型.值类型.装箱.拆箱 CLR支持两种类型:引用类型和值类型.引用类型在堆上分配内存,值类型在线程栈上分配内存.值类型与引用类型如下所示: 值类型对象有两种表示形式:未装箱和已装箱.将一 ...

  8. (转)【Android】获取Mac地址【2】

    [Android]获取Mac地址[2] 之前写了[Android]获取Mac地址[1]有些不够详细,现在贴上一些其他代码,仅供参考. (1) 调用android 的API: NetworkInterf ...

  9. Hyperledger Fabric快速上手

    安装go curl -O https://storage.googleapis.com/golang/go1.10.2.linux-amd64.tar.gz tar -xvf go1.10.2.lin ...

  10. (转)winform下UPD通信的简单应用

    本文转载自:http://blog.csdn.net/wanlong360599336/article/details/7557046 先看效果图: 使用UDP的好处就是不需要三次握手,但是缺点就是存 ...