双向循环链表的创建及相关操作的实现课程设计说明书_第1页
双向循环链表的创建及相关操作的实现课程设计说明书_第2页
双向循环链表的创建及相关操作的实现课程设计说明书_第3页
双向循环链表的创建及相关操作的实现课程设计说明书_第4页
双向循环链表的创建及相关操作的实现课程设计说明书_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、山东建筑大学计算机科学与技术学院课程设计说明书题 目: 双向链表的创建和操作的实现 树的创建及相关操作的实现课 程: 数据结构与算法院 (部): 计算机学院专 业: 网络工程班 级: 网络101学生姓名: 王天未学 号: 2010111200指导教师: 伊静完成日期: 2013-7-6 目 录课程设计任务书1iii课程设计任务书2iv双向循环链表的创建及相关操作的实现6一、问题描述6二、数据结构6三、逻辑设计7四、编码8五、 测试数据13六、测试情况13树的创建及相关操作的实现17一、问题描述17二、数据结构17三、逻辑设计18四、编码21五、 测试数据28六、测试情况28结 论30参考文献3

2、1课程设计指导教师评语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、 考勤20%2、 课程设计说明书50%3

4、、成果展示30%指导教师(签字): 教研室主任(签字)双向循环链表的创建及相关操作的实现一、问题描述 a0 a1 a2 a3 a41、每个节点的next域构成了一个循环单链表2、每个节点的prev域构成了另一个循环单链表二、数据结构针对所处理的树:1、画出双向循环链表的存储结构 prev data next2、使用所选用语言的功能,描述该存储结构的实现private static class node<anytype> anytype data;node<anytype> prev;node<anytype> next;三、逻辑设计1、总体思路对于双向循环链

5、表,建立一个空表,然后实现双向循环链表的插入,删除操作。为了便于逆置的操作,选择建立一个带头节点的双向循环链表,插入第一个节点和插入最后一个节点,只需要在0号位置和size()位置插入节点就行。2、模块划分(以图示的方法给出各个函数的调用关系)建立一个空表删除节点插入节点逆置主函数3、函数或类的具体定义和功能 class node<anytype>/节点类定义public class dllist < anytype>/循环链表主类public boolean add(int idex, anytype x)/链表插入操作public anytype remove(in

6、t idex )/链表删除操作private void inverse()/链表逆置 四、编码import java.util.scanner;class node<anytype> public anytype data; public node<anytype> prev; public node<anytype> next; public node() data=null; prev=null; next=null; public node(anytype d) data=d; prev=null; next=null; public node(any

7、type d,node<anytype> p,node<anytype> n) data=d; prev=p; next=n; /节点类public class dllist < anytype>private node<anytype> headnode=new node<anytype>(); /头标记或头节点private int thesize;/长度 public dllist() headnode.next=headnode; headnode.prev=headnode; thesize=0; /创建一个空表 publi

8、c int size()return thesize; /设定表的长度 public boolean add(anytype x) add(thesize, x);return true;/链表输入操作public boolean add(int idex, anytype x) boolean flag;if (idex < 0 | idex > thesize) /判断插入的位置是否大于0system.out.println("您输入的要插入元素的位置不正确!");flag = false; elseflag = true;if (flag) node<

9、;anytype> p;p = getnode(idex);addbefore(p, x);/插入操作return flag;private void addbefore(node<anytype> p, anytype x) node<anytype> newnode = new node<anytype>(x, p.prev, p);newnode.prev.next = newnode;p.prev = newnode;thesize+;/插入方法 public anytype remove(int idex ) return remove(ge

10、tnode(idex); private anytype remove( node<anytype> p ) p.prev.next=p.next; p.next.prev=p.prev; thesize-; return p.data; /删除操作 private void inverse() node<anytype> p,q,l; p=headnode.next; q=p.next; while(p!=headnode)l=q.next;/空置的中转结点赋值q.next=p;/将p、q链表的前后域置换。q由p的后域变成前域p.prev=q;p=q;/置换后,将各个

11、结点置换输出。q=l; q.next=p; p.prev=q;/当p为头结点时,直接将前后域置换。 /逆置 private node<anytype> getnode(int idex)node<anytype> p;if(idex<0|idex>size()throw new indexoutofboundsexception("getnode idex:"+idex+"size:"+size();if(idex<size()/2) p=headnode;for(int i=0;i<=idex;i+) p

12、=p.next; elsep=headnode;for(int i=size();i>idex;i-)p=p.prev;return p; /查找结点位置 public void print() for(int i=0;i<this.thesize;i+) system.out.print(getnode(i).data+" "); system.out.println(); /结果输出 public void choose() system.out.println("1.插入第i个节点"); system.out.println("

13、;2.删除第i个节点"); system.out.println("3.插入第一个节点"); system.out.println("4.插入最后一个节点"); system.out.println("5.逆置"); /选择操作项 public static void main(string args) dllist<integer> dl=new dllist<integer>(); scanner sc=new scanner(system.in); int xuanze; system.out.

14、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("请选择操作项:"); dl.choo

15、se();/调用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(i

16、dex1); 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();

17、break; default: system.out.println("你的输入有误,请重新输入!"); break; 5、 测试数据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.

18、逆置1请输入要插入的位置下标和数据:261 2 6 3 4 5请输入链表的元素的个数(大于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请输入链表的元素的个数(大

19、于0个):5请输入链表的5个元素:12345您输入的链表为:1 2 3 4 5 请选择操作项: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

20、 cef层次遍历 :a bc def二、数据结构针对所处理的树:1、画出存储结构 left data right 2、使用所选用语言的功能,实现上述的该存储结构public static class btnode<anytype> private anytype data;private btnode<anytype> parent;private btnode<anytype> leftnode;private btnode<anytype> rightnode; 三、逻辑设计1、总体思路首先建立节点类,然后构造binarytree(),再构造

21、先序遍历建树方法,层次遍历建树方法,层次遍历树的方法,统计叶子结点个数方法,交换子树方法,再调试。2、 模块划分(以图示的方法给出各个函数的调用关系)3、 函数或类的具体定义和功能 bitnode()/节点类定义 public bitnode<anytype> creattree(anytype a)/先序建树方法定义 private void creatpathbinarytree(anytype a)/层次遍历建树定义public void pathorder()/层次遍历方法定义public int countleafnode()/ 统计叶子节点个数方法定义四、编码1.结点类

22、定义package kcsj;public class bitnode<anytype> implements comparable<bitnode<anytype>> anytype data;bitnode<anytype> left, right;int weight;bitnode() data = null;left = right = null;bitnode(anytype thedata) data = thedata;left = right = null;bitnode(anytype thedata, bitnode<

23、anytype> lt, bitnode<anytype> rt) data = thedata;left = lt;right = rt;public bitnode<anytype> getleft() return left;public bitnode<anytype> getright() return right;public object getdata() return data;public double getwight() return weight;overridepublic int compareto(bitnode<

24、anytype> 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 binarytree<anytype extends comparable<? super anytype>> anytype pre, in;bitno

25、de<anytype> rootnode = new bitnode<anytype>();int count = 0;public binarytree() rootnode = null;public binarytree(anytype rootnodeitem) rootnode.data = rootnodeitem;rootnode.left = rootnode.right = null;public binarytree(bitnode<anytype> t) rootnode = t;/1. 先序遍历建树public bitnode<

26、anytype> creattree(anytype a) return rootnode = creatbinarytree(a);private bitnode<anytype> creatbinarytree(anytype a) bitnode<anytype> p = null;if (count < a.length) anytype data = acount;count+;if (data != null) p = new bitnode<anytype>(anytype) data);p.left = creattree(a);

27、p.right = creattree(a);return p;/1.层次遍历排序建树public void creatpathtree(anytype a) if (a != null) creatpathbinarytree(a);private void creatpathbinarytree(anytype a) queue<bitnode<anytype>> q = new linkedlist<bitnode<anytype>>();bitnode<anytype> node = new bitnode<anytyp

28、e>(a0);rootnode = node;q.offer(node);int i = 1;while (i < a.length) if (ai != null) node = new bitnode<anytype>(ai);q.element().left = node;q.offer(q.element().left);if (i < a.length - 1) if (a+i != null) node = new bitnode<anytype>(ai);q.element().right = node;q.offer(q.element

29、().right);q.poll();i+;/2.实现二叉树的层次遍历public void pathorder() if (rootnode != null)pathorder(rootnode);public void pathorder(bitnode<anytype> t) queue<bitnode<anytype>> q = new linkedlist<bitnode<anytype>>();q.offer(t);while (!q.isempty() if (q.element().left != null)q.off

30、er(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<anytype> t) if (t != null) system.out.print(t.data+" ");pre

31、order(t.left); preorder(t.right);/ 统计节点的个数public int countnode() return countnode(rootnode);private int countnode(bitnode<anytype> 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(roo

32、tnode);private int countleafnode(bitnode<anytype> 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

33、(rootnode);private bitnode<anytype> exchangetree(bitnode<anytype> t) if (t != null) bitnode<anytype> 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<anytype>

34、; t) / 返回二叉树的深度int depthleft, depthright;if (t = null)return 0;depthleft = depth(t.left);depthright = depth(t.right);return math.max(depthleft, depthright) + 1;/横向输出树状图public void showtree(bitnode<anytype> t,int n)if (t=null) return; showtree(t.right,+n);for (int i = 0; i < n; i+) system.ou

35、t.print(" ");system.out.print(t.data+"n"); showtree(t.left,n+);3. 测试函数package kcsj;public class test public static void pln(object o) system.out.println(o);public static void main(string args) binarytree<character> bt = new binarytree<character>();character charspre =

36、 '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&#

37、39;,null,null,'f'");bt.creattree(charspre);pln("层序遍历结果:");bt.pathorder();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.cou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论