chapter02 SeqList

本章学习线性表,线性表有顺序表和链表两种。重点应该放在链表上,因为顺序表用的比较少。

2.线性表

2.1线性表的定义

线性表是具有相同特性的数据元的一个有限序列,主要把握下面三点:

  • 所有数据类型是相同的
  • 线性表是由有限个数据元素构成的
  • 线性表中的数据元素与位置有关,每个数据元素都是唯一的序号。

其实逻辑结构比较容易理解:

一句话总结线性表的逻辑特征,就是:每个元素至多只有一个前趋元素,并且至多只有一个后继元素,这就是线性表的逻辑特征。

2.2线性表的顺序存储方式–顺序表

顺序表的逻辑非常好理解,Java和C#实现的代码大同小异。

图2-2

  • 创建一个对象
class SeqList {
   private final int Maxsize = 100;
   public String[] data;   //存放在顺序表中的元素
   public int length;      //存放顺序表的长度
   public SeqList()        //构造函数,实现了data和length的初始化
   {
       this.data = new String[Maxsize];
       this.length = 0 ;
   }
  • 创建顺序表
public void CreateSeqList(String[] split){   //创建一个线性表
       int i;
       for (i=0;i<split.length;i++)
           data[i] = split[i];
       length=i;
   }
  • 输出顺序表
public String DispList(){  //输出线性表
      int i;
      if (this.length > 0 ){
          String mystr = this.data[0];
          for (i=1;i<this.length;i++)
              mystr += " "+ data[i];
          return mystr;
      }
      else  return  "这是一个空串";
  }
  • 求顺序表的长度
public int ListLength(){  //返回线性表长度
        return this.length;
    }
  • 求顺序表中指定位置的元素
public String GetElem(int i){ //获取线性表中指定位置的元素
        if (i<1 || i>this.length)
            return null;
        String e = this.data[i-1];
        return e;
    }
  • 在线性表中指定位置插入元素

    在线性表中插入元素,为防止元素被覆盖,必须从最后一个开始往后移,每一个都往后移,直到j = i-1时停止。

    图2.3

    整个动态过程可以如下图所示:
    <图2.4.png

所以可以看出,这个算法的主要复杂度就体现在移动元素上,这就意味着它跟表的长度 n 有关,还跟插入的位置 i 有关。其复杂度的计算如下所示:

故计算复杂度为 O ( n ) O(n) O(n)

  • 删除顺序表中的指定元素

整个动态过程如下图:

public boolean ListDelete(int i,String e){
        int j;
        if (i<1||i>this.length)
            return  false;
        e = data[i];
        for (j = i-1; j<this.length-1;j++){
            data[j] = data[j+1];
        }
        this.length--;
        return  true;

        }

那么该算法的复杂度为 O ( n ) O(n) O(n)

完整版的代码:

package chapter02;
/*
author:Hopkin Lai
Created: 2020.0715
*/
//定义一个SeqList类来实现顺序表
class SeqList {
    private final int Maxsize = 100;
    public String[] data;   //存放在顺序表中的元素
    public int length;      //存放顺序表的长度
    public SeqList()        //构造函数,实现了data和length的初始化
    {
        this.data = new String[Maxsize];
        this.length = 0 ;
    }

    //下面就是线性表的基本运算算法
    public void CreateSeqList(String[] split){   //创建一个线性表
        int i;
        for (i=0;i<split.length;i++)
            data[i] = split[i];
        length=i;
    }
    public int ListLength(){  //返回线性表长度
        return this.length;
    }
    public String DispList(){  //输出线性表
        int i;
        if (this.length > 0 ){
            String mystr = this.data[0];
            for (i=1;i<this.length;i++)
                mystr += " "+ data[i];
            return mystr;
        }
        else  return  "这是一个空串";
    }
    public String GetElem(int i){ //获取线性表中指定位置的元素
        if (i<1 || i>this.length)
            return null;
        String e = this.data[i-1];
        return e;
    }
    public int LocateElem(String e){
        for (int i = 0 ;i<this.length;i++){
            if (this.data[i] == e)
                return i + 1;
        }
        return 0;   //未找到时返回0

    }
    public boolean ListInsert(int i, String e){
        int j;
        if (i<1||i>this.length+1)
            return  false;       //位置小于数组索引最小值或者溢出
        for (j=this.length;j>=i;j--){
            data[j] = data[j -1];
        }
        data[i-1] = e;
        length++;
        return true;
        }
        public boolean ListDelete(int i,String e){
        int j;
        if (i<1||i>this.length)
            return  false;
        e = data[i];
        for (j = i-1; j<this.length-1;j++){
            data[j] = data[j+1];
        }
        this.length--;
        return  true;
        }
        public void ClearList(){
        this.length = 0 ;
        }
    public static void main(String[] args){
        SeqList mySeqList = new SeqList();
        String[] arrlist = {"I","Love","China","Form","the","Bottom","Of","My","Heart"};
        mySeqList.CreateSeqList(arrlist);
        System.out.println(mySeqList.DispList());
        System.out.println(mySeqList.ListLength());
        System.out.println(mySeqList.GetElem(3));
        System.out.println(mySeqList.LocateElem("China"));
        mySeqList.ListInsert(2,"and You");
        System.out.println(mySeqList.DispList());
        mySeqList.ClearList();

    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值