循环双链表实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南京工程学院
实验报告
课程名称数据结构与算法实验实验项目名称线性表
实验学生班级软件工程161 实验学生姓名潘登
学号 202161024 实验时间 2017.11.2 实验地点图书馆A406
实验成绩评定
指导教师签字年月日
一、实验目的和要求
实验目的:验证教材中线性表链式存储结构的基本操作,设计并实现指定操作的算法,并做算法分析。

实验要求:①使用Java语言,采用泛型类;
②争取最佳的算法效率(一次遍历)。

所有算法不能调用size()求元素个数后再操作。

③各类的成员方法,不改变参数list引用的链表,插入结点等操作都是深拷贝。

④声明返回各类对象(如SinglyList<T>)的成员方法,不改变调用者(this),this深拷贝。

⑤讨论各链表浅拷贝与深拷贝的差别,画出示意图。

二、实验题目
2-145.void replaceAll(DoublyList<T>pattern,
DoublyList<T>list)//替换所有与pattern匹配的子表为list
三、实验方法与步骤(需求分析、算法设计思路、流程图等)
需求分析:
1.在target链表中寻找与pattern链表匹配的子联表
2.用list链表替换该子联表
3.过程简洁,效率高,一次遍历
算法设计思路:
先利用循环寻找到与pattern匹配的子联表,若无,则跳过该成员函数,若有,则以list链表为原型的循环双链表list2(构造循环双链表的效率更高),最后将list2整体替换子链(节省删除链表时间),同时list2变为空链表流程图:
四、实验原始纪录(源程序、数据结构等)
节点类
public class DoubleNode<T>
{
public T data;
public DoubleNode<T> prev,next;
public DoubleNode(T data,DoubleNode<T> prev,DoubleNode<T> next)//创建节点public DoubleNode()//创建空节点
public String toString()//输出节点元素
}
双链表类
public class DoublyList<T> extends DoubleNode<T>
{
public DoubleNode<T> head;//头结点
public DoublyList()//创建空链表
public boolean isEmpty()//判断是否为空
public int size()//长度 //以递归方式
{
return size(this.head.next);
}
private int size(DoubleNode<T> p)
{
if(p!=null)
return 1+size(p.next);
else
return 0;
}
public DoubleNode<T> insert(int i,T x)//中间插入
public DoubleNode<T> insert (T x)//尾插入
public String toString()//输出链表
}
循环双链表类
public class CirDoublyList<T> extends DoublyList<T>
{
public DoubleNode<T> head;
public CirDoublyList()//创建空链表
public CirDoublyList(DoublyList<T> list)//将list的数据拷贝到一个新的循环双链表
{
this.head=new DoubleNode<T>();
this.head.prev=this.head;
this.head.next=this.head;
DoubleNode<T> L=list.head.next;
while(L!=null)
{
insert(L.data);
L=L.next;
}
}
public boolean isEmpty()//判断是否为空
public int size()//长度以递归方式
private int size(DoubleNode<T> p)
public DoubleNode<T> insert(int i,T x)//中间插入
public DoubleNode<T> insert(T x)//尾插入
public void replaceAll(DoublyList<T> pattern, DoublyList<T> list)//用list 替换pattern
{
DoubleNode<T> T1=this.head.next;
DoubleNode<T> p=T1;
DoubleNode<T> q=pattern.head.next;
while(p!=this.head&&q!=null&&p.data.equals(q.data))//匹配pattern链表
{
p=p.next;
q=q.next;
}
if(q==null)
{
CirDoublyList<T> list2=new CirDoublyList<T>(list);//创建list的循环双链表
T1.prev.next=list2.head.next;
list2.head.next.prev=T1.prev;
p.prev=list2.head.prev;
list2.head.prev.next=p;
}
}
public String toString()//正序输出
public String toPreviousString()//反序输出
}
主函数类
import java.util.Scanner;
public class SeqMain
{
public static void main(String[] args)
{
CirDoublyList<String> target=new CirDoublyList<String>();
DoublyList<String> pattern=new DoublyList<String>();
DoublyList<String> list=new DoublyList<String>();
int i;
String ch;
System.out.print("请输入target链表:");
String str1=new Scanner(System.in).nextLine();
for(i=0;i<str1.length();i++)
{
ch=str1.substring(i, i+1);
target.insert(ch);
}
System.out.print("请输入pattern链表:");
String str2=new Scanner(System.in).nextLine();
for(i=0;i<str2.length();i++)
{
ch=str2.substring(i, i+1);
pattern.insert(ch);
}
System.out.print("请输入list链表:");
String str3=new Scanner(System.in).nextLine();
for(i=0;i<str3.length();i++)
{
ch=str3.substring(i, i+1);
list.insert(ch);
}
target.replaceAll(pattern, list);
System.out.println(target.toString());
}
}
五、实验结果及分析(计算过程与结果、数据曲线、图表等)
实验结果展示:
六、实验总结与思考
本实验是对链表的比较基础的运用(链表的查找,删除,插入)
以及熟悉递归算法,算法本身并不难实现,难点在于算法的效率要高,可读性要强,这也是所有代码需要注意的,要做到每个指针都尽到最大的利用。

相关文档
最新文档