欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

chapter02 SeqList

程序员文章站 2022-03-05 12:17:47
...

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

2.线性表

2.1线性表的定义

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

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

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

chapter02 SeqList

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

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

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

chapter02 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 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时停止。

    chapter02 SeqList

    整个动态过程可以如下图所示:
    chapter02 SeqList

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

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

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

chapter02 SeqList

整个动态过程如下图:
chapter02 SeqList

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)

chapter02 SeqList

完整版的代码:

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();

    }
}