收藏 分享(赏)

数据结构(Java版) 线性表的实现与应用完整版.doc

上传人:tangtianxu1 文档编号:2876873 上传时间:2018-09-29 格式:DOC 页数:30 大小:3.21MB
下载 相关 举报
数据结构(Java版) 线性表的实现与应用完整版.doc_第1页
第1页 / 共30页
数据结构(Java版) 线性表的实现与应用完整版.doc_第2页
第2页 / 共30页
数据结构(Java版) 线性表的实现与应用完整版.doc_第3页
第3页 / 共30页
数据结构(Java版) 线性表的实现与应用完整版.doc_第4页
第4页 / 共30页
数据结构(Java版) 线性表的实现与应用完整版.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

1、实 验 报 告课程名称 数据结构 实验项目 线性表的实现及应用 实验仪器 PC 机一台 学 院_ 专 业 班级/学号 姓名 实验日期 成 绩 指导教师 北京信息科技大学信息管理学院(数据结构课程上机)实验报告专业 : 班级 : 学号 : 姓名 : 成绩 : 实验名称 线性表的实现及应用 实验地点 实验时间1.实验目的:(1) 理解用顺序表实现线性表的特点;熟练掌握顺序表的基本操作;学会利用顺序表解决实际应用问题。(2) 熟练掌握单链表的使用;理解用链表实现线性表的特点;了解链表的多种形式;学会利用单链表解决实际应用问题。2.实验要求:(1) 学时为 8 学时;(2) 能在机器上正确、调试运行程

2、序;(3) 本实验需提交实验报告;(4) 实验报告文件命名方法:数据结构实验_信管 16xx_学号_姓名.doc 。3.实验内容和步骤:第一部分 顺序表的实现与应用(1)基于顺序表实现线性表的以下基本操作:public interface LList /线性表接口,泛型参数 T 表示数据元素的数据类型boolean isEmpty(); /判断线性表是否空int size(); /返回线性表长度T get(int i); /返回第 i(i 0)个元素void set(int i, T x); /设置第 i 个元素值为 xvoid insert(int i, T x); /插入 x 作为第 i

3、个元素void insert(T x); /在线性表最后插入 x 元素T remove(int i); /删除第 i 个元素并返回被删除对象int search(T key); /查找,返回首次出现的关键字为 key 的元素的位序void removeAll(); /删除线性表所有元素public String toString();/返回顺序表所有元素的描述字符串,形式为“(, ) ”要求:实现后应编写代码段对每个基本操作做测试。(2)顺序表的简单应用a) 运用基本操作编写算法删除第 i 个开始的 k 个元素。b) 编写高效算法删除第 i 个开始的 k 个元素。c) 将两个顺序表合并为一个顺

4、序表(表中元素有序) ;d) 若两个元素按值递增有序排列的顺序表 A 和 B,且同一表中的元素值各不相同。试构造一个顺序表 C,其元素为 A 和 B 中元素的交集,且表 C 中的元素也按值递增有序排列;(3)利用顺序表解决约瑟夫环问题:已知 n 个人(以编号 1,2,3.n 分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到 m 的那个人出列;他的下一个人又从 1 开始报数,数到 m 的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。要求:输出出列次序。第二部分 单链表的实现与应用(4)基于单链表实现线性表的以下基本操作(不需要建立接口,直接建立带头结点的单链表类):AD

5、T List boolean isEmpty(); /判断线性表是否空int size(); /返回线性表长度T get(int i); /返回第 i(i 0)个元素void set(int i, T x); /设置第 i 个元素值为 xNode insert(int i, T x); /插入 x 作为第 i 个元素Node insert(T x); /在线性表最后插入 x 元素T remove(int i); /删除第 i 个元素并返回被删除对象void removeAll(); /删除线性表所有元素Node search(T key); /查找,返回首次出现的关键字为key 元素publi

6、c String toString(); /返回顺序表所有元素的描述字符串,形式为“(, ) ”要求:实现后应编写代码段对每个基本操作做测试。(5)实现单链表的子类排序单链表,覆盖单链表如下方法:void set(int i, T x); /设置第 i 个元素值为 xNode insert(int i, T x); /插入 x 作为第 i 个元素Node insert(T x); /在线性表最后插入 x 元素Node search(T key); /查找,返回首次出现的关键字为 key 元素(6)基于排序单链表实现线性表的以下综合应用:e) 删除第 i 个开始的 k 个元素。f) 删除递增有序

7、单链表中所有值大于 mink 且小于 maxk 的元素。g) 将两个单链表合并为一个单链表,保持有序。h) 若两个元素按值递增有序排列的单链表 A 和 B,且同一表中的元素值各不相同。试构造一个单链表 C,其元素为 A 和 B 中元素的交集,且表C 中的元素也按值递增有序排列。要求利用原有链表中的元素。(7)一元多项式的基本运算用排序单链表表示一元多项式,并实现以下基本运算: 一元多项式的建立 一元多项式的减法运算(要求:在运算过程中不能创建新结点 即 A=A-B)(8)备份自己程序4.实验准备:复习教材第 2 章线性表的知识点熟悉 Java 编程环境提前熟悉实验内容,设计相关算法5.实验过程

8、:第一部分:(1)package ex1;public interface LList /线性表接口,泛型参数 T表示数据元素的数据类型boolean isEmpty(); /判断线性表是否空int length(); /返回线性表长度T get(int i); /返回第i(i0)个元素void set(int i, T x); /设置第i个元素值为xint insert(int i, T x); /插入x 作为第i 个元素int append(T x); /在线性表最后插入x元素T remove(int i); /删除第i个元素并返回被删除对象void removeAll(); /删除线性表

9、所有元素int search(T key); /查找,返回首次出现的关键字为 key的元素的位序类名:public class SeqList implements LList protected Object element;protected int n;public SeqList(int length) /构造容量为length的空表this.element = new Objectlength; /申请数组的存储空间,元素为null。/若 length=0 /插入在最后Object source = this.element; /数组变量引用赋值,source也引用element数组

10、if (this.n=element.length) /若数组满,则扩充顺序表的数组容量this.element = new Objectsource.length*2; /重新申请一个容量更大的数组for (int j=0; j=i; j-) /从i开始至表尾的元素向后移动,次序从后向前this.elementj+1 = sourcej;this.elementi = x;this.n+;return i; /返回x序号public int append(T x) /在线性表最后插入x元素return this.insert(this.n, x); public T remove(int i

11、)/删除第i个元素并返回被删除对象if (this.n0 /执行T类的toString()方法,运行时多态for (int i=1; i list=new SeqList(20);Integer values=10,1,2,3,4,5,6,7,8,9;SeqList list1=new SeqList(values);System.out.print(“输出顺序表:“);System.out.println(list1.toString();System.out.println(“顺序表List是否为空“+list.isEmpty()+“,List1是否为空 “+list1.isEmpty()

12、;System.out.println(“list的长度“+list.length()+ “,list1的长度“+list1.length();System.out.println(“返回list1 的第7个元素是:“ +list1.get(6);System.out.println(“重新设置第5个元素为 19:“);list1.set(4, 19);list1.insert(2, 100);list1.append(20);System.out.println(“删除8:“+list1.remove(8);System.out.print(“修改后的顺序表:“);System.out.pr

13、intln(list1.toString();list1.removeAll();System.out.println(“删除后的顺序表: “+list1.toString(); /为空System.out.println(“寻找元素50:“+list1.search(50);(2)a) package ex1;public class Del public Del(int i,int k)String values=“A“,“b“,“C“,“d“,“e“,“f“,“g“,“h“;int n =values.length;for(int j=0;j list=new SeqList(value

14、s);System.out.println(list.toString();for(int j=1;j list1=new SeqList(values1);Integer values2=2,4,5,22,23;SeqList list2=new SeqList(values2);SeqList list3=new SeqList();int i=0,j=0;while(i list1=new SeqList(values1);Integer values2=2,4,5,12,19,20,22,23,;SeqList list2=new SeqList(values2);SeqList li

15、st3=new SeqList();int i=0,j=0;while(ilist2.get(j)j+;else list3.append(list1.get(i);i+;j+;System.out.println(list1.toString();System.out.println(list2.toString();System.out.println(list3.toString();public static void main(String args)new Intersection(); 3. (1)package ex1;public class Josephus public

16、Josephus(int n, int k, int m) System.out.println(“Josephus(“+n+“,“+k+“,“+m+“),“);SeqList list = new SeqList(n);/创建顺序表实例,元素类型是数字字符,只能排到n=9,否则达不到效果for (int i=0; i1) /多于一个元素时循环,计数O(1)i = (i+m-1) % list.length(); /按循环方式对顺序表进行遍历,圆桌循环System.out.print(“出列“+ list.remove(i).toString()+“, “); /删除i 位置对象, O(n)/

17、 System.out.println(list.toString();System.out.println(“出列“+list .get(0).toString();/get(0)获得元素, O(1)public static void main(String args) new Josephus(9,1,3);(2)package test;import ex1.SeqList;public class JosephusA public JosephusA(int n, int k, int m) System.out.println(“Josephus(“+n+“,“+k+“,“+m+“

18、),“);SeqList list = new SeqList(n);/创建顺序表实例,元素类型是数字字符,只能排到n=9,否则达不到效果for (int i=0; i1) /多于一个元素时循环,计数O(1)i = (i+m-1) % list.length(); /按循环方式对顺序表进行遍历,圆桌循环System.out.print(“出列“+ list.remove(i).toString()+“, “); /删除i 位置对象, O(n)/ System.out.println(list.toString();System.out.println(“出列“+list.get(0).toSt

19、ring();/get(0)获得元素, O(1)public static void main(String args) new JosephusA(15,2,9);第二部分:(4) 、package ex2;public class Node public T data; /数据域public Node next; /地址域,后继结点/构造结点public Node(T data,Node next)this.data =data;this.next=next;/构造空结点public Node()this(null,null);/描述字符串public String toString()r

20、eturn this.data.toString();package ex2;public class SinglyList public Nodehead;/构造空单链表public SinglyList()head=new Node();/构造单链表,由 values数组数组提供元素public SinglyList(T values)this();Noderear=this.head;for(int i=0;i(valuesi,null);rear=rear.next;public boolean isEmpty() /判断线性表是否空return this.head.next =nul

21、l; public T get(int i) /返回第i(i0)个元素Nodep=head.next ;for(int j=0;p!=nullpublic void set(int i, T x) /设置第i个元素值为xif(x=null)throw new NullPointerException(“x=null“); /抛出空对象异常Nodep=this.head.next; /0for(int j=0;p!=nullpublic int size() /返回线性表长度int i=0;for(Nodep=this.head.next;p!=null;p=p.next)i+;return i

22、;public Node insert(int i, T x) /插入x作为第i个元素if(x=null)throw new NullPointerException(“x=null“);Nodefront=this.head ; /指定头结点for(int j=0;front.next!=nullreturn front.next;public Node insert(T x) if (x=null)throw new NullPointerException(“x=null“); /抛出空对象异常Node front=this.head; /front指向头结点for (; front.n

23、ext!=null;) /寻找第i-1个或最后一个结点(front 指向)front = front.next;front.next = new Node(x, front.next); /在front之后插入值为x结点,包括头插入、中间/尾插入return front.next;public T remove(int i) /删除第i个元素并返回被删除对象Nodep=this.head; /让p指向头结点for(int j=0;j search(T key) /查找,返回首次出现的关键字为key元素for(Node p =this.head;p.next!=null;p=p.next)if(

24、 key.equals(p.data)return p;return null;public String toString() /返回顺序表所有元素的描述字符串,形式为“(,)”String str=this.getClass().getName()+“(“; /返回类名for (Node p=this.head.next; p!=null; p=p.next)/p遍历单链表 str += p.data.toString();if (p.next!=null) str += “,“; /不是最后一个结点时,加分隔符return str+“)“; (5) 、package ex2;public

25、 class SortedSinglyList extends SinglyList/构造空排序单链表public SortedSinglyList()super(); /默认调用父类构造方法 SinglyList()public SortedSinglyList(SinglyList list)super(); /构造空单链表for (Node p=list.head.next; p!=null; p=p.next)/直接插入排序,每趟插入1个元素this.insert(p.data); /排序单链表按值插入/构造 ,将 values数组中的所有对象按值插入public SortedSing

26、lyList(T values)super();for(int i=0;i insert(int i, T x) /插入x作为第i个元素throw new UnsupportedOperationException(“set(int i, T x)“); /不支持父类方法,覆盖并抛出异常 public Node insert(T x) /在线性表最后插入x 元素Nodep=this.head;for(;p.next!=null)p=p.next;p.next = new Node(x, p.next);return p.next;public Node search(T key) /查找,返回

27、首次出现的关键字为 key元素for (Node p=this.head;p.next!=nullSystem.out.println( list.toString();for(int j=0;j list = new SortedSinglyList(values);System.out.println(list.toString();Node p=list.head;int j=0;while(p.next!=null Integer values2= 1,0,5,8,9;SortedSinglyList val2=new SortedSinglyList(values2);SortedS

28、inglyList val=new SortedSinglyList();int i=0;int j = 0;while(i /可相加接口,T表示数据元素的数据类型public void sub(T t); /+=加法,约定两元素相加规则public boolean removable(); /约定删除元素条件package Poly;/项类,一元多项式的一项,实现可比较接口和可相加接口public class TermX implements Comparable, Subible protected int coef, xexp; /系数,x指数(可为正、0 )public TermX(i

29、nt coef, int xexp) /构造一项this.coef = coef;this.xexp = xexp;public TermX(TermX term) /拷贝构造方法this(term.coef, term.xexp);/以 “系数x指数”的省略形式构造一元多项式的一项。/省略形式说明:当系数为1或-1且指数0 时,省略1,-1 只写负号“-”,如x2、-x3;/当指数为0时,省略x0,只写系数;当指数为1时,省略1,只写x。public TermX(String termstr) if (termstr.charAt(0)=+) /去掉+号termstr=termstr.sub

30、string(1);int i = termstr.indexOf(x);if (i=-1) /没有x,即指数为0this.coef = Integer.parseInt(termstr); /获得系数this.xexp = 0;else /有x,x 之前为系数,x之后为指数if (i=0) /以x开头,即系数为1this.coef = 1;elseString sub=termstr.substring(0,i); /x之前子串表示系数if (sub.equals(“-“) /系数只有-号,即系数为-1this.coef=-1;elsethis.coef = Integer.parseInt

31、(sub); /获得系数i = termstr.indexOf();if (i=-1)this.xexp=1; /没有,即指数为1elsethis.xexp = Integer.parseInt(termstr.substring(i+1);/获得指数/返回一元多项式的一项对应的“系数x指数”的省略形式字符串,省略形式说明同TermX(String)构造方法。public String toString() String str=this.coef0 ? “+“ : “-“; /系数的符号位if (this.xexp=0 | this.xexp0 /系数绝对值,省略系数1if (this.xe

32、xp0)str+=“x“; /指数为0时,省略x0,只写系数if (this.xexp1)str+=“+this.xexp; /指数为1时,省略1,只写 xreturn str;public int compareTo(TermX term) /按x 指数比较两项大小,实现Comparable接口if (this.xexp = term.xexp) /比较相等return 0; /比较规则与equals(Object)不同return this.xexp接口if (pareTo(term)=0)this.coef -= term.coef;elsethrow new IllegalArgume

33、ntException(“两项的指数不同,不能相减。“);public boolean removable() /若系数为0 ,则删除元素;实现Subible 接口return this.coef=0; /不存储系数为0 的项/比较两项是否相等,比较系数和指数,比较规则与compareTo(term)=0不同public boolean equals(Object obj)if (this=obj)return true;if (!(obj instanceof TermX)return false;TermX term=(TermX)obj; return this.coef=term.co

34、ef package Poly;import ex2.Node;import ex2.SortedSinglyList;public class PolySinglyList /创建空单链表public PolySinglyList(T terms) /构造方法,由项数组指定多项式各项值super(terms);public PolySinglyList(PolySinglyList list) /拷贝构造方法super(); /单链表深拷贝,复制所有结点,没有复制对象public void subAll(PolySinglyList list) /多项式相减,this-=list功能,不改变

35、listNode front=this.head, p=front.next;Node q=list.head.next;while (p!=null /两项相加,add()方法由Subible接口约定if (p.data.removable() /相加后元素满足删除条件 /removable()方法由Subible接口约定front.next=p.next; /相加后元素不需要存储,删除p 结点p=front.next;else front = p; /front是p的前驱结点p = p.next;q = q.next;else if (pareTo(q.data)(q.data, p);

36、/复制q结点并插入到front结点之后q = q.next;while (q!=null) /将list单链表中剩余结点复制并插入到当前链表尾front.next = new Node(q.data, null);front = front.next;q = q.next;package Poly;import ex2.Node;public class Polynomialprivate PolySinglyList list; /多项式排序单链表,TermX 表示一元多项式的一项public Polynomial() /构造方法this.list = new PolySinglyList(

37、); /创建空单链表,执行排序单链表默认构造方法public Polynomial(TermX terms) /构造方法,由项数组指定多项式各项值this.list = new PolySinglyList(terms);public Polynomial(String polystr) /构造方法,参数指定多项式表达式字符串 this();if (polystr=null | polystr.length()=0)return;Node rear = this.list.head;int start=0, end=0; /序号startend的子串为一项while (start(new Te

38、rmX(polystr.substring(start,end), null);/尾插入,以序号start end 的子串作为一项,创建结点,创建元素对象rear = rear.next; start=end;public Polynomial(Polynomial poly) /深度拷贝构造方法,复制所有结点和对象this(); /创建空单链表,只有头结点 Node rear = this.list.head;for (Node p=poly.list.head.next; p!=null; p=p.next) /p遍历poly单链表rear.next = new Node(new Term

39、X(p.data), null); /复制结点,复制对象rear = rear.next; public String toString() /返回多项式的描述字符串String str=“;for (Node p=this.list.head.next; p!=null; p=p.next)str+=p.data.toString();return str;public void subAll(Polynomial poly) /多项式相加,this= polythis.list.subAll(poly.list);public Polynomial union(Polynomial pol

40、y) /减法 -,C=this-polyPolynomial polyc=new Polynomial(this); /深度拷贝,复制所有结点和对象polyc.subAll(poly); /cpoly-=polyreturn polyc; /返回对象引用public boolean equals(Object obj) /比较两个多项式是否相等return this=obj | obj instanceof Polynomial /比较两条单链表是否相等package Poly;public class Polynomial_ex public static void main(String

41、args)System.out.println(“/一元多项式“ );TermX aterms=new TermX(-7,9), new TermX(2,7), new TermX(-9,4), new TermX(1,2),new TermX(-1,1); /图2.25A(x),不要求数组排序 Polynomial apoly = new Polynomial(aterms);Polynomial bpoly = new Polynomial(“-1+x-x2+10x4-3x8+5x10“);/图2.25B(x)Polynomial cpoly = apoly.union(bpoly);Sy

42、stem.out.println(“A=“+apoly.toString()+“nnB=“+bpoly.toString()+“n“); System.out.println(“C=A-B,C=“+cpoly.toString ();6. 实验总结:(本次实验的收获、未解决的问题以及体会和建议等)说明:1. 实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模版供学生使用;2. 实验准备由学生在实验或上机之前填写,教师应该在实验前检查;3. 实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;4. 实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;5. 源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 专业基础教材

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报