<?php
/**
* 线性表相关操作
*/
class ListOperation
{
public $list = null;
public function __construct() {
$this->list = array();
}
// 初始化线性表
public function InitList($len) {
$this->list = array_fill(0, $len, 0);//在C中 这里应该通过申请内存并赋值来实现
}
// 判断给定的链表是否为空
public function ListEmpty() {
return empty($this->list);
}
// 清空链表
public function ClearList() {
$this->list = array();//在C中这里应该释放内存资源
}
// 返回表长
public function ListLength() {
return count($this->list);
}
// 获取指定元素
public function GetElem($index, $e) {
$e = $this->list[$index];
}
// 在链表中查找指定元素的位置
public function LocateElem($target) {
foreach ($this->list as $key => $value) {
if ($value == $target) {
return $key;
}
}
return -1;
}
// 在链表中指定位置插入新元素
public function ListInsert($index, $value) {
// 判断范围
if ($index < 0 || $index > $this->ListLength($this->list)) {
return false;
}
if ($index == 0) {
array_unshift($this->list, $value);
return true;
}
if ($index == $this->ListLength($this->list)) {
array_push($this->list, $value);
return true;
}
for ($i=$this->ListLength($this->list) - 1; $i >= $index - 1; $i--) {
$this->list[$i + 1] = $this->list[$i]; //将前面的元素向后移动
}
$this->list[$index] = $value;
return true;
}
// 删除第i个位置元素 并用deleteValue返回其值
public function ListDelete($index, &$deleteValue) {
if ($index < 0 || $index > $this->ListLength($this->list)) {
return;
}
if ($index == $this->ListLength($this->list) - 1) {
unset($this->list[$index]);
return true;
}
$deleteValue = $this->list[$index];
for ($i=$index; $i < $this->ListLength($this->list) - 1; $i++) {
$this->list[$i] = $this->list[$i + 1]; // 全部向前移动一个位置
}
unset($this->list[$this->ListLength($this->list) - 1]);//删除后面多余的一个元素 使得链表整体长度减一
return $deleteValue;
}
}
$listObj = new ListOperation();
$listObj->InitList(10);
print_r($listObj->ListInsert(3, 44));
print_r($listObj->ListInsert(4, 33));
print_r($listObj->ListInsert(0, 1));
print_r($listObj->ListDelete(5, $deleteValue));
print_r($listObj->list);
print_r($deleteValue);
线性表的优缺点
优点
因为线性表使用的是连续的内存空间,所以存(改)和读的时间复杂度为O(1),适合存储数量固定的内容
如果插入和删除的元素为表中最后一个位置,那么时间复杂度仍然为O(1)
缺点
插入和删除的时间复杂度为O(n),不适合存储频繁删除和插入的内容