标签:
线性表的特点是除第一个元素和最后一个数据元素外,每个数据元素只有一个前驱元素和一个后继元素。线性表的是一种最简单的线性结构,线性表的操作特点是可以在任意位置插入和删除一个数据元素。线性表可以使用顺序结构和链式结构存储。用顺序存储结构实现的线性表称为顺序表,用链式结构实现的线性表称为链式表,链式表有单链表,循环单链表双链表
线性表的顺序存储及实现:
在C语言中,实现线性表的顺序存储最好的办法是用数组,数组可以申请一组连续的空间地址。
线性表的抽象数据类型:
数据集合 a={sf,sdf,sdf,23,23,}
数据操作集合:
添加,删除,查找,初始化线性表,当前元素个数
线性表的实现:
<?php
/**
*
*线性表的实现
*/
header(‘Content-type: text/html;charset=utf-8‘);
class table {
public $size = 0; //元素个数而非数组大小
public $arr = array();
public $maxsize = 10;
public function __construct($arr=array()) {
$this->arr = $arr;
$this->size = count($arr);
}
/**
*插入位置,插入内容
*/
public function add($index,$str) {
if($this->size == $this->maxsize) { echo ‘已经插满‘;return false;}
else if($index < 0 || $index > $this->size) {
echo ‘插入位置不合法‘;return false;
}else{
/**为插入前做准备
*数组加一位,并且把数组依次后移替换值
*/
for($i=$this->size;$i>$index;$i--) {
$this->arr[$i] = $this->arr[$i-1];
}
$this->arr[$index] = $str;
$this->size++;
return;
}
}
public function delete($index) {
if($this->size <= 0) {
echo ‘当前为空‘;
return false;
}else if($index < 0 || $index > $this->size) {
echo ‘无数据可shanc‘;return false;
}else{
for($i= $index;$i<= $this->size -2;$i++) { //数据前移
$this->arr[$i] = $this->arr[$i+1];
}
unset($this->arr[$this->size-1]); //删除最后数据及特殊数据
$this->size--;
}
}
}
$table = new table(array(7));
$table->add(0,3);
print_r($table->arr);
/**
*链式存储结构存储线性表数据元素的方法,是把存放数据元素的节点用指针域构造成链。指针指向物理存储单元的地址变量。根据指针域的不同和节点构造不同可以分为单链表,单循环链表,双链表。
在链式存储结构中,每当插入时需要动态申请地址空间,因此在内存地址上空间链式是不相连的。
*
*/
class listtable {
public $n;
public $firest;
public $end;
public function __construct() {
$this->firest = new Node;
$this->firest->content = null;
$this->firest->next = null;
$this->n=0;
}
public function size() {
$this->n=0;
for($i = $this->firest->next;$i!=null;$i=$i->next){
$this->n++;
}
return $this->n;
}
public function add($index,$content) {
$size = $this->size();
if($index == 1) {
$oldfirest = $this->firest;
$this->firest = new Node;
$this->firest->content = $content;
$this->firest->next = $oldfirest;
$this->n++;
return true;
}
$p = $this->firest;
$j = 1;
$pre = $index-1;
while($p->next != null && $j < $pre) {//将链表位置至于删除位置前一个位置
$p = $p->next;
$j++;
}
if($j != $pre) {
return false;
}
$q = new Node;
$q->content = $content;
$q->next = $p->next;
$p->next = $q;
$this->n++;
return true;
}
public function delete($index) {
if($index == 1) {
$this->firest = $this->firest->next;
$this->n--;
}
$p = $this->firest;
$j = 1;
$pre = $index - 1;
while($p->next != null && $j < $pre){ //将链表位置至于删除位置前一个位置
$p = $p->next;
$j++;
}
if($j != $pre) {
return false;
}
$p->next = $p->next->next;
$this->n--;
}
}
class Node{
public $content;
public $next;
}
$listtable = new listtable;
$listtable->add(1,80);
$listtable->add(1,79);
$listtable->add(1,78);
echo $listtable->size().‘<br/>‘;
$listtable->add(4,10);
echo $listtable->size().‘<br/>‘;
$p = $listtable->firest;
while($p->next != null){
echo $p->content.‘<br/>‘;
$p = $p->next;
}
$listtable->delete(4);
$p = $listtable->firest;
while($p->next != null){
echo $p->content.‘<br/>‘;
$p = $p->next;
}
实现任意插入链表和删除的链表的做好方式是做双向链表。
标签:
原文地址:http://www.cnblogs.com/phplhs/p/4334070.html