链式存储结构之静态链表
1.静态链表
用数组代替指针来描述链表叫做静态链表。静态链表是为了给没有指针的高级语言设计的一种实现单链表能力的方法。首先让数组的元素都由两个数据域组成,data和cur,即数组的每一个下标都对应一个data和一个cur。
2.静态链表的初始化
静态链表的初始化如下图:
初始化静态链表的代码实现:
public static void initList(){ ArrayData[] array=new ArrayData[maxSize]; for(int i=0;i<maxSize-1;i++){ array[i]=new ArrayData(null,i+1); } array[maxSize-1]=new ArrayData(null,0); } class ArrayData{ Object data; int cur; public ArrayData(Object data,int cur){ this.data=data; this.cur=cur; } @Override public String toString() { return "ArrayData [data=" + data + ", cur=" + cur + "]"; } }
3.静态链表的插入操作
静态链表进行插入时,将需要插入的元素作为备用链表的第一个结点,插入时直接将备用链表的第一个结点作为待插入的结点进行插入。备用
在静态链表中第i个数据元素之前插入新的数据元素e,算法实现思路:
1. 首先判断i是否合法,即是否在链表长度范围之内;
2. 找到空闲分量的下标;
3. 将新的数据元素e赋值给空闲分量的data值;
4. 找到第i个数据元素的前一个元素的cur,并将其指向新的数据元素的cur;(插入的数据元素与第i个数据元素之后的元素相链接)
5. 将新数据元素的下标赋值给第i个数据元素前一个数据元素的cur;(插入的数据元素与第i个数据元素之前的数据元素相链接)
代码实现:
public static ArrayData[] insert(ArrayData[] arrays,int i,Object e){ if(i<1 || i>arrays.length+1){ System.out.println("i无效"); }else{ int j=maxSize-1; //获得空闲分量的第一个结点的下标 int k=arrays[0].cur; //将e赋值给空闲分量的data arrays[k].data=e; for(int l=1;l<=i-1;l++){ j=arrays[j].cur; } //第i个数据元素的前一个数据元素的cur,指向新的数据元素的cur arrays[k].cur=arrays[j].cur; //将新数据元素的下标赋值给第i个数据元素前一个数据元素的cur arrays[j].cur=k; arrays[0].cur=k+1; } return arrays; }
4.静态链表的删除
代码实现:
public static ArrayData[] delete(ArrayData[] arrays,int i){ if(i<1 || i>arrays.length){ System.out.println("i无效"); }else{ int j=maxSize-1; int k; for(k=1;k<=i-1;k++){ j=arrays[j].cur; } k=arrays[j].cur; arrays[j].cur=arrays[k].cur; //回收下标为i的结点 arrays[i].cur=arrays[0].cur; arrays[0].cur=i; } return arrays; }