zoukankan      html  css  js  c++  java
  • 顺序表的插入和删除、数组的增删改查和二分查找

    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++;
        }
    
        
        /*当然也可能是自定义的,只是一个名称,真正的功能是函数体来实现的*/
        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]
    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    C语言 strcat
    C语言 strncpy
    C语言 strcpy
    C语言 main
    可显示Android设备选择列表,并进入指定Android设备Console的Shell脚本
    Android系统如何录制屏幕(录制成mp4格式)
    据说有99%的人都会做错的面试题
    一道淘汰85%面试者的百度开发者面试题
    用Android模拟器也可以开发和测试NFC应用
    一道腾讯面试题的思考:到底谁会赢?
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/8449036.html
Copyright © 2011-2022 走看看