数据结构 (1)----线性表
数据:就是人们根据文字符号,数字符号,及其他规定好的符号,来描述现实事务或是活动的抽象描述。
数据元素:就是现实的世界的某一个事物。
数据 的逻辑结构大致为三类:
数据元素直接的相互关系,又成为数据的逻辑结构。
1:线性结构:除了第一个元素和最后一个元素外,每一个元素都有一个前驱元素和后驱元素。
2:树型结构:除了跟节点,每一个元素都有一个前驱元素,可以有零个或是多个后驱元素。
3:图形结构:每一个节点都可以有零个或是多个前驱元素或是后驱元素。
数据的存储结构:
数据在计算机的中的存储方式成为数据存储结构,数据存储结构一般分为两种,顺序存储结构,链式存储结构。
顺序存储结构:指数据元素都是存储在一块连续的地址空间中,其特点是数据在逻辑的相邻的元素在物理存储结构上也相连,数据的逻辑关系表现在数据的存储关系上。如C中的数组。
结点:指针是指向物理存储单元地址的变量,我们把指针域和数据域组成的一个结构体成为节点。
链式结构:是使用指针把项目关联的结点链接起来。特点是逻辑上相邻的元素,在实际物理存储地址空间上不一定相连。数据逻辑结构是依靠指针的相互指向来实现。
数据结构:主要研究表,堆栈,队列,树,二叉树,图等常见的抽象数据类型。主要从他们的逻辑结构,存储结构,操作集合来研究讨论他们。
抽象数据类型:
类型是一组相同事物的集合。
数据类型:指一个类型和在这个类型的操作集合。如常见的编程语言的int 类型只能加减乘除。
抽象数据类型(ADT):指一个逻辑概念的类型和定义在这个类型的操作集合:如表,队列,树。
一般数据类型是指高级程序语言支持的数据类型,抽象数据类型指使用基本的数据类型来设计的数据类型,他们依靠于基本数据类型。
线性表:
主要操作特点是在表的任意位置插入和删除一个数据元素。线性表可以是顺序存储结构和链式存储结构,不同的存储结构实现起来不一样。
顺序结构的称为顺序表。
链式结构:单链表,循环单链表,双向循环链表。
线性表的特点是除第一个元素和最后一个数据元素外,每个数据元素只有一个前驱元素和一个后继元素。线性表的是一种最简单的线性结构,线性表的操作特点是可以在任意位置插入和删除一个数据元素。线性表可以使用顺序结构和链式结构存储。用顺序存储结构实现的线性表称为顺序表,用链式结构实现的线性表称为链式表,链式表有单链表,循环单链表双链表
线性表的顺序存储及实现:
在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;
}
实现任意插入链表和删除的链表的做好方式是做双向链表。