<?php
/*
*顺序结构存储的线性表
初始化线性表
获取表的元素个数
插入表
删除表
获取元素
*/
class ShunXuTable {
public $maxSize = 20;
public $Index = 0;
public $array = array();
//初始化表
public function __construct() {
$this->Index = 0;
$this->maxSize = 0;
$this->array = array();
}
//获取当前的元素个数
public function getNum() {
return $this->Index;
}
//插入元素
public function insert($i,$DateType) {
if($i < 0 || $i > $this->Index) { //超出当前的最大元素的位置,或是小于0
echo '参数不合法';
} else if ($this->Index > $this->maxSize) { //超出已经定义的最大存储元素个数
echo "超出已经定义的最大存储元素个数";
} else {
//从当前插入的位置的元素数据依次往后以一个位置
for($j = $this->Index;$j>$i;$j--) {
$this->array[$j] = $this->array[$j-1];
}
$this->Index++;
$this->array[$i] = $DateType;
return 1;
}
}
//删除元素
public function delete($i) {
if($i < 0 || $i > $this->Index) { //超出当前的最大元素的位置,或是小于0
echo '参数不合法';
} else if ($this->Index > $this->maxSize) { //超出已经定义的最大存储元素个数
echo "超出已经定义的最大存储元素个数";
} else {
//从当前插入的位置的元素数据依次往前以一个位置
for($j = $i;$j<$this->Index;$j++) {
$this->array[$j] = $this->array[$j+1];
}
$this->array[$this->Index] = null;
$this->Index--;
return 1;
}
}
//获取元素
public function getChar($i) {
return $this->array[$i];
}
}
/*
链式存储结构
1:定义结点
next 指针域,指向下一个节点
dateType 数据域存储数据值
2:初始化
头部节点的指针域为NULL,数据域为NUll
head->next = null;
head->dateType = null;
3:插入数据:
要在i位置插入一个节点,0<=i<=当前节点数量。
要考虑因素,初始化,没有插入任何一个元素(插入到位置0处)。
已有元素插入到i位置,需要找到i-1的元素,然后我们重新生成以节点,是i-1的节点指向新生成的节点,新生成的节点指向i-1原有指向的节点。
4:删除一个元素:
要在i位置,删除一个节点,我们首先要找到i-1的节点,是i-1的节点指向(I-1)->next->next;
*/
//定义结点
class Node {
public $next; //指针域
public $dateType;//数据域
}
class Nohead {
public $head; //头结点
public $size; //当前个数
public function __construct() {
$this->size = 0;
$this->head = new Node;
$this->head->next = null;
$this->head->dateType = null;
}
//获得节点数
public function getNum() {
$p = $this->head;
$size = 0;
while($p->next != null) {
$p = $p->next;
$size ++;
}
return $size;
}
//插入节点
public function insert($i,$DateType) {
$p = $this->head;
$j = -1;
/*
判断当前节点存在并且i节点存在的情况下
$p->next != null 判断当前节点存在,且i节点存在
$j < $i-1判断循环到I-1节点
循环到要插入元素的位置的前一个元素。
*/
while($p->next != null && $j <= $i-1) { //循环到要插入元素的位置的前一个元素。
$p = $p->next;
$j++;
}
if($j != $i-1) {//此条件判断$p为I-1节点,如果此时I-1为-1则$p 还是头结点
echo "False";
}
$q = new Node; //新建一个结点
$q->dateType = $DateType;
$q->next = $p->next; //把插入当前元素的前一个元素的指向域赋予新建结点
$p->next = $q; //把插入当前元素的前一个元素的指向域指向新建结点
return 1;
}
//删除节点
public function delete($i) {
$p = $this->head;
$j = -1;
while($p->next != null && $j < $i-1) { //循环到要插入元素的位置的前一个元素。
$p = $p->next;
$j++;
}
if($j != $i-1) {
echo "False";
}
$p->next = $p->next->next;
return 1;
}
}
echo "<br/><br/>:链式结构<br/>";
$table = new Nohead;
$table->insert(0,1);
$table->delete(0);
echo $table->getNum()."<br/>";
$p = $table->head;
while($p->next != null) {
echo $p->dateType."<br/>";
$p = $p->next;
}