顺序表和链表<1>

1.线性表是具有相同特征的数据元素的有限序列常见的线性表:顺序表,链表,栈,队列,字符等

通常以数组或者链式存储。

 

                         单链表

 

                     双向链表

2.顺序表

 一般采用数组存储,在数组上实现增删改查

静态顺序表:使用定长数组存储。

动态顺序表:使用动态开辟的数组存储。

 3.动态顺序表支持的接口

public class SeqList {        

// 打印顺序表

public void display() {   }    

// 在 pos 位置新增元素    

public void add(int pos, int data) { }    

// 判定是否包含某个元素    

public boolean contains(int toFind) { return true; }    

// 查找某个元素对应的位置    

public int search(int toFind) { return -1; }    

// 获取 pos 位置的元素    

public int getPos(int pos) { return -1; }    

// 给 pos 位置的元素设为 value    

public void setPos(int pos, int value) {   }  

  //删除第一次出现的关键字key    

public void remove(int toRemove) {   }  

  // 获取顺序表长度    

public int size() { return 0; }    

// 清空顺序表    

public void clear(){}

}

 4.接口的底层实现

 ArrayList中的代码

import java.util.Arrays;
public class ArrayList {
    int[] elem;//来存储线性表
    int usedSize;//当前线性表的长度

    //构造方法
    public ArrayList(int capcity){
        elem=new int[5];
        usedSize=0;

    }

    //是否满了
    public boolean isFull(){
        if(usedSize==elem.length){
            return true;
        }
        return false;
    }

    // 进行拷贝
    public void resize(){
        elem= Arrays.copyOf(elem,elem.length*2);

    }

    // 在 pos 位置新增元素
    public  void add(int pos,int data){
        //插入位置必须合法
        if(pos<0||pos>usedSize){
            System.out.println("pos位置不合法");
        }
        //插入需要考虑插入位置和数组长度等于使用长度就满了插不了了,可以对数组长度扩充2倍
        if (isFull()){
            resize();
        }

        if(usedSize==elem.length){
            System.out.println("顺序表满了");
        }

        //插入可以把元素从后面开始依次移动
        for(int i=usedSize-1;i>=pos;i--){
            elem[i+1]=elem[i];

        }
        elem[pos]=data;//挪好后把数据放入需要插入的位置
        usedSize++;//数组的使用长度加1

    }

    // 打印顺序表
    public void display(){
        for(int i=0;i<usedSize;i++){
            System.out.println(elem[i]+"");
        }
        System.out.println();
    }

    // 判定是否包含某个元素
    public boolean contains(int toFind){
        //对其进行遍历,看有没有那个数
        for(int i=0;i<usedSize;i++){
            if (elem[i] == toFind) {
                return true;

            }
        }
        return false;
    }

    //查找某个元素对应的位置
    public int search(int toFind){
        //对其进行遍历,看有没有那个数,若有,返回那个数的下标
        for (int i = 0; i <usedSize ; i++) {
            if (elem[i]==toFind){
                return i;
            }
        }
        return -1;
    }

    // 获取 pos 位置的元素
    public int getPos(int pos){
        if(pos<0||pos>=usedSize){
            System.out.println("pos位置不合法");
            return -1;
        }
        return elem[pos];
    }

    // 获取顺序表长度
    public int size(){
        return usedSize;
    }

    //给pos位置设定value值
    public void setPos(int pos,int value) {
        if(pos<0||pos>usedSize){
            System.out.println("pos位置不合法");
            return;
        }
        elem[pos]=value;
    }

    //删除第一次出现关键字的位置
    public void remove(int toRemove){
        //1.找到toRemove 的位置
        int index=search(toRemove);
        if(index==-1){
            System.out.println("没有这个数字");
        }
        // 2.删除 int i=index;
        //删除只需要找到那个位置后,它后面的元素往前移动即可
        for (int i = index; i <usedSize-1 ; i++) {
            elem[i]=elem[i+1];
        }
        //删除元素后它的使用长度也会减1
        usedSize--;
    }
    
    //清空顺序表
    public void clear(){

        usedSize=0;
    }

}

TestArrayList中的代码:

注:测试我只是选了几个测试

public class TestArrayList {
    public static void main(String[] args) {
    //public void(int pos,int data)pos位置新增元素
     ArrayList myArrayList=new ArrayList(5);
     myArrayList.add(0,8);
     myArrayList.add(0,4);
     myArrayList.add(0,7);
     myArrayList.add(0,6);
     boolean t=myArrayList.isFull();
     System.out.println(t);
     myArrayList.display();
     myArrayList.add(1,5);
     myArrayList.add(3,9);
     myArrayList.display();
     boolean s=myArrayList.contains(9);
     System.out.println(s);


    }


}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值