数据结构之静态链表
2015-09-07 15:25
459 查看
package org.list.cn; /*** * 静态链表 * 数组的元素有两个数据域(data cursor)data用来存放数据,cursor用来表示后继在数组中的下标 * 静态链表分为两部分(已经使用的空间单元和未使用的空闲单元),,删除操作就是把数据放置在空闲单元,cursor不指向这个数据 * @author zzg * */ public class StaticList { private Element[] link=null; //保存数据的数组 private int current=0; //下一个可用空闲容器的下标 private int head=0; //静态链表头的下标 private int length=0; // 当前链表的长度 private int maxSize=0; //链表的最大长度 class Element{ Object data; //存入的数据 int cursor; //下一个数据的下标 } public StaticList(int size) { // 初始化静态链表 link=new Element[size]; for(int i=0;i<size;i++){ link[i]=new Element(); link[i].data=-1; link[i].cursor=i+1; } current=0; head=0; length=0; maxSize=size; } public int add(Object obj){ if(length<maxSize){ link[current].data=obj; current=link[current].cursor; length++; return 0; //成功添加数据 }else{ return -1; //添加数据失败 } } /** * 从指定位置插入数据 * @param obj 准备插入的数据 * @param pos 准备插入的位置 * @return */ public int insert(Object obj,int pos){ if(length<maxSize && link!=null && pos<length &&pos>=0){ int iCurrent=current; current=link[current].cursor; //将currnet指向下一个空闲位置 if(pos==0){ //插入的位置在最前面 link[iCurrent].data=obj; link[iCurrent].cursor=head; head=iCurrent; }else if(pos==length-1){ //插入的位置在链表的末端 link[iCurrent].data=obj; //直接放入数据 }else{ //插入的位置的前后都存在数据单元 int preIndex=getTrulyIndex(pos-1); link[iCurrent].cursor=link[preIndex].cursor; link[iCurrent].data=obj; link[preIndex].cursor=iCurrent; } length++; return 0; } return -1; } public int delete(){ //删除当前链表的最后一个数据 if(length>0 && link!=null){ int temp=current; current=getTrulyIndex(length-1); link[current].cursor=temp;//只是将数据的下标执行空闲单元 length--; //将数据的长度-1 return 0; } return -1; } /*** * 删除指定位置的元素 * @param pos * @return */ public int delete(int pos){ if(length<maxSize && link!=null && pos<length &&pos>=0){ if(pos==0){ int iHead=head; head=link[head].cursor; link[iHead].cursor=current; current=iHead; }else if(pos==(length-1)){ int last=getTrulyIndex(pos); if(last!=-1){ link[last].cursor=current; current=last; } }else{ int preIndex=getTrulyIndex(pos-1); int temp=current; current=link[preIndex].cursor; link[preIndex].cursor=link[current].cursor; link[current].cursor=temp; } length--; return 0; } return -1; } /*** * 获取给定位置的下标 * @param position 给定的位置 * @return */ public int getTrulyIndex(int position){ int i=0; int iHead=head; if(link!=null){ while(i<position){ //循环到给定的位置,然后获取下标 iHead=link[iHead].cursor; i++; } if(i==position){ return iHead; } } return -1;//获取失败 } }
相关文章推荐
- AndroidStudy---数据结构中的树
- 数据结构实践——顺序表:两集合的交集
- 数据结构实践项目——顺序表
- 栈的基本操作
- 数据结构之线性表
- PTA数据结构5-1,5-2
- PTA数据结构与算法题目集(中文) 函数题(2)
- uva 11995 猜猜数据结构
- 数据结构之栈 C++实现
- ptree数据结构分析
- 算法导论基础篇:两个队列实现一个栈
- 数据结构之自建算法库——顺序表
- 数据结构中基本运算验证性实践路线建议——以顺序表为例
- 数据结构之---C语言实现直接插入排序
- 数据结构之---C语言实现选择排序
- 数据结构之---C语言实现冒泡排序
- 【数据结构】邻接表的3种常用表示方式——C++描述
- 数据结构基础 希尔排序 之 算法复杂度浅析
- 数据结构与算法
- 数据结构—再回首01