线性表是存储顺序牌类的数据时最常用的数据结构。
实现线性表有两种方式。第一种是使用数组存储线性表的元素。数组是动态创建的。超过数组的容量时,创建一个
新的更大的数组,并且将当前数组中的元素复制到新建的数组中。另一种方法是用链表结构实现。链表由节点组成,每
个结点都是动态生成的,用来存储一个元素。所有的结点连接成一个线性表。
对于线性表的主要操作有:
1、提取线性表的元素
2、在线性表中插入一个新元素
3、从线性表中删除一个元素
4、获取线性表中元素的个数
5、查找线性表中是否包含某个元素
6、判断线性表是否为空
下面这个接口类定义了常用的操作。
1 package com.ezreal; 2 3 4 public interface ListIntf { 5 /** 6 * 返回表长度 7 * @return 8 */ 9 public int size(); 10 11 /** 12 * 增加元素 13 * @param obj 14 */ 15 public void add(Object obj); 16 /** 17 * 重置为空表 18 */ 19 public void clear(); 20 /** 21 * 判断是否为空 22 * @return 23 */ 24 public boolean isEmpty(); 25 /** 26 * 第i个数据元素的值 27 * @param i 28 * @return 29 */ 30 public Object get(int i); 31 /** 32 * 返回第一个这个元素的位置 33 * @param obj 34 * @return 35 */ 36 public int indexOf(Object obj); 37 /** 38 * 返回这个元素的前驱 39 * @param obj 40 * @return 41 */ 42 public Object getPre(Object obj); 43 /** 44 * 返回这个元素的后继 45 * @param obj 46 * @return 47 */ 48 public Object getNext(Object obj); 49 /** 50 * 第i个位置插入新的元素对象 51 * @param obj 52 * @param i 53 */ 54 public void insertElementAt(Object obj ,int i); 55 /** 56 * 删除第i个元素 57 * @param i 58 * @return 59 */ 60 public Object remove(int i); 61 /** 62 * 删除数据元素obj,并返回这个元素的值 63 * @param obj 64 * @return 65 */ 66 public Object remove(Object obj); 67 }
接下来用数组实现线性表。数组的类型是Object类型,所以,数组中每个元素实际元素存储的是对象的。
1 package com.ezreal; 2 3 public class SqList implements ListIntf { 4 final int maxlen = 1000; 5 Object v[] = new Object[maxlen]; 6 int len = 0; 7 8 public SqList() { 9 10 } 11 12 @Override 13 public void add(Object obj) { 14 if(len == maxlen){ 15 System.out.println("溢出"); 16 }else{ 17 v[len] = obj; 18 len++; 19 } 20 } 21 22 @Override 23 public int size() { 24 return len; 25 } 26 27 @Override 28 public void clear() { 29 30 len =0; 31 } 32 33 @Override 34 public boolean isEmpty() { 35 36 if(len == 0){ 37 return true; 38 } 39 return false; 40 } 41 42 @Override 43 public Object get(int i) { 44 if(i<1 || i>len){ 45 System.out.println("获取元素位置不正确"); 46 }else{ 47 return v[i-1]; 48 } 49 return null; 50 51 } 52 53 @Override 54 public int indexOf(Object obj) { 55 for(int i=0;i<len;i++){ 56 if(v[i].equals(obj)){ 57 return i; 58 } 59 } 60 return -1; 61 } 62 63 @Override 64 public Object getPre(Object obj) { 65 int i = indexOf(obj); 66 if(i==-1){ 67 System.out.println("无该元素"); 68 }else if(i == 0){ 69 System.out.println("无前驱"); 70 }else{ 71 return v[i-1]; 72 } 73 74 return null; 75 } 76 77 @Override 78 public Object getNext(Object obj) { 79 int i = indexOf(obj); 80 if(i==-1){ 81 System.out.println("无该元素"); 82 }else if(i == len){ 83 System.out.println("无前驱"); 84 }else{ 85 return v[i+1]; 86 } 87 88 return null; 89 } 90 91 @Override 92 public void insertElementAt(Object obj, int i) { 93 if(len == maxlen){ 94 System.out.println("溢出"); 95 return; 96 }else { 97 if(i < 0 || i >len){ 98 System.out.println("插入位置不正确"); 99 return; 100 }else{ 101 for(int j=len-1;j>=i-1;j--){ 102 v[j+1]=v[j];//第i个元素和他后面的所有元素均后移一个位置 103 } 104 v[i-1]=obj; 105 len++; 106 return; 107 } 108 109 } 110 111 } 112 113 @Override 114 public Object remove(int i) { 115 Object obj; 116 if(i<1 || i>len){ 117 System.out.println("删除位置不正确"); 118 }else{ 119 obj = v[i-1]; 120 for(int j=i;j<len;j++){ 121 v[j-1]=v[j]; 122 } 123 len--; 124 return obj; 125 } 126 return null; 127 128 } 129 130 @Override 131 public Object remove(Object obj) { 132 int i=indexOf(obj); 133 if(i==-1){ 134 System.out.println("无该元素"); 135 }else { 136 remove(i+1); 137 } 138 139 return null; 140 } 141 142 }
如有不对的地方,请各位看官指出。