课程:《程序设计与数据结构》
班级: 1723
姓名: 余坤澎
学号:20172313
实验教师:王志强
实验日期:2018年9月26日
必修/选修: 必修java
实验五
用数组代替链表实现实验三node
LinkedQueue lq = new LinkedQueue(); System.out.println("请输入一系列整数:"); Scanner scan = new Scanner(System.in); String str = scan.nextLine(); StringTokenizer st = new StringTokenizer(str); while(st.hasMoreTokens()){ lq.enqueue(st.nextToken()); }
insert 方法 (将数据(element)插入适当的索引(A)处) public void insert(T element1, int A){ LinearNode<T> node1 = new LinearNode<T>(element1); LinearNode<T> current = head; if(A==0){ node1.setNext(current); head = node1; } else{ for(int i = 1; i < A; i ++) current = current.getNext(); node1.setNext(current.getNext()); current.setNext(node1); } nYuKunpeng++; }
delete 方法 (删除指定索引处(A)的元素) public void delete(int A){ LinearNode current, temp = null; current = head; if( A == 0) head = head.getNext(); else{ for(int i = 0; i < A; i ++) { temp = current; current = current.getNext(); } temp.setNext(current.getNext()); } nYuKunpeng --; }
ToString 方法(便历链表依次打印) public String toString(){ String result = ""; LinearNode<T> current = head; int a = nYuKunpeng; while(a > 0) { result += current.getElement()+ ","; current = current.getNext(); a--; } return result; }
sort 方法 public void sort(){ LinearNode2<T> current, temp = null; T n; for(current = head; current != null; current = current.getNext()){ //外层循环遍历链表内的元素 for(temp = current;temp.getPrevious() != null; temp = temp.getPrevious()){ //内层循环使用该元素与他以前的元素进行比较 if(Integer.parseInt(temp.getPrevious().getElement()+"")>Integer.parseInt(temp.getElement()+ "")){ n = temp.getPrevious().getElement(); //使用临时变量n来交换两个节点内的元素 temp.getPrevious().setElement(temp.getElement()); temp.setElement(n); } } System.out.println("此轮排序后元素的顺序" + toString() + "此时元素的个数为" + size()); } }
add方法 (把指定的元素(element)插入到适当的索引处(a)) //add方法分为两种,在不加索引参数的时候直接在数组的末尾进行添加,在这里只列举有索引参数的方法,下面的delete方法也是如此。 public void add(T element, int a){ T[] B = (T[])(new Object[size() + 1]); for(int i =0; i < a;i ++) B[i] = A[i]; B[a] = element; for(int i = a + 1;i < size() + 1; i ++ ) { B[i] = A[i - 1]; } A = B; nYuKunpeng ++; }
delete方法 (删除指定索引处(a)的元素) public void delete(int a){ T[] B = (T[])(new Object[size() - 1 ]); for(int i = 0;i < a; i++) B[i] = A[i]; for(int i = a;i < size() - 1; i++) B[i] = A[i+1]; A = B; nYuKunpeng--; }
public void sort(){ for(int i=0;i<size();i++) { for (int j = i; j > 0; j--) { if (Integer.parseInt(A[j-1] + "") > Integer.parseInt(A[j]+ "")) { T temp = A[j]; A[j] = A[j - 1]; A[j - 1] = temp; } } System.out.println("此时元素为:" + toString()+ "元素的个数为" + size()); } }
问题一解决方案:强制类型转换在T类型和char类型当中进行转换是不适用的,先把T类型转化为String类型,在转换为int就能够了。
git
问题二解决方案:在插入元素的时候,记录数组内元素个数的变量nYuKunpeng没有进行自增,致使最后在ToString时遍历数组会致使元素个数少一。
算法
问题三:我在进行链表冒泡排序的时候,不是很能理解冒泡排序的含义。
数组
算法原理
冒泡排序算法的原理以下:
比较相邻的元素。若是第一个比第二个大,就交换他们两个。
对每一对相邻元素作一样的工做,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对全部的元素重复以上的步骤,除了最后一个。
持续每次对愈来愈少的元素重复上面的步骤,直到没有任何一对数字须要比较。
算法稳定性:
冒泡排序就是把小的元素往前调或者把大的元素日后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。因此,若是两个元素相等,是不会再交换的;若是两个相等的元素没有相邻,那么即便经过前面的两两交换把两个相邻起来,这时候也不会交换,因此相同元素的先后顺序并无改变,因此冒泡排序是一种稳定排序算法。服务器
//单链表冒泡排序 public Node blueSortList(Node node){ System.out.println("blue start..."); //当前节点 Node cur = node.next; //下一个节点 Node next = cur.next; //前一个节点,两节点n1,n2交换位置时须要前一个节点的next指向n2节点 Node upperNode = node; //一次排序的最后一个节点 Node lastNode = null; int i = 1; //当第二个节点为当次排序的最后一个节点时,总体排序结束 while(node.next != lastNode){ //当下一个节点为一次次排序的最后一个节点时,本次排序结束。 if(next == lastNode){ lastNode = cur; cur = node.next; next = cur.next; upperNode = node; }else if(next.value < cur.value){ cur.next = next.next; next.next = cur; upperNode.next = next; upperNode = next; }else{ upperNode = cur; cur = cur.next; } next = cur.next; System.out.println("第" + i++ + "次排列结果:"); printList(node.next); } System.out.println("blue end..."); return node; }
此次实验的难度相对来讲不是特别高,一方面没有新的知识,另外一方面其中须要的不少代码在以前也有练习过。尽管如此,因为本身的粗心和理解的不透彻,仍是在实验中浪费了很多时间,但愿可以在之后的学习生活中继续努力,不断进步!网络