《学位论文-—双向循环链表的创建及相关操作的实现课程设计说明书.doc》由会员分享,可在线阅读,更多相关《学位论文-—双向循环链表的创建及相关操作的实现课程设计说明书.doc(31页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、山东建筑大学计算机科学与技术学院课程设计说明书题 目: 双向链表的创建和操作的实现 树的创建及相关操作的实现课 程: 数据结构与算法院 (部): 计算机学院专 业: 网络工程班 级: 网络101学生姓名: 王天未学 号: 2010111200指导教师: 伊静完成日期: 2013-7-6山东建筑大学计算机学院课程设计说明书 目 录课程设计任务书1III课程设计任务书2IV双向循环链表的创建及相关操作的实现6一、问题描述6二、数据结构6三、逻辑设计7四、编码8五、 测试数据13六、测试情况13树的创建及相关操作的实现17一、问题描述17二、数据结构17三、逻辑设计18四、编码21五、 测试数据28
2、六、测试情况28结 论30参考文献31课程设计指导教师评语32山东建筑大学计算机科学与技术学院课程设计任务书1设计题目双向循环链表的创建及相关操作的实现已知技术参数和设计要求1、建立一个空表2、插入第i个结点。3、删除第i个结点。4、插入第1个结点。5、插入最后一个结点。6、逆置设计内容与步骤1、 设计存储结构2、 设计算法3、 编写程序,进行调试4、 总结并进行演示、讲解设计工作计划与进度安排做双向链表创建方法做双向链表各种操作方法设计考核要求1、 考勤20%2、 课程设计说明书50%3、 成果展示30%指导教师(签字): 教研室主任(签字)山东建筑大学计算机科学与技术学院课程设计任务书2设
3、计题目树的创建及相关操作的实现已知技术参数和设计要求1、利用先序遍历和层次遍历的结果建立二叉树2、实现二叉树的层次遍历3、统计二叉树叶子结点的个数(递归)。4、将二叉树左右子树相互交换(递归)设计内容与步骤1.建立结点类2.构造BinaryTree()3.建立线序遍历树4.建立层次遍历树5.实现树的层次遍历6.统计叶子结点个数7.交换左右子树8.输出树的方法设计工作计划与进度安排6月13日,实验课下完成先序遍历建树,16月14日课程设计时间完成层次遍历建树6月16日课下完成层次遍历和叶子节点个数统计6月18日课程设计时间完成二叉树左右子树相互交换6月19日完成测试函数及纠错设计考核要求1、 考
4、勤20%2、 课程设计说明书50%3、成果展示30%指导教师(签字): 教研室主任(签字)29山东建筑大学计算机学院课程设计说明书双向循环链表的创建及相关操作的实现一、问题描述 a0 a1 a2 a3 a41、每个节点的next域构成了一个循环单链表2、每个节点的prev域构成了另一个循环单链表二、数据结构针对所处理的树:1、画出双向循环链表的存储结构 prev data next2、使用所选用语言的功能,描述该存储结构的实现private static class Node AnyType data;Node prev;Node next;三、逻辑设计1、总体思路对于双向循环链表,建立一个空
5、表,然后实现双向循环链表的插入,删除操作。为了便于逆置的操作,选择建立一个带头节点的双向循环链表,插入第一个节点和插入最后一个节点,只需要在0号位置和size()位置插入节点就行。2、模块划分(以图示的方法给出各个函数的调用关系)建立一个空表删除节点插入节点逆置主函数3、函数或类的具体定义和功能 class Node/节点类定义public class DlList /循环链表主类public boolean add(int idex, AnyType x)/链表插入操作public AnyType remove(int idex )/链表删除操作private void inverse()/
6、链表逆置 四、编码import java.util.Scanner;class Node public AnyType data; public Node prev; public Node next; public Node() data=null; prev=null; next=null; public Node(AnyType d) data=d; prev=null; next=null; public Node(AnyType d,Node p,Node n) data=d; prev=p; next=n; /节点类public class DlList private Node
7、headNode=new Node(); /头标记或头节点private int theSize;/长度 public DlList() headNode.next=headNode; headNode.prev=headNode; theSize=0; /创建一个空表 public int size()return theSize; /设定表的长度 public boolean add(AnyType x) add(theSize, x);return true;/链表输入操作public boolean add(int idex, AnyType x) boolean flag;if (i
8、dex theSize) /判断插入的位置是否大于0System.out.println(您输入的要插入元素的位置不正确!);flag = false; elseflag = true;if (flag) Node p;p = getNode(idex);addBefore(p, x);/插入操作return flag;private void addBefore(Node p, AnyType x) Node newNode = new Node(x, p.prev, p);newNode.prev.next = newNode;p.prev = newNode;theSize+;/插入方法
9、 public AnyType remove(int idex ) return remove(getNode(idex); private AnyType remove( Node p ) p.prev.next=p.next; p.next.prev=p.prev; theSize-; return p.data; /删除操作 private void inverse() Node p,q,l; p=headNode.next; q=p.next; while(p!=headNode)l=q.next;/空置的中转结点赋值q.next=p;/将p、q链表的前后域置换。q由p的后域变成前域p
10、.prev=q;p=q;/置换后,将各个结点置换输出。q=l; q.next=p; p.prev=q;/当p为头结点时,直接将前后域置换。 /逆置 private Node getNode(int idex)Node p;if(idexsize()throw new IndexOutOfBoundsException(getNode idex:+idex+;size:+size();if(idexsize()/2) p=headNode;for(int i=0;iidex;i-)p=p.prev;return p; /查找结点位置 public void print() for(int i=0
11、;ithis.theSize;i+) System.out.print(getNode(i).data+ ); System.out.println(); /结果输出 public void choose() System.out.println(1.插入第i个节点); System.out.println(2.删除第i个节点); System.out.println(3.插入第一个节点); System.out.println(4.插入最后一个节点); System.out.println(5.逆置); /选择操作项 public static void main(String args)
12、DlList dl=new DlList(); Scanner sc=new Scanner(System.in); int xuanze; System.out.println(请输入链表的元素的个数(大于0个):); int n=sc.nextInt(); System.out.println(请输入链表的+n+个元素:); for(int i=1;i=n;i+) int l=sc.nextInt(); dl.add(l);/链表元素输入 System.out.println(您输入的链表为:); dl.print();/调用print方法,提示操作。 System.out.println
13、(请选择操作项:); dl.choose();/调用choose,选择操作。 while(true) xuanze=sc.nextInt(); switch(xuanze) case 1: System.out.println(请输入要插入的位置下标和数据:); int idex=sc.nextInt(); int data=sc.nextInt(); dl.add(idex, data); dl.print(); break; case 2: System.out.println(请输入要删除节点的下标:); int idex1=sc.nextInt(); dl.remove(idex1);
14、 dl.print(); break; case 3: System.out.println(请输入插入第一个节点的元素:); int data1=sc.nextInt(); dl.add(0,data1); dl.print(); break; case 4: System.out.println(请输入插入最后位置的元素:); int data2=sc.nextInt(); dl.add(dl.size(), data2); dl.print(); break; case 5: dl.inverse(); dl.print(); break; default: System.out.pri
15、ntln(你的输入有误,请重新输入!); break; 五、 测试数据1、对每个函数的测试数据链表中的元素插入为1、2、3、4、5插入第二个结点的元素为6删除第二个节点的位置的元素6插入第一个节点的元素为7插入最后一个节点的元素为6逆置链表2、对程序整体的测试数据输入元素为1、2、3、4、5的双向循环链表六、测试情况请输入链表的元素的个数(大于0个):5请输入链表的5个元素:12345您输入的链表为:1 2 3 4 5 请选择操作项:1.插入第i个节点2.删除第i个节点3.插入第一个节点4.插入最后一个节点5.逆置1请输入要插入的位置下标和数据:261 2 6 3 4 5请输入链表的元素的个数
16、(大于0个):5请输入链表的5个元素:12345您输入的链表为:1 2 3 4 5 请选择操作项:1.插入第i个节点2.删除第i个节点3.插入第一个节点4.插入最后一个节点5.逆置2请输入要删除的位置下标和数据:261 2 3 4 5请输入链表的元素的个数(大于0个):5请输入链表的5个元素:12345您输入的链表为:1 2 3 4 5 请选择操作项:1.插入第i个节点2.删除第i个节点3.插入第一个节点4.插入最后一个节点5.逆置3请输入插入第一个节点的元素:77 1 2 3 4 5请输入链表的元素的个数(大于0个):5请输入链表的5个元素:12345您输入的链表为:1 2 3 4 5 请选
17、择操作项:1.插入第i个节点2.删除第i个节点3.插入第一个节点4.插入最后一个节点5.逆置4请输入插入最后位置的元素:61 2 3 4 5 6 请输入链表的元素的个数(大于0个):5请输入链表的5个元素:12345您输入的链表为:1 2 3 4 5 请选择操作项:1.插入第i个节点2.删除第i个节点3.插入第一个节点4.插入最后一个节点5.逆置55 4 3 2 1 树的创建及相关操作的实现一、问题描述A1.先遍序遍历建树CBNULLEFDNULLNULLNULLNULL2、 遍历方法举例:先序遍历 :A BD CEF层次遍历 :A BC DEF二、数据结构针对所处理的树:1、画出存储结构 L
18、eft data right 2、使用所选用语言的功能,实现上述的该存储结构public static class BTNode private AnyType data;private BTNode parent;private BTNode leftNode;private BTNode rightNode; 三、逻辑设计1、总体思路首先建立节点类,然后构造BinaryTree(),再构造先序遍历建树方法,层次遍历建树方法,层次遍历树的方法,统计叶子结点个数方法,交换子树方法,再调试。2、 模块划分(以图示的方法给出各个函数的调用关系)3、 函数或类的具体定义和功能 BiTNode()/节
19、点类定义 public BiTNode creatTree(AnyType a)/先序建树方法定义 private void creatPathBinaryTree(AnyType a)/层次遍历建树定义public void pathOrder()/层次遍历方法定义public int countLeafNode()/ 统计叶子节点个数方法定义四、编码1.结点类定义package kcsj;public class BiTNode implements ComparableBiTNode AnyType data;BiTNode left, right;int weight;BiTNode(
20、) data = null;left = right = null;BiTNode(AnyType thedata) data = thedata;left = right = null;BiTNode(AnyType thedata, BiTNode lt, BiTNode rt) data = thedata;left = lt;right = rt;public BiTNode getLeft() return left;public BiTNode getRight() return right;public Object getData() return data;public do
21、uble getWight() return weight;Overridepublic int compareTo(BiTNode o) if (o.getWight() this.getWight()return 1;if (o.getWight() this.getWight()return -1;return 0;2. BinaryTree()构造package kcsj;import java.util.LinkedList;import java.util.Queue;public class BinaryTreeAnyType extends Comparable AnyType
22、 pre, in;BiTNode rootNode = new BiTNode();int count = 0;public BinaryTree() rootNode = null;public BinaryTree(AnyType rootNodeItem) rootNode.data = rootNodeItem;rootNode.left = rootNode.right = null;public BinaryTree(BiTNode t) rootNode = t;/1. 先序遍历建树public BiTNode creatTree(AnyType a) return rootNo
23、de = creatBinaryTree(a);private BiTNode creatBinaryTree(AnyType a) BiTNode p = null;if (count a.length) AnyType data = acount;count+;if (data != null) p = new BiTNode(AnyType) data);p.left = creatTree(a);p.right = creatTree(a);return p;/1.层次遍历排序建树public void creatPathTree(AnyType a) if (a != null) c
24、reatPathBinaryTree(a);private void creatPathBinaryTree(AnyType a) QueueBiTNode q = new LinkedListBiTNode();BiTNode node = new BiTNode(a0);rootNode = node;q.offer(node);int i = 1;while (i a.length) if (ai != null) node = new BiTNode(ai);q.element().left = node;q.offer(q.element().left);if (i a.length
25、 - 1) if (a+i != null) node = new BiTNode(ai);q.element().right = node;q.offer(q.element().right);q.poll();i+;/2.实现二叉树的层次遍历public void pathOrder() if (rootNode != null)pathOrder(rootNode);public void pathOrder(BiTNode t) QueueBiTNode q = new LinkedListBiTNode();q.offer(t);while (!q.isEmpty() if (q.e
26、lement().left != null)q.offer(q.element().left);if (q.element().right != null)q.offer(q.element().right);System.out.print(q.poll().data + );/ 先序遍历public void preOrder() if (rootNode != null)preOrder(rootNode);private void preOrder(BiTNode t) if (t != null) System.out.print(t.data+ );preOrder(t.left)
27、; preOrder(t.right);/ 统计节点的个数public int countNode() return countNode(rootNode);private int countNode(BiTNode t) int m, n;if (t = null)return 0;m = countNode(t.left);n = countNode(t.right);return m + n + 1;/ 3.统计叶子节点个数(递归)public int countLeafNode() return countLeafNode(rootNode);private int countLeaf
28、Node(BiTNode t) int m = 0, n = 0;if (t = null)return 0;if (t.left = null & t.right = null) return 1;m = countLeafNode(t.left);n = countLeafNode(t.right);return m + n;/ 4.将二叉树左+右子树相互交换(递归)public void exchangeTree() if (rootNode != null) exchangeTree(rootNode);private BiTNode exchangeTree(BiTNode t) i
29、f (t != null) BiTNode p = t.right;t.right = t.left;t.left = p;exchangeTree(t.right);exchangeTree(t.left);return t;/ 计算树的深度public int depth() return depth(rootNode);private int depth(BiTNode t) / 返回二叉树的深度int depthleft, depthright;if (t = null)return 0;depthleft = depth(t.left);depthright = depth(t.ri
30、ght);return Math.max(depthleft, depthright) + 1;/横向输出树状图public void showTree(BiTNode t,int n)if (t=null) return; showTree(t.right,+n);for (int i = 0; i n; i+) System.out.print( );System.out.print(t.data+n); showTree(t.left,n+);3. 测试函数package kcsj;public class Test public static void pln(Object o) Sy
31、stem.out.println(o);public static void main(String args) BinaryTree bt = new BinaryTree();Character charsPre = a, b, d, null, null, null, c, e,null, null, f ;Character charsPath = a, b, c, d, null, e, f ;pln(先序建树:a,b,d,null,null,null,c,e,null,null,f);bt.creatTree(charsPre);pln(层序遍历结果:);bt.pathOrder(
32、);pln( );pln(树图为(横向):);bt.showTree(bt.rootNode, 1);pln( );pln(层序建树:a,b,c,d,null,e,f);bt.creatPathTree(charsPath);pln(先序遍历结果:);bt.preOrder();pln( );pln(树图为(横向):);bt.showTree(bt.rootNode, 1);pln( );pln(叶子节点数: + bt.countLeafNode();pln(交换后层次遍历结果:);bt.exchangeTree();bt.pathOrder();pln( );pln(树图为(横向):);bt
33、.showTree(bt.rootNode, 1);pln( );pln(深度为: + bt.depth();五、 测试数据1、对每个函数的测试数据 利用线序遍历和层次遍历分别建树a b c d e f2、 对程序整体的测试数据 a b c d e f六、测试情况先序建树:a,b,d,null,null,null,c,e,null,null,f层序遍历结果:a b c d e f 树图为(横向): f c e a b d 层序建树:a,b,c,d,null,e,f先序遍历结果:a b d c e f 树图为(横向): f c e a b d 叶子节点数:3交换后层次遍历结果:a c b f e d 树图为(横向): d b a e c f 深度为:3结 论在课程设计中,遇到最多的问题便是对一个方法思想的转换。在这两周的课程设计中,让我学会如何思考一个树的存储结构,如何创建,各种遍历的思想需要怎样的代码实现。总而言之,两个字,思考。在课程设计时,思想问题一直是我进度缓慢的原因,对于层次遍历建树的时候的思想一直拐不过弯,不知道该以什么样的方式建立左右子树。最终在同学的讲解下,理解了建树的方法。首先以队列的形式,传进根节点。再判断输入数组中是否存在根节点的左子树,如果存在则创建左孩子并将数据压入队列中。而右
限制150内