zoukankan      html  css  js  c++  java
  • 20172314 2018-2019-1 实验一《线性结构》实验报告

    课程:《程序设计与数据结构》

    班级: 1723

    姓名: 方艺雯

    学号:20172314

    实验教师:王志强

    实验日期:2018年9月27日

    必修/选修: 必修

    1、实验内容及要求

    • 实验一-1

      链表练习,要求实现下列功能:

      (1)通过键盘输入一些整数,建立一个链表(1分);
      这些数是你学号中依次取出的两位数。 再加上今天的时间。
      例如你的学号是 20172301
      今天时间是 2018/10/1, 16:23:49秒
      数字就是
      20, 17,23,1, 20, 18,10,1,16,23,49
      打印所有链表元素, 并输出元素的总数。
      在你的程序中,请用一个特殊变量名来纪录元素的总数,变量名就是你的名字。 例如你叫 张三, 那么这个变量名就是
      int nZhangSan = 0; //初始化为 0.

      做完这一步,把你的程序签入源代码控制(git push)。

    • 实验一-2

      (2)实现节点插入、删除、输出操作(2分,3个知识点根据实际情况酌情扣分);

      继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;

      从磁盘读取一个文件, 这个文件有两个数字。
      从文件中读入数字1, 插入到链表第 5 位,并打印所有数字,和元素的总数。 保留这个链表,继续下面的操作。
      从文件中读入数字2, 插入到链表第 0 位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。
      从链表中删除刚才的数字1. 并打印所有数字和元素的总数。

      签入所有代码。

    • 实验一-3

      (3)使用冒泡排序法或者选择排序法根据数值大小对链表进行排序(2分);
      如果你学号是单数, 选择冒泡排序, 否则选择选择排序。
      在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。

      在(2)得到的程序中继续扩展, 用同一个程序文件,写不同的函数来实现这个功能。 仍然用 nZhangSan (你的名字)来表示元素的总数。

    • 实验一-4

      (1)通过键盘输入一些整数,建立一个链表(1分);
      这些数是你学号中依次取出的两位数。 再加上今天的时间。
      例如你的学号是 20172301
      今天时间是 2018/10/1, 16:23:49秒
      数字就是
      20, 17,23,1, 20, 18,10,1,16,23,49
      打印所有数组元素, 并输出元素的总数。
      在你的程序中,请用一个特殊变量名来纪录元素的总数,变量名就是你的名字。 例如你叫 张三, 那么这个变量名就是
      int nZhangSan = 0; //初始化为 0.

      做完这一步,把你的程序签入源代码控制(git push)。

      (2)实现节点插入、删除、输出操作(2分,3个知识点根据实际情况酌情扣分);

      继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;

      从磁盘读取一个文件, 这个文件有两个数字。
      从文件中读入数字1, 插入到数组第 5 位,并打印所有数字,和元素的总数。 保留这个数组,继续下面的操作。
      从文件中读入数字2, 插入到数组第 0 位,并打印所有数字,和元素的总数。 保留这个数组,并继续下面的操作。
      从数组中删除刚才的数字1. 并打印所有数字和元素的总数。

      签入所有代码。

    • 实验一-5

      (3)使用冒泡排序法或者选择排序法根据数值大小对数组进行排序(2分);
      如果你学号是单数, 选择选择排序, 否则选择冒泡排序。
      在排序的每一个轮次中, 打印元素的总数,和目前数组的所有元素。

      在(2)得到的程序中继续扩展, 用同一个程序文件,写不同的函数来实现这个功能。 仍然用 nZhangSan (你的名字)来表示元素的总数。

    实验过程及结果

    实验1-1

    主要代码:

    @Override
        //打印链表
        public String Print() {
    
            String result = "";
            LinearNode <T>temp = head;
            while(temp != null){
                result += temp.getElement()+ " ";
                temp = temp.next;
            }
            return result;
    
        }
    
        @Override
        //链表长度
        public int size() {
            return nFangYiWen;
        }
        @Override
        //尾插法
        public void add(T t){
            LinearNode<T> node = new LinearNode(t);
            LinearNode<T> temp;
    
            if (head == null) {
                head = node;
            }
            else {
                temp = head;
                while (temp.next != null) {
                    temp = temp.next;
                }
                temp.next = node;
            }
            nFangYiWen++;
        }
    

    实验1-2


    主要代码:

    @Override
        //删除指定位置元素
        public void Delete(int where, T num) {
            LinearNode node = new LinearNode(num);
            LinearNode temp1, temp2;
            //头删除
            if ((where == 1) && (head.element.equals(num))) {
                head = head.next;
            } else {
                if (where <= nFangYiWen + 1) {
                    temp1 = head;
                    temp2 = head.next;
                    for (int a = 1; a < where - 1; a++) {
                        temp1 = temp1.next;
                        temp2 = temp2.next;
                    }
                    //中间删
                    if (temp2.element.equals(node.element)) {
                        if (temp2.next != null) {
                            temp1.next = temp2.next;
                        }
                        //尾删
                        else {
                            temp1.next = null;
                        }
                    } else {
                        System.out.println("删除错误");
                    }
                } else {
                    System.out.println("删除错误");
                }
            }
            nFangYiWen--;
        }
    

    实验1-3


    主要代码:

     public String SelectSort() {
            String result = "";
            String[] strings = this.Print().split(" ");
            int[] a = new int[nFangYiWen];
    
            for (int i = 0; i < a.length - 1; i++) {
                int y = Integer.parseInt(strings[i]);
                a[i] = y;
            }
    
            for (int i = 0; i < a.length - 1; i++) {
                for (int j = i + 1; j < a.length; j++) {
                    if (a[i] < a[j]) {
                        int min = a[i];
                        a[i] = a[j];
                        a[j] = min;
                    }
                }
                String all = "";
                for (int s = 0; s < a.length; s++) {
                    all += a[s] + " ";
                }
                result += "元素总数为:" + a.length + "
    "+ "链表元素为:" + all + "
    ";
            }
            return result;
        }
    

    实验1-4

    主要代码:

    public String Print(){
            String result="";
            for (int i=0;i<Array.length;i++){
                result += Array[i]+ " ";
            }
            return result;
        }
    
        public int size(){
            return nFangYiWen;
        }
    
        public void Insert(int n,String num){
            int y =Array.length+1;
            String []result = new String[y];
    
            if (n==0){
                result[0]=num;
                for (int a=0;a<Array.length;a++)
                {
                    result[a+1]=Array[a];
                }
            }
            else
            {
                if (n==Array.length){
                    for (int a=0;a<Array.length;a++){
                        result[a]=Array[a];
                    }
                    result[Array.length+1]=num;
                }
    
                else {
                    result[n]=num;
                    for (int a=0;a<Array.length;a++){
                        if (a<n)
                            result[a]=Array[a];
                        else
                            result[a+1]=Array[a];
                    }
                }
            }
            Array=result;
            nFangYiWen=Array.length;
        }
    
        public void  Delete(int n){
            String []result=new String[Array.length-1];
    
            if (n==0){
                for (int a=0;a<Array.length-1;a++)
                {
                    result[a]=Array[a+1];
                }
            }
            else
            {
                if (n==Array.length-1){
                    for (int a=0;a<Array.length-1;a++){
                        result[a]=Array[a];
                    }
                }
    
                else {
                    for (int a=0;a<Array.length-1;a++){
                        if (a<n)
                            result[a]=Array[a];
                        else
                            result[a]=Array[a+1];
                    }
                }
            }
            Array=result;
            nFangYiWen=Array.length;
        }
    

    实验1-5


    主要代码:

    //冒泡排序
        public String Sort(){
            String result2="";
            int[]array=new int[nFangYiWen];
    
            for (int a=0;a<nFangYiWen;a++ ){
                array[a]=Integer.parseInt(Array[a]);
            }
    
            for (int i = 0; i < array.length - 1; i++) {
                //遍历次数
                for (int j = 0; j < array.length - 1 - i; j++) {
                    //每次遍历的排序
                    if (array[j] > array[j + 1]) {
                        int temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                    }
                    }
                String every = "";
                for (int a = 0; a < array.length; a++) {
                    every += array[a] + " ";
                }
                result2 += "链表元素为:" + every + "
    "+ "元素的总数为:" + array.length + "
    " ;
            }
            return result2;
        }
    

    遇到的问题及解决

    • 问题一:在排序时,要求每轮排序输出元素总数,而我显示的元素总数一直是1

    • 问题一解决:我之前的排序代码为:

      public Number selectionSort(Number Head) {
          //选择排序法,大的在左
          int temp;
          Number xxx = Head;
          //while (xxx != null) {
              Number s = xxx.next;
              while (s != null) {
                  if (s.number > xxx.number) {
                      temp = s.number;
                      s.number = xxx.number;
                      xxx.number = temp;
                  }
                  s = s.next;
                  LinkedList3 linkedlist3 = new LinkedList3();
                  System.out.println("链表元素是:");
                  linkedlist3.Print(Head); ;
                  System.out.println();
                  System.out.println("元素总数为:"+ linkedlist3.size());
              }
         //     xxx = xxx.next;
       //   }
          return Head;
      }       
      

      其中的linkedlist3新声明的,并不是指正在排序的那条链表,linkedlist3.size()执行如下操作

      public int size() {
          return nFangYiWen+1;
      }
      

      相当于0+1,所以元素总数一直是1.正确的应该是

      public  Number selectionSort(Number Head) {
          //选择排序法,大的在左
          int temp;
          Number xxx = Head;
          while (xxx != null) {
              Number s = xxx.next;
              while (s != null) {
                  while (s.number > xxx.number) {
                      temp = s.number;
                      s.number = xxx.number;
                      xxx.number = temp;
                  }
                  s = s.next;
              }
              xxx=xxx.next;
              System.out.println();
              System.out.print("链表元素是:");
              Print(Head);
              System.out.println();
              System.out.println("元素总数为:" + size());
          }
              return Head;
      }
      
    • 问题二:元素重复出现问题

    • 问题二解决:之前的错误代码为

      while(num.hasMoreTokens()) {
              int i = Integer.parseInt(num.nextToken());
              Number number = new Number(i);
              Number Head = new Number(i);
              xxx.add(Head,number);
              xxx.Print(Head);
          }
      

      这样的话每次while循环中,i有一个新的值,Head也为新的值,完整的链表还未形成,所以每次打印出一个Head,一个number,将xxx.Print(Head)移到while循环外即可。

    • 问题三:运行程序抛出错误java.lang.NumberFormatException:For input String

    • 问题三解决:在网上查找解决办法得知是因为

      当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常
      也就是说你的字符串有问题

      仔细检查代码后发现

      应为

      因为.toString得到的字符串没有“ ”,在选择排序法中需要的形式有格式限制的。

    其他

    这次实验我做了好多次,第一次使用了队列的方法,后来得知不可以使用这种方法,第二次使用了一个结点类,但在头插法中发现元素并不能真正插进链表,修改了很久之后放弃该方法,第三次使用了LinearNode类才算顺利。过程坎坷,但也掌握了更多的方法。

    参考

  • 相关阅读:
    一个不错的学习Hadoop和MapReduce的个人博客
    开源数据库sharding
    《控制论》导读 及 译者序 第二版序 读书笔记
    异常处理反模式
    主数据处理链碰到空数据节点不在继续执行的问题解决方案
    SAP 学习笔记 FI000 公司代码
    SAP概念之Client(集团),业务范围(business area),公司(company),公司代码(company code)
    零售行业主数据增量上载
    R/3数据源抽数到BWPSA中字段信息丢失
    BI CONTENT激活出现DUMP
  • 原文地址:https://www.cnblogs.com/YiYiYi/p/9741756.html
Copyright © 2011-2022 走看看