昨天自己在网上找了些教程把C语言的顺序表简单的实现了,完成了之后我就想数据结构是凌驾于所有语言之上的,既然C语言能实现顺序表那么java能不能写呢,想到这儿我就开始赶工敲java代码了,但是当我下手开始写时就发现自己无从下手,因为我用C写时主要是运用了结构体和指针,但是java这两个东西都没有,于是我开始查询各种网络资料来解决这两个问题。
java没有结构体的问题:
其实java中的类(class)结构就是C语言中结构体(struct)的扩展,不过不是简单的扩展,java的类结构相对C语言中的结构体多了在类里创建函数还有类与类之间各种关系等操作,java的类能实现结构体的大部分操作,但是java中的类 != C语言的结构体。
同时还有需要注意的是C语言中的结构体中的数据可以在main函数和其他文件里直接被访问(当然不同的文件得先在头文件里声明一下文件名),那就说明C语言里结构体的数据访问类型为public类型的,当然我们写的java数据一般都为private类型的用来保护数据,但是具体情况具体分析咱们实现个简单的顺序表用不了外包所以我就用protected类型的来设置java的Sqlist类中数据,因为protected类型可以在同一类里,子孙类还有同一包里被访问,包外不能访问。
具体代码:
public class Sqlist {
protected int[] data;
protected int last;//数组的下标
public Sqlist() {
super();
}
public Sqlist(int i) {
super();
this.data = new int[i];
}
}
java中没有指针:
变量的内存原理:
这一部分我会讲的比较细,要想彻底明白指针我就得先从变量开始讲,我们刚接触一种语言时可能大部分人会觉得变量里储存的就是参数,比如int a = 2; 有很多初学者就会认为把2赋值给a,a里面储存的就是2了,其实从内存机制来讲,当我们int a,声明一个变量a时实质是内存空间分配了一个空间并把变量a指向了这个空间的地址,当你对a进行操作时其实也就是对这个空间地址里的数据进行了操作,我下面用一个图片来做详细解释:
java引用的内存原理:
java虽然没有指针但是用引用,引用的实质就是指针,只是相比指针受控,安全很多,也就是说引用不能像指针一样用指针对访问内存进行操作。
什么是引用?引用就是把一个变量指向一个对象,而此时这个指向对象的变量就是引用变量,例如:A a = new A(); 此时的a就是引用变量,它指向了对象A,也可以说a引用了一个A对象,我们可以通过对操作a来操作A对象,而a里储存是对象A的地址。下面我用一个图来加强解释:
说了这么多,也就是说当咱们用引用变量对内存里的数据进行操作时,就相当于是在用指针,不同的是引用不能像指针一样直接对地址进行操作。
对顺序表难的功能解释:
我再把顺序表的难点给说说,这里我不做详细的解释了,都用图片来解释怎么实现的,图片更加简单明了。
插入元素
//插入元素
public int InsertList(Sqlist L,int data,int no){
int tempNo = L.last;
if(no<0||no>=1024){
System.out.println("插入的数据超如的表的范围!");
return 0;
}else if(L.last>=1024){
System.out.println("空间不足!");
return 0;
}
while(tempNo+1!=no-1){
L.data[tempNo+1] = L.data[tempNo];
tempNo--;
}
L.data[no-1] = data;
L.last++;
return 0;
}
删除元素
//删除元素
public int DeleteList(Sqlist L,int no){
if(no<=0||no>L.last+1){
System.out.println("你指定的删除位置超出了界限!");
return 0;
}else{
for(int i=no-1;i<L.last;i++)
L.data[i] = L.data[i+1];
L.last--;
return 0;
}
}
定位元素
//定位元素
public int LocateList(Sqlist L,int data){
int i = 0;
for(i=0;i<=L.last;i++){
if(L.data[i]==data)
return i+1;
}
return -1;
}
}
所有代码
Sqlist类
public class Sqlist {
protected int[] data;
protected int last;//数组的下标
public Sqlist() {
super();
}
public Sqlist(int i) {
super();
this.data = new int[i];
}
}
Oppertation类
public class Oppertation{
Scanner sc = new Scanner(System.in);
//创建表
public void CreateList(Sqlist L){
int tempNo = 1,tempData = 0;
do{
System.out.printf("请输入第%d个元素数据(输入为-1结束创建表):",tempNo);
tempData = sc.nextInt();
if(tempData!=-1){
L.data[tempNo-1] = tempData;
L.last = tempNo -1;
tempNo++;
}
}while(tempNo<=1024&&tempData!=-1);
}
//打印表
public void PrintList(Sqlist L){
int i;
for(i=0;i<=L.last;i++){
System.out.printf("%d ",L.data[i]);
}
System.out.printf("\n");
}
//清空表
public void ClearList(Sqlist L){
L.last = -1;
}
//获取表中某一位置数据
public int GetList(Sqlist L,int no){
int tempData = L.data[no-1];
return tempData;
}
//表的长度
public int LengthList(Sqlist L){
int tempL = L.last+1;
return tempL;
}
//插入元素
public int InsertList(Sqlist L,int data,int no){
int tempNo = L.last;
if(no<0||no>=1024){
System.out.println("插入的数据超如的表的范围!");
return 0;
}else if(L.last>=1024){
System.out.println("空间不足!");
return 0;
}
while(tempNo+1!=no-1){
L.data[tempNo+1] = L.data[tempNo];
tempNo--;
}
L.data[no-1] = data;
L.last++;
return 0;
}
//删除元素
public int DeleteList(Sqlist L,int no){
if(no<=0||no>L.last+1){
System.out.println("你指定的删除位置超出了界限!");
return 0;
}else{
for(int i=no-1;i<L.last;i++)
L.data[i] = L.data[i+1];
L.last--;
return 0;
}
}
//定位元素
public int LocateList(Sqlist L,int data){
int i = 0;
for(i=0;i<=L.last;i++){
if(L.data[i]==data)
return i+1;
}
return -1;
}
}
MainSysetm类 // 主类
import java.util.Scanner;
public class MainSystem {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Sqlist L = new Sqlist(1024);
Oppertation List = new Oppertation();
List.CreateList(L);
List.PrintList(L);
//测试插入元素
int data,no;
System.out.println("请输入你要插入的数据(数据和插入的位置):");
data = sc.nextInt();
no = sc.nextInt();
List.InsertList(L, data, no);
List.PrintList(L);
//测试删除元素
System.out.println("你要删除第几个元素:");
no = sc.nextInt();
List.DeleteList(L, no);
List.PrintList(L);
//定位元素
System.out.println("输入你要定位的元素:");
data = sc.nextInt();
int locate = List.LocateList(L, data);
if(locate == -1)
System.out.println("你输入的元素不存在!");
else
System.out.printf("定位元素的位置为:%d",locate);
sc.close();
}
}