首页 > 编程语言 > 详细

顺序表的插入和删除、数组的增删改查和二分查找

时间:2018-02-14 23:14:05      阅读:247      评论:0      收藏:0      [点我收藏+]

1.顺序表的表示

为实现顺序表的操作,首先要将其表示出来,用同数据类型的数组和表示数组的长度的整型变量表示。

public class LineList{
    private int[] data;
    private int length;
    public LineList(){

    }
    public void setData(int[] data){
        this.data=data;
    }
    public void setLength(int length){
        this.length=length;
    }
    public int[] getData(){
        return (this.data);
    }
    public int getLength(){
        return (this.length);
    }
}
2.插入操作和程序实现
方法:由后至前将元素向后移动
例如:插入一个值为a的整型元素
public class LineList{
    private int[] data;
    private int length;
    public LineList(){

    }
    public void setData(int[] data){
        this.data=data;//回忆this的用法
    }
    public void setLength(int length){
        this.length=length;
    }
    public int[] getData(){
        return (this.data);
    }
    public int getLength(){
        return (this.length);
    }
}
public boolean insert(int i, int a){//位置和元素的定义
    int j;//表长度
    if (length>=data.length) {
        System.out.println("this table is overflow.");
        return false;
    }//判断表长度的,是否溢出
    if (i<0 || i>length) {
        System.out.println("this is position mistake."+i);
        return false;

    }//元素的位置要在表之内,不可以在没有元素的位置,比如中间断开的情况
    for (j=length-1;j>=i; j--) {
        data[j+1]=data[j];//??
        data[i]=a;
        length ++;//??
        return true;
    }
}

数组的定义、初始化、赋值

public class TestArray{
    public static void main(String[] args) {
        long[] arr=new long[] {2,3,4};
        //定义、初始化、赋值
        arr[0]=1;
        //如果数组已经有了值了,则以有的值为主,且将原值覆盖
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        //System.out.println(arr[3]);越界了,因为数组的长度是3

    }
}

面向对象编程方式

一、使用自定义类封装数组

 

 

//后期有必要,再做一下题目,巩固一下,

//你只是看着视频理解了一下

//敲了一下

MyArray{
    //封装一个数组
    private long[] arr;//(1)
    //有效数据的长度
    private int elements;
    //初始化为0,所以可以不用赋值,其实是在测试类中插入元素个数来确定的

    public MyArray(){
        arr=new long[50];//为(1)

    }
    public MyArray(int maxsize){
        arr=new long[maxsize];
    }
    //算是一个重载

    /*插入数据*/
    public void insert(long value){
        arr[elements]=value;
        elements++;
    }

    //显示数据  查一下API,display和insert是API里面应该有的,包装而成的
    /*当然也可能是自定义的,只是一个名称,真正的功能是函数体来实现的*/
    public void display(){
        System.out.print("[");
        for (int i=0;i<elements;i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.print("]");

    }

    /*用for循环来遍历,得到元素对应的索引号*/
    public int search(long value){
        int i;
        for (i=0;i<elements;i++) {
        if (value==arr[i]) {
                break;    
        }
        }
        if (i==elements) {
            return -1;
            //此时已经到了最后一个,还搜索不到的话则表示不存在,此时显示-1
            //看完一小节后,尝试着默一下,不要完全对着敲,效果不好。
        }
        else{
            return i;
        }
    }

    /*查找数据,根据索引来查*/
    public long get(int index){
        if (index>=elements||index<0) {
          throw new ArrayIndexOutofBoundsException();  
        }else{
            return arr[index];
        }
    }

    /*删除数据,即被删除的元素被覆盖,且有效长度减1*/
    public void delete(int index){
        if (index>=elements||index<0) {
           throw new ArrayIndexOutofBoundsException();

        }else{
            for (int i=index;i<elements;i++) {
              arr[index]=arr[index+1];
              //把后面的元素前移位  
            }
            elements--; 
            
        }
    }
    
    public void change(int index,int newvalue){
        if (index>=elements||index<0) {
           throw new ArrayIndexOutofBoundsException();

        }else{
            arr[index]=newvalue;
        }

    }
    
}
//后期有必要,再做一下题目,巩固一下,
//你只是看着视频理解了一下
//敲了一下
MyOrderArray{//修改添加方法,变成顺序插入数组
    //封装一个数组
    private long[] arr;//(1)
    //有效数据的长度
    private int elements;
    //初始化为0,所以可以不用赋值,其实是在测试类中插入元素个数来确定的

    public MyOrderArray(){
        arr=new long[50];//为(1)

    }
    public MyOrderArray(int maxsize){
        arr=new long[maxsize];
    }
    //算是一个重载

    //插入数据,顺序插入,如何顺序插入?必须由小到大
    public void insert(long value){
        int i;
        for(i=0;i<elements;i++){
            if (arr[i]>value) {
                break;
            }
        }for (int j=elements;j>i;j--) {
           arr[j]=arr[j-1]; 
        }//元素后移,且加一
        arr[i]=value;
        elements++;
    }

    //显示数据  查一下API,display和insert是API里面应该有的,包装而成的
    //当然也可能是自定义的,只是一个名称,真正的功能是函数体来实现的
    public void display(){
        System.out.print("[");
        for (int i=0;i<elements;i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.print("]");

    }

    //用for循环来遍历,得到元素对应的索引号
    public int search(long value){
        int i;
        for (i=0;i<elements;i++) {
        if (value==arr[i]) {
                break;    
        }
        }
        if (i==elements) {
            return -1;
            //此时已经到了最后一个,还搜索不到的话则表示不存在,此时显示-1
            //看完一小节后,尝试着默一下,不要完全对着敲,效果不好。
        }
        else{
            return i;
        }
    }

    //查找数据,根据索引来查
    public long get(int index){
        if (index>=elements||index<0) {
          throw new ArrayIndexOutofBoundsException();  
        }else{
            return arr[index];
        }
    }

    //线性查找和二分法查找(前提:顺序数组,从小到大,但问题是这个好像没有对其从小到大排序,且没有判断啊??)
    public int binarySeach(long value){
        int middle=0;//中间的值
        int low=0;//最左边的值
        int pow=elements;

        //为什么最大的等于有效数据elements??它表示有效数据的长度,而不是最大值啊??
        while(true){
            middle=(pow+low)/2;
            if(arr[middle]==value){
                return middle;
            }else if (low>pow) {
                return -1;
                //则表示不合理的
            }else{
                if(arr[middle]>value){
                    low=middle-1;
                    //往左边查找,这好像是以下标的方式为索引
                }else{
                    low=middle+1;
                    //往右查找
                }

            }
        }
    }

    //删除数据,即被删除的元素被覆盖,且有效长度减1
    public void delete(int index){
        if (index>=elements||index<0) {
           throw new ArrayIndexOutofBoundsException();

        }else{
            for (int i=index;i<elements;i++) {
              arr[index]=arr[index+1];
              //把后面的元素前移位  
            }
            elements--; 
            
        }
    }
    
    public void change(int index,int newvalue){
        if (index>=elements||index<0) {
           throw new ArrayIndexOutofBoundsException();

        }else{
            arr[index]=newvalue;
        }


    }
    
}


public class TestMyArray{
    public static void main(String[] args) {
        MyArray arr=new MyArray();
        arr.insert(13);//索引号0
        arr.insert(34);//索引号1
        arr.insert(90);//索引号2

        arr.display();
        System.out.println(arr.seach(34));
        System.out.println(arr.get(1));
        arr.delete(1);
        arr.display();
        arr.change(0,12);

        /*
        MyOrderArray arr=new MyOrderArray();
        arr.insert(90);
        arr.insert(30);
        arr.insert(80);
        arr.display();
        System.out.println(arr.binarySeach(90));
        */
    }

}
//运行结果
//[13 34 90]
//1
//34
//[13 90]

 

顺序表的插入和删除、数组的增删改查和二分查找

原文:https://www.cnblogs.com/shijinglu2018/p/8449036.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!