一、实验目的和要求
理解和掌握线性表的概念、存储结构及操作要求,体会顺序和链式两种存储结构的特点;根据操作的不同要求,选择合适的存储结构,设计并实现算法,对算法进行时间复杂度和空间复杂度分析。通过实现对线性表各种操作的算法设计,达到掌握数据结构的研究方法、算法设计和分析方法的目的。
熟练运用JAVA语言实现数据结构设计和算法设计,了解程序运行过程中出现的各种错误。不仅要掌握再MyEclipse等集成开发环境中编辑、编译和运行程序的基本技能,还要掌握设置断点、单步运行等程序调试技术,及时发现错误,针对不同的错误,采取不同的手段进行处理。
二、实验题目
1, 比较相等equals(Object obj)
2,返回子表SinglyList<T> subList(begin, end)
三、实验方法与步骤(需求分析、算法设计思路、流程图等)
先创建单链表结点类,需要一个数据域存储数据,和一个地址域引用后继结点。
然后创建单链表类,增加头结点。实现插入删除元素等基本功能,其中返回子表方法为:先创建一个空的单链表,并创建一个指针指向这个新链表头结点,创建另一个指针指向当前链表,移动到begin处开始向新链表拷贝数据,一直到end为止,最后返回新链表。
运用到深拷贝,复制一个新的单链表,equals方法比较两条单链表是否相等,令p,q分别指向两条链表头结点的下一个结点,遍历比较两个结点的数据域是否相等。Sublist方法用插入的方式取出子表,先建一个新的单链表,p指向头指针进行遍历,设定子表头尾为begin和end最后将p得到的begin到end数据插入新的sublist单链表内。
四、实验原始纪录(源程序、数据结构等)
package unit2;
public class Node<T>
{
public T data;
public Node<T>next;
public Node(T data,Node<T>next)
{
this.data = data;
this.next = next;
}
public Node()
{
this(null,null);
}
public StringtoString()
{
return this.data.toString();
}
}
package unit2;
public class SinglyList<T extends Comparable<?super T>> extends Object
{
public Node<T> head;
public SinglyList()
{
this.head=new Node<T>();
}
public SinglyList(T[] values) //构造单链表,values数组提供元素
{
this();
Node<T> rear=this.head; //rear指向最后一个结点
for(int i=0;i<values.length;i++)
{
rear.next=new Node<T>(values[i],null);
rear=rear.next; //rear指向新的链尾结点
}
}
public boolean isEmpty() //判断单链表是否为空
{
return this.head.next==null;//返回单链表所有元素的描述字符串,形式为"(,)"。覆盖Object类中的toString()方法
}
public T get(int i)
{
Node<T>p=this.head.next;
for (int j=0;p!=null&&j<i;j++)
p=p.next;
return(i>=0&&p!=null)?p.data:null;
}
public void set(int i,T x)
{
if(x==null)
throw newNullPointerException("x==null");//抛出空对象异常
Node<T>p=this.head.next;
for(int j=0;p!=null&&j<i;j++)//遍历寻找第i个结点(p)
p=p.next;
if(i>=0&&p!=null)
p.data=x;//p指向第i个结点
else throw newIndexOutOfBoundsException(i+"");//抛出序号越界异常
}
public StringtoString()
{
String str=this.getClass().getName()+"(";
for(Node<T> p=this.head.next; p!=null; p=p.next)//p遍历单链表
{
str += p.data.toString();
if(p.next!=null)
str += ",";
}
return str+")";
}
public int size() //返回链表长度
{
int i=0;
for(Node<T> p=this.head.next;p!=null;p=p.next)//p遍历单链表
i++;
return i;
}
publicNode<T>insert(int i,T x)
{
if(x==null)
throw newNullPointerException("x==null");
Node<T> front=this.head; //front指向头结点
for(int j=0;front.next!=null&&j<i;j++)//寻找第i个结点或者第i-1个结点
front=front.next;
front.next=new Node<T>(x,front.next);//front之后插入为x的结点
return front.next;
}
public Node<T>insert(T x)
{
return insert(Integer.MAX_VALUE,x);
}
public T remove(int i)
{
Node<T> front=this.head;
for(int j=0;front.next!=null&&j<i;j++)
front=front.next;
if(i>0 && front.next!=null);//后继存在就删除
{
T old = front.next.data;
front.next= front.next.next;
return old;
}
}
public void clear()
{
this.head.next=null;
}
publicNode<T>search (T key)
{
for(Node<T> p=this.head.next;p!=null;p=p.next)
if(key.equals(p.data))
return p;
return null;
}
public boolean contains(T key)
{
return this.search(key)!=null;
}
publicSinglyList(SinglyList<T> list)//深拷贝
{
this();
Node<T> rear=this.head;
for(Node<T> p=list.head.next;p!=null;p=p.next)
{
rear.next=new Node<T>(p.data,null);
rear=rear.next;
}
}
//判断
public boolean equals(Object obj)//比较两条单链表是否相等
{
if(obj==this)
return true;
if(!(obj instanceofSinglyList<?>))
return false;
Node<T> p=this.head.next;
Node<T> q=((SinglyList<T>)obj).head.next;
while(p!=null&&q!=null&&p.data.equals(q.data))
{
p=p.next;
q=q.next;
}
return p==null&&q==null;
}
publicSinglyList<T> subList(int begin,int end)//取出子表
{
SinglyList<T> sublist = newSinglyList<T>();
Node<T> p=this.head;
if(end>=this.size())
throw newjava.lang.IndexOutOfBoundsException();
else
for(int j=0;p!=null&&j<this.size();j++)
{
p=p.next;
while(j>=begin-1&&j<end)
{
sublist.insert(p.data);//尾插入
break;
}
}
return sublist;
}
public static void main(String args[])
{
//String[] str1= {"a","b","c"};
//SinglyList l1= new SinglyList(str1);
//System.out.println(l1.toString());
Integer[]values={8,7,2,6,3}; //自动将int包装成Integer实例
SinglyList<Integer> list1 = new SinglyList<Integer>(values);
list1.insert(1,10); //调用insert(i,x),单链表插入
list1.insert(2); //调用insert(x),单链表尾插入,将int包装成Integer实例
System.out.println("list1="+list1.toString());
System.out.println("sublist="+list1.subList(2,4).toString());
SinglyList<Integer>list2 = new SinglyList<Integer>(list1); //深拷贝
System.out.print("list2="+list2.toString());
System.out.println(",list1.equals(list2)?"+list1.equals(list2));
//System.out.println("sublist="+list1.subList(2,4).toString());
}
}
五、实验结果及分析(计算过程与结果、数据曲线、图表等)