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]