大话数据结构之php实现单链表

最近想起来两件事1.大话数据结构和大话设计模式

这两本书很有意思,C语言有指针,所以实现起来容易理解,所以突然想到用PHP写一下来熟悉一下数据结构的线性表,不过看的比较慢。一般两三天才看完一部分,毕竟还要工作,老板还安装摄像头看着每天干了啥。。。。。老板事业兴隆,嘻嘻。

线性表的概念不赘述,直接去看大话数据结构,代码也是在参考众多实现方案,比较符合大话数据结构的原本思想,就是基本上还原C语言的实现过程。

直接上代码

  1. 线性表
  2. <?php
    /*
     *文件名:linearList.php 
     * 功能:数据结构线性表的顺序存储实现
     * author:jack
     * @copyright:www.gifttodj.com
     */
    
    	class linearList{
    		private $length;		//当前长度
    		private $arr;			//当前存储位置
    		const MAXSIZE=100;		//最大长度
    
    		   /*
             *构造函数,判断空表还是非空表,并且进行实例化,定义一个数组 
             * @param array $arr 输入的数组
             * @param int $n 输入数组的长度
             * @ruturn void;
            */
    
    		function __construct($arr,$n){
    			if($n>self::MAXSIZE){
    				echo "对不起,数组的长度超过了最大允许值".self::MAXSIZE;
    			}elseif($n<0){
    				echo ‘异常,数组长度不能为负数‘;
    			}elseif($n==0){
    				echo ‘<br/>... 你创建了一张空表,数组长度为0‘;
    				$this->arr=$arr;
    				$this->length=$n;
    			}else{
    				echo ‘<br/>... 你成功创建了一张表<br/>‘;
    				$this->arr=$arr;
    				$this->length=$n;
    			}
    		}
    
    		  /*
               *按位查找,返回查找到的值
    		   *@param int $n 查找的位置
               * @ruturn string; 
               */
    		function findValue($n){
    			if($n<1||$n>$this->length){
    				echo ‘输入的位置有误,请在1到‘.$this->length.‘范围内选择‘;
    			}
    			return ‘你要找的第‘.$n.‘位的值为‘.$this->arr[$n-1];
    		}
    
    		/*
               *按值查找,返回查找到的位置
              * @ruturn string;
              * @param int $n 查找的值
              */
    		function findLocation($n){
    			$v=true;
    			foreach($this->arr as $key=>$value){
    				if($value==$n){
    					$b=$key+1;
    					return ‘你要找的‘.$n.‘的位置是‘.$b;;
    				}else{
    					$v=false;
    				}
    			}
    			if(!$v){
    				return ‘你要找的值‘.$n.‘不存在‘;
    			}
    		}
    
    		 /*
                *在选定的位置处插入某个值
    			* @param int $i 插入位置
                * @param int $v 插入的值
                * @ruturn array;
                */
    		function insertValue($i,$v){
    			if($i<1||$i>self::MAXSIZE){
    				echo ‘输入的位置有误,请在1到‘.self::MAXSIZE.‘范围内选择‘;
    				return;
    			}
    			//现将所有i之后的值往后移动一位
    			for($h=$this->length;$h>=$i;$h--){
    				$this->arr[$h]=$this->arr[$h-1];
    			}
    			if($i>$this->length){
    				$this->arr[$this->length]=$v;
    			}else{
    				$this->arr[$i-1]=$v;
    			}
    			$this->length++;
    			return $this->arr;
    
    		}
    
    			/*
                   *在选定的位置删除某个值
                  * @param int $i 位置
    			  * @ruturn array;
                  */
    		function deleteValue($i){
    			if($i<1||$i>self::MAXSIZE){
    				echo ‘输入的位置有误,请在1到‘.self::MAXSIZE.‘范围内选择‘;
    				return;
    			}
    			//现将所有i之后的值往前移动一位
    			for($j=$i;$j<$this->length;$j++){
    				$this->arr[$j-1]=$this->arr[$j];
    			}
    			unset($this->arr[$this->length-1]);
    			$this->length--;
    			return $this->arr;
    		}
    
    		function __destruct(){
    			 if($this->length==0){
                            echo ‘<br/>...销毁一张空表...<br/>‘;
                       }else{
                            echo ‘<br/>...成功销毁一张表..<br/>‘;
                       }
    		}
    
    	}
    ?>
  3. 线性表测试
    require_once(‘linearList.php‘);
    
    $arr=array(10,125,123,1,4);
    $n=5;
    $list = new linearList($arr,$n);
    echo $list->findValue(5).‘<br/>‘;
    
    echo $list->findLocation(4).‘<br/>‘;
    
    echo ‘<pre>‘;
    print_r($list->insertValue(20,300));
    echo ‘</pre>‘;
    echo ‘<pre>‘;
    print_r($list->deleteValue(1));
    echo ‘</pre>‘;
  4. 单链表<?php
    class LNode{
    	public  $data;
    	public  $next;
    
    	public function __construct($data=‘‘){
    		$this->data=$data;
    		$this->next=null;
    	}
    }
    class SingleLinkList{
    	public  $data;
    	public  $next;
    	//单链表的创建都是从空表逐渐增加上去的
    	//这相当于头结点
    	public function __construct(){
    		$this->data=null;//公用信息
    		$this->next=null;
    	}
    
    	//每个节点的数据这么传进来呢
    	//头插法,每个新数据都是第一个位置
    	public function CreateListHead($num){
    		for($i=0;$i<$num;$i++){
    			$node = new LNode();
    			$node->data = mt_rand(100,200);
    			$node->next=$this->next;
    			var_dump($node);
    			$this->next=$node;
    		}
    	}
    	//尾插法
    	public function CreateListTail($num){
    		$tail=$this;
    		//把新节点当成当前节点的下一节点
    		for($i=0;$i<$num;$i++){
    			$node = new LNode();
    			$node->data = mt_rand(100,200);
    			$tail->next=$node;
    			$tail=$node;
    			var_dump($node);
    		}
    		$node->next=null;
    	}
    	//销毁单链表
    	public function DestroyList(){
    		//
    		$that=$this;
    		while($that){
    			$temp=$that->next;
    			unset($that);
    			$that=$temp;
    		}
    	}
    
    	//清空单链表
    	//只留下头结点
    	public function ClearList(){
    		$temp=$this->next;
    		while($temp){
    			$tmp=$temp->next;
    			unset($temp);
    			$temp=$tmp;
    		}
    		$this->next=null;
    	}
    
    	//判断单链表是否为空
    	public function ListEmpty(){
    		if($this->next){
    			return false;
    		}else{
    			return true;
    		}
    	}
    
    	//单链表的长度
    	public function ListLength(){
    		$temp=$this->next;
    		$count=0;
    		while($temp){
    			$count++;
    			$temp=$temp->next;
    		}
    		return $count;
    	}
    
    	//查找特定位置的数据
    	public function FindValue($pos){
    		$count=1;
    		$temp=$this->next;
    		//也可以吧count与pos判断放在循环里
    		while($temp && $count<$pos){
    			$count++;
    			$temp = $temp->next;
    		}
    		if(!$temp ||$count>$pos){
    			return ‘该位置没有数据‘;
    		}
    		//这里可以利用该节点找出下一个值,也就能找出上一个节点
    		return $p->data;
    	}
    	//查找数据所在的位置
    	public function LocateElem($value){
    		$count=1;
    		$temp=$this->next;
    		//也可以吧count与pos判断放在循环里
    		while($temp){
    			$count++;
    			if($value == $temp->data){
    				return $count;
    			}
    		}
    		if(!$temp){
    			return ‘没有该数据:‘.$value;
    		}
    	}
    	//特定值的前一个值
    	public function PriorElem($value){
    		$temp=$this->next;
    		if($temp&&$temp->data==$value){
    			 return $p->data.‘已经是第一个元素,已无前驱元素‘;
    		}
    		while($temp&&$temp->next){
    			$tmp=$temp->next;
    			if($tmp->data==$value){
    				return $temp->data;
    			}
    			$temp=$tmp;
    		}
    		return ‘该单链表没有该数值‘.$value;
    	}
    
    	//特定值的下一个值
    	public function NextElem($value){
    		$temp=$this->next;
    		if($temp&&$temp->next==null){
    			 return $temp->data.‘已经是尾节点数据,已无后续‘;
    		}
    		while($temp){
    			if($this->data==$value){
    				return $temp->data;
    			}
    		}
    		return ‘该单链表没有该数值‘.$value;
    	}
    
    	//在指定位置之前插入数据
    	/**
    	*@param class LNode $node
    	*
    	**/
    	public function ListInsert($pos,$node){
    		$count=1;
    		$temp=$this;
    		//也可以吧count与pos判断放在循环里
    		while($temp && $count<$pos){
    			$count++;
    			$temp = $temp->next;
    		}
    		if(!$temp ||$count>$pos){
    			return ‘该位置没有数据‘;
    		}
    		//这里可以利用该节点找出下一个值,也就能找出上一个节点
    		$node->next=$temp->next;
    		$temp->next=$node;
    		return ‘ok‘;
    
    	}
    	//删除单链表指定位置的数据元素
    	public function ListDelete($pos){
    		$count=0;
    		$temp=$this;
            while($temp->next){
                $count++;
                if($count==$pos){
                    $tmp=$temp->next;
                    $temp->next=$tmp->next;
                    unset($tmp);
                    return ‘OK‘;
                }
                $temp=$temp->next;
            }
            return ‘该位置没有数据‘;
    	}
    
    	public function ListTraverse(){
    		$arr=array();
    		$temp=$this;
    
    		while($temp->next){
    			$arr[]=$temp->data;
    			$temp=$temp->next;
    		}
    		return $arr;
    	}
    
    }
    ?>
  5. 单链表测试require_once(‘LinkList.php‘);
    
    $list = new SingleLinkList();
    $listt = $list->CreateListHead(5);
    $list = $list->ListTraverse();
    var_dump($listt);
  6. 注意:应该没有注意的了,这个还是很有用武之地,只不过理论偏多,不喜欢的就跳过吧。本来也没有多大问题
时间: 2024-10-02 10:46:46

大话数据结构之php实现单链表的相关文章

[大话数据结构]线性表之单链表结构和顺序存储结构

线性表定义: 零个或者多个数据元素的有限序列.元素之间是有顺序的,如果元素存在多个,则第一个元素无前驱,最后一个元素无后继.其他每个元素都有且只有一个前驱和后继.并且数据元素的类型要相同. 线性表的抽象数据类型: ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. 其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素. 数据元素之间的关系是一对一的关系.

数据结构上机测试2-1:单链表操作A (顺序建表+关键字删除)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

数据结构之 线性表---单链表操作A (删除链表中的指定元素)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)

数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个). 输入 第一行输入元素个数n: 第二行输入n个整数. 输出 第一行输出初始链表元素个数: 第二行输出按照逆位序所建立的初始链表: 第三行输出删除重复元素后的单链表元素个数: 第四行输出删除重复元素后的单链表. 示例输入 10 21 30 14 55 32 63

Java数据结构-线性表之单链表LinkedList

线性表的链式存储结构,也称之为链式表,链表:链表的存储单元可以连续也可以不连续. 链表中的节点包含数据域和指针域,数据域为存储数据元素信息的域,指针域为存储直接后继位置(一般称为指针)的域. 注意一个头结点和头指针的区别: 头指针: 指向链表的第一个节点的指针,若链表有头结点,则是指向头结点的指针: 头指针具有标识作用,所以常用头指针作为链表的名字: 不论链表是否为空,头指针都不为空: 是链表的必要元素. 头结点: 头结点是为了操作的统一和方便而设立的,放在第一个元素节点的前面,其数据域一般无意

数据结构之 线性表---单链表的拆分

数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory limit: 65536K 题目描述 输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数.两个子链表中数据的相对次序与原链表一致. 输入 第一行输入整数N;: 第二行依次输入N个整数. 输出 第一行分别输出偶数链表与奇数链表的元素个数: 第二行依次输出偶数子链表的所有数据: 第三行依次输出奇数子链表的所有数据. 示例输入 10 1 3 22

数据结构----顺序表与单链表(JAVA)

下面为学习顺序表和单链表的一些基本操作函数: 1 public class SeqList<T> extends Object { 2 protected int n; 3 protected Object[] element; 4 5 public SeqList(int length) { 6 this.element = new Object[length]; 7 this.n = 0; 8 } 9 10 public SeqList() { 11 this(64); 12 } 13 1

数据结构复习--java实现单链表基本操作

单链表的基本操作包括建立单链表.查找运算(按序查找和按值查找).插入运算(前插和后插)和删除运算.下面给出具体的java实现程序: package com.zpp.test; //首先创建一个节点类 public class Node { private Node next; //指针域 private int data;//数据域 public Node( int data) { this. data = data; } } package com.zpp.test; public class

【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)

所实现的循环单链表的结构如下图所示: 循环单链表的实现,和上一篇文章单链表的实现大致相同点击打开链接,略有区别: 1:循环判断的条件不再是s == NULL或者s->next == NULL,而是他们是否等于头指针.2: 断开链表时的处理,尾节点的next不是NULL,而是指向头结点 具体细节参考上一篇文章 头文件:SCList.h #ifndef SCLIST_H #define SCLIST_H #include<iostream> #include<cassert> u