数据结构 (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;
}

 实现任意插入链表和删除的链表的做好方式是做双向链表。

posted on 2015-03-16 21:42  木子牛  阅读(465)  评论(0编辑  收藏  举报

导航