数据结构实验——线性表

一、实验目的和要求

理解和掌握线性表的概念、存储结构及操作要求,体会顺序和链式两种存储结构的特点;根据操作的不同要求,选择合适的存储结构,设计并实现算法,对算法进行时间复杂度和空间复杂度分析。通过实现对线性表各种操作的算法设计,达到掌握数据结构的研究方法、算法设计和分析方法的目的。

熟练运用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());

}

}

五、实验结果及分析(计算过程与结果、数据曲线、图表等)

猜你喜欢

转载自blog.csdn.net/weixin_45823684/article/details/128536535