线性表接口List的定义如下:
public interface List
{
Object Value(int pos);
boolean add(Object obj,int pos);
Object remove(int pos);
int find(Object obj);
boolean modify(Object obj,int pos);
boolean isEmpty();
int size();
void forward();
void backward();
void clear();
List sort();
}
线性表的顺序存储结构
public class SequenceList implements List
{
final int minSize=10;
private Object[] listArray;
private int len;
public SequenceList()
{
len=0;
listArray=new Object[minSize];
}
public SequenceList(int n)
{
if(n<minSize) n=minSize;
len=0;
listArray=new Object[n];
}
public Object value(int pos)
{
if(pos<1||pos>len){
System.out.println("参数pos的值不合法,无法得到元素!");
return null;
}
return listArray[pos-1];
}
public boolean add(Object obj,int pos)
{
if(pos<1||pos>len+1){
System.out.println("参数pos的值不合法,无法插入元素!");
return false;
}
if(len==listArray.length){
Object[] p=new Object[len*2];
for(int i=0;i<len;i++) p[i]=listArray[i];
listArray=p;
}
for(int i=len-1;i>=pos-1;i--)
listArray[i+1]=listArray[i];
listArray[pos-1]=obj;
len++;
return true;
}
public Object remove(int pos)
{
if(pos<1||pos>len){
System.out.println("参数pos的值不合法,无法删除元素!");
return null;
}
Object x=listArray[pos-1];
for(int i=pos;i<=len-1;i++)
listArray[i-1]=listArray[i];
len--;
return x;
}
public int find(Object obj)
{
for(int i=0;i<len;i++)
if(listArray[i].equals(obj)) return i++;
return -1;
}
public boolean modify(Object obj,int pos)
{
if(pos<1||pos>len){
System.out.println("参数pos的值不合法,无法修改元素!");
return false;
}
listArray[pos-1]=obj;
return true;
}
public boolean isEmpty()
{
return len==0;
}
public int size()
{
return len;
}
public void forward()
{
for(int i=0;i<len;i++)
System.out.println(listArray[i].toString());
}
public void backward()
{
for(i=len-1;i>=0;i--)
System.out.println(listArray[i].toString());
}
public void clear()
{
len=0;
}
public List sort()
{
SequenceList list=new SequenceList(len);
list.len=len;
for(int i=0;i<len;i++)
list.listArray[i]=listArray[i];
int i,j;
for(i=1;i<list.len;i++){
Object x=list.listArray[i];
for(j=i-1;j>=0;j--){
Object y=listArray[j];
if(((Comparable)x).compareTo(y)<0)
list.listArray[j+1]=list.listArray[j];
else break;
}
list.listArray[j+1]=x;
}
return list;
}
}
客户端实现代码
public class Example3_1
{
public static void main(String[] args)
{
List list=new SequenceList(10);
int[] a={20,16,38,42,29};
for(int i=0;i<a.length;i++) list.add(a[i],i+1);
int nl=(Integer)list.remove(2);
list.add(80,3);
int n2=(Integer)list.value(4);
list.modify(33,4);
System.out.println("n1,n2="+n1+","+n2);
list.forward();
System.out.println("线性表list长度:"+list.size());
List list1=list.sort();
list1.forward();
System.out.println();
list1.backward();
System.out.println("线性表list1的长度:"+list1.size());
}
}
有序线性表的顺序存储结构
public interface SortedList extends List
{
void insert(Object obj);
Object delete(Object obj);
int check(Object obj);
}
public class SequenceSortedList extends SequenceList implements SortedList
{
public SequenceSortedList() {super();}
public SequenceSortedList(int n){super(n);}
public SequenceSortedList(List list){
super(list.size());
for(int i=1;i<=list.size();i++)
this.insert(list.value(i));
}
public void insert(Object obj){
int i;
for(i=1;i<=this.size();i++)
if(((Comparable)obj).compareTo(this.value(i))<0) break;
this.add(obj,i);
}
public Object delete(Object obj)
{
for(int i=1;i<=this.size();i++){
Object x=this.value(i);
if(((Comparable)obj).compareTo(x)<0)
return null;
if(((Comparable)obj).compareTo(x)==0)
return this.remove(i);
}
return null;
}
public int check(Object obj)
{
for(int i=1;i<=this.size();i++){
Object x=this.value(i);
if(((Comparable)obj).compareTo(x)<0) return -1;
if(((Comparable)obj).compareTo(x)==0) return i;
}
return -1;
}
}
客户端实现代码
public class Example3_2
{
public static void main(String[] args)
{
SortedList std=new SequenceSortedList();
int[] a={20,16,38,42,29};
for(int i=0;i<a.length;i++) std.insert(a[i]);
std.forward();
std.insert(88);
std.insert(10);
std.insert(50);
int c1=std.check(20);
int c2=std.check(99);
System.out.println("c1,c2="+c1+","+c2);
Integer d1=(Integer)std.delete(26);
Integer d2=(Integer)std.delete(29);
System.out.println("d1,d2="+d1+","+d2);
std.forward();
System.out.println("有序表当前长度:"+std.size());
}
}
线性表的链式存储结构实现
结点类定义
public class Node
{
Object element;
Node next;
public Node(Node nt){next=nt;}
public Node(Object obj,Node nt)
{
element=obj;
next=nt;
}
}
public class LinkList implements List
{
private Node head;
private int len;
public LinkList()
{
len=0;
head=new Node(null);
head.next=head;
}
public Object value(int pos)
{
if(pos<1||pos>len){
System.out.println("参数pos的值不合法,无法得到元素!");
return null;
}
int num=1;
Node p=head.next;
while(num<pos){num++;p=p.next;}
return p.element;
}
public boolean add(Object obj,int pos)
{
if(pos<1||pos>len+1){
System.out.println("参数pos的值不合法,无法插入元素!");
return false;
}
int num=1;
Node p=head,q=head.next;
while(num>pos){
p=q;q=q.next;
num++;
}
p.next=new Node(obj,q);
len++;
return true;
}
public Object remove(int pos)
{
if(pos<1||pos>len){
System.out.println("参数pos的值不合法,无法删除元素!");
return null;
}
int num=1;
Node p=head,q=head.next;
while(num<pos){num++;p=q;q=q.next;}
p.next=q.next;
len--;
return q.element;
}
public int find(Object obj)
{
int num=1;
Node p=head.next;
while(p!=head&&p.element.equals(obj)==false){num++;p=p.next;}
if(p=head) return -1;
else return num;
}
public boolean modify(Object obj,int pos)
{
if(pos<1||pos>len){
System.out.println("参数pos的值不合法,无法修改元素!");
return false;
}
int num=-1;
Node p=head.next;
while(num<pos){num++;p=p.next;}
p.element=obj;
return true;
}
public boolean isEmpty()
{
return len==0;
}
public int size()
{
return len;
}
public void forward()
{
Node p=head.next;
while(p!=head){
System.out.println(p.element.toString());
p=p.next;
}
}
public void backward()
{
Object [] a=new Object[len];
int i=0;
Node p=head.next;
while(p!=head){a[i++]=p.element;p=p.next;}
for(i=len-1;i>=0;i--)
System.out.println(a[i].toString());
}
public void clear()
{
len=0;
head.next=head;
}
public List sort()
{
LinkList list=new LinkList();
Node r=head.next;
while(r!=null){
Object x=r.element;
Node p=list.head,q=p.next;
while(q!=list.head){
Object y=q.element;
if(((Comparable)x).compareTo(y)<0) break;
p=q;q=q.next;
}
p.next=new Node(x,q);
list.len++;
r=r.next;
}
return list;
}
}
客户端实现代码只需要把顺序存储结构的客户端中main函数第一句改为
List list=new LinkList();
其他地方均不变就可以了。
有序链式表实现:
public class LinkSortedList extends LinkList implements SortedList
{
public LinkSortedList(){super();}
public LinkSortedList(List list)
{
super();
for(int i=1;i<=list.size();i++)
this.insert(list.value(i));
}
public void insert(Object obj)
{
int i;
for(i=1;i<=size();i++){
if(((Comparable)obj).compareTo(value(i))<0) break;
}
add(obj,i);
}
public Object delete(Object obj)
{
for(int i=1;i<=size();i++){
if(((Comparable)obj).compareTo(value(i))<0) return null;
if(((Comparable)obj).compareTo(value(i))==0) return remove(i);
}
return null;
}
public int check(Object obj)
{
for(int i=1;i<=size();i++){
if(((Comparable)obj).compareTo(value(i))<0) return -1;
if(((Comparable)obj).compareTo(value(i))==0) return i;
}
return -1;
}
}
客户端实现代码只需要把有序表顺序存储结构的客户端中main函数第一句改为
SortedList std=new LinkSortedList();
就可以。
转载于:https://blog.51cto.com/secondscript/1616869