20162307 实验一 线性表的应用,实现和分析

20162307 实验一 线性表的应用,实现和分析

北京电子科技学院(BESTI)

实 验 报 告

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

班级:1623

姓名:张韵琪

学号:20162307

指导教师:娄佳鹏老师、王志强老师

实验日期:2017年9月22号

实验密级:非密级

实验时间:一周

必修/选修:必修

实验名称:线性表的应用,实现和分析

实验仪器:电脑

实验目的与要求:

  • 目的:

     学习线性表的应用,实现和分析
    
  • 要求:

      1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程
    
      2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
    
      3. 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
    

实验内容、步骤

实验内容1

     ArrayList和LinkedList测试:

    查看ArrayList和LinkedList的Java API帮助文档,参考http://www.cnblogs.com/rocedu/p/4837092.html 用Junit对ArrayList和LinkedList的方法进行测试,要尽量覆盖正常情况,异常情况,边界情况

提交单元测试运行截图,要全屏,包含学号信息

实验步骤1

1.按照娄老师所给的博客, 博客链接:http://www.cnblogs.com/rocedu/p/4837092.html
2.用Junit对ArrayList和LinkedList的方法进行测试

实验结果1

实验内容2

    分别用Java的ArrayList和LinkedList实现有序线性表的合并:
    aList,bList都是非递减线性表,合并后也是非递减
     public static List<? extends Comparable> mergeSortedList(List<? extends Comparable> aList,  
        List<? extends Comparable> bList) 

    测试mergeSortedList的正确性,要尽量覆盖正常情况,异常情况,边界情况,提交测试代码运行截图,包含学号信息

    课下把代码推送到代码托管平台

实验步骤2

    1.上课的时候老师讲了如何合并的答题思路,试着写
    2.调试代码,不成功,参考同学的代码进行学习
    3.mergeSortedList代码:

    package Experiment1;

    /**
     * Created by zhangyunqi on 2017/9/26.
     */
    import java.util.ArrayList;
    import java.util.List;


    public class MergeList {
        private static List list = new ArrayList();
        public static List<? extends Comparable> mergeSortedList(List<? extends Comparable> aList,
                                                         List<? extends Comparable> bList){
            if(aList.isEmpty() && bList.isEmpty())
            {
                return list;
            }else if(!aList.isEmpty() && bList.isEmpty())
            {
                list.addAll(aList);
            }else if(aList.isEmpty() && !bList.isEmpty())
            {
           list.addAll(bList);
            }else if(aList.get(0).compareTo(bList.get(0))==0)
            {
                list.add(aList.remove(0));
                list.add(bList.remove(0));
                mergeSortedList(aList,bList);
            }else if(aList.get(0).compareTo(bList.get(0))>0)
            {
                list.add(bList.remove(0));
                mergeSortedList(aList,bList);
            }else if(aList.get(0).compareTo(bList.get(0))<0)
            {
                list.add(aList.remove(0));
                mergeSortedList(aList,bList);
            }
            return list;
        }
}

实验结果2

实验内容3

   参考Java Foundation 3rd 第15.6节,用数组实现线性表List

    用JUnit或自己编写驱动类对自己实现的ArrayList进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息

    课下把代码推送到代码托管平台

实验步骤3

ArrayList代码:

    package Experiment1;

    /**
     * Created by zhangyunqi on 2017/9/25.
     */

    import java.util.*;

    public class ArrayListDemo {
        private Object[] obj;
        private int num;


        public boolean isEmpty(int o) {
            if (obj == null) {
                return true;
            }
            return false;
        }

        public void add(int index, Object element) {
            Object ob = null;
            for (int i = 0; i < obj.length; i++) {
                if (i == index) {
                    ob = obj[i];
               obj[i] = element;
                    for (int j = i + 1; j < obj.length + 1; j++) {
                        obj[j + 1] = obj[j];
                        obj[j] = ob;
                }
                }
            }
        }

        public boolean remove(Object o) {
            for (int i = 0; i < obj.length; i++) {
                if (obj[i].equals ( o )) {
                    String str = obj.toString ();
                    StringBuilder bd = new StringBuilder ( str );
                    bd.deleteCharAt ( i );
                    return true;
                }
            }
            return false;
        }

        public Object remove(int index) {
            for (int i = 0; i < obj.length; i++) {
                if (i == index) {
                    StringBuilder bb = new StringBuilder ( obj.toString () );
                    bb.deleteCharAt ( i );
                }
                }
            return obj;
        }

    }

实验结果3

实验内容4

    参考Java Foundation 3rd 第15.7节,用链表实现线性表List

    用JUnit或自己编写驱动类对自己实现的LinkedList进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息

    课下把代码推送到代码托管平台

实验步骤4

    package Experiment1;

    import org.junit.jupiter.api.Test;

    import static org.junit.jupiter.api.Assertions.*;

    import java.util.ArrayList;

    /**
     * Created by zhangyunqi on 2017/9/26.
     */
    class LinkedListDemoTest1 {
        ArrayList list = new ArrayList ();
        @Test
        void isEmpty() {
            assertEquals ( true, list.isEmpty () );
            list.add ( "07shiyan4" );
            assertEquals ( false, list.isEmpty () );
            list.remove ( "07shiyan4" );
            assertEquals ( true, list.isEmpty () );
            list.add ( "07shiyan4" );
        }
        @Test
        void add() {
            list.add ( "20162307shiyan4" );
            assertEquals ( "20162307shiyan4", list.get (0) );
        }

        @Test
        void contains() {
            list.add ( 123456);

        assertEquals ( true, list.contains ( 123456) );
        }

    }

实验结果4:

实验内容5

   参考http://www.cnblogs.com/rocedu/p/7483915.html对Java的ArrayList,LinkedList按要求进行源码分析,并在实验报告中体现分析结果

实验结果5

LinkedList:
add:

    public boolean add(E e) {
         addBefore(e, header);
         return true;
     }

contains:

    public boolean contains(Object o) {
         return indexOf(o) != -1;
     }

    public int indexOf(Object o) {
int index = 0;
if (o==null) {
    for (Entry e = header.next; e != header; e = e.next) {
        if (e.element==null)
            return index;
        index++;
    }
} else {
    for (Entry e = header.next; e != header; e = e.next) {
        if (o.equals(e.element))
            return index;
        index++;
    }
}
return -1;

}

remove:

    public boolean remove(Object o) {
        if (o==null) {
            for (Entry<E> e = header.next; e != header; e = e.next) {
                if (e.element==null) {
                    remove(e);
                    return true;
                }
            }
        } else {
            for (Entry<E> e = header.next; e != header; e = e.next) {
                if (o.equals(e.element)) {
                    remove(e);
                    return true;
                }
            }
        }
        return false;
    }

ArrayList:
add:

    public boolean add(E e) {
        ensureCapacity(size + 1);  
        elementData[size++] = e;
        return true;
        }

isEmpty:

    public boolean isEmpty(int o) {
    if (obj == null) {
        return true;
    }
    return false;
}

remove:

    public boolean remove(Object o) {
if (o == null) {
        for (int index = 0; index < size; index++)
    if (elementData[index] == null) {
        fastRemove(index);
        return true;
    }
} else {
    for (int index = 0; index < size; index++)
    if (o.equals(elementData[index])) {
        fastRemove(index);
        return true;
    }
    }
return false;
}
步骤 耗时 百分比
需求分析 90min 16.7%
代码实现 240min 44.4%
测试 150min 27.8%
分析总结 60min 11.1%

此次实验链接

我的链接

原文地址:https://www.cnblogs.com/Tiffany23/p/7615974.html