20172305 2018-2019-1 《程序设计与数据结构》实验一报告

20172305 2018-2019-1 《程序设计与数据结构》实验一报告

课程:《Java软件结构与数据结构》
班级: 1723
姓名: 谭鑫
学号:20172305
实验教师:王志强
实验日期:2018年9月25日
必修/选修: 必修

1.实验内容

  • 实验一--链表练习,要求实现下列功能:

    • (1)通过键盘输入一些整数,建立一个链表。
    • (2)打印所有链表元素, 并输出元素的总数,请用一个特殊变量名来纪录元素的总数,变量名就是你的名字。
  • 实验一--链表练习,要求实现下列功能:

    • (1)实现节点插入、删除、输出操作(2分,3个知识点根据实际情况酌情扣分);继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;
    • (2)从磁盘读取一个文件, 这个文件有两个数字。
    • (3)从文件中读入数字1,插入到链表第5位,并打印所有数字,和元素的总数。保留这个链表,继续下面的操作。
    • (4)从文件中读入数字2,插入到链表第0位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。
    • (5)从链表中删除刚才的数字1,并打印所有数字和元素的总数。
  • 实验一--链表练习,要求实现下列功能:

    • (1)使用冒泡排序法或者选择排序法根据数值大小对链表进行排序;如果你学号是单数, 选择冒泡排序, 否则选择选择排序。在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。
  • 实验一--数组练习,要求实现下列功能:

    • (1)通过键盘输入一些整数,建立一个数组。
    • (2)打印所有数组元素, 并输出元素的总数。
      在你的程序中,请用一个特殊变量名来纪录元素的总数,变量名就是你的名字。
    • (3)实现节点插入、删除、输出操作(2分,3个知识点根据实际情况酌情扣分);继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;
    • (4)从磁盘读取一个文件, 这个文件有两个数字。
    • (5)从文件中读入数字1,插入到链表第5位,并打印所有数字,和元素的总数。保留这个链表,继续下面的操作。 从文件中读入数字2,
    • (6)插入到链表第0位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。
    • (7)从链表中删除刚才的数字1,并打印所有数字和元素的总数。
  • 实验一--数组练习,要求实现下列功能:

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

2. 实验过程及结果

  • 实验(1)-(3)就是建立链表的过程,实验(4)-(5)就是建立数组的过程,看起来两部分都很简单,因为有相关代码和方法,不过在慢慢敲的过程中才发现数组的插入和删除没有方法,还有冒泡排序和选择排序的方法,此外还要实现IO流的问题,从文件中读取数字。所以,不简单...

  • 实验一--链表练习(1):这部分相对简单,对添加的元素进行输出以及统计元素数目,只需加一个计数的整型变量以和实现添加到链表的方法就行,考虑到后面的编写。进行类的编写以及变量int nTanXin = 0

    • 结果:
  • 实验一--链表练习(2):按索引值在链表上添加元素和删除元素的方法,这部分在之前的测试内容上都涉及到相关内容,很容易就写成了。比较头疼的是读文件内的数字,上学期学过的IO流到现在早都忘的差不多了。翻着上学期的相关代码,看着注释一步步捡起。

    • 结果:
  • 实验一--链表练习(3):链表内元素按照冒泡排序方式进行一步步的输出。上学期学过的两个排序方法--选择排序和插入排序,没有冒泡排序。好在通过老师上课的讲解,搞懂一些皮毛,通过老师推荐的网站加持勉强写出来。

    • 结果:
  • 实验一--数组练习(4):以为这部分可以的编写可以直接Ctrl + c和Ctrl + v就可以了,但是找了半天没有插入和删除的相关代码。插入的思路就是在插入位置后面的所有元素的索引值加一就好,删除的思路就是在删除元素的后面的所有元素的索引值减一就好。

    • 结果:
  • 实验一--数组练习(5):对数组的内容进行选择排序,借助上学期Sorting代码进行改写,但是要实现每部操作都要输出的内容,最简单粗暴的方法就是在两个for循环内穿插输出语句,看输出内容是否符合。

    • 结果:

3. 实验过程中遇到的问题和解决过程

  • 问题1:冒泡排序的代码分析
  • 问题1的解决方案:冒泡排序就是重复地遍历过要排序的链表,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历链表的工作是重复地进行直到没有再需要交换,也就是说该链表已经排序完成。通过老师给出的网站,我们可以看到排序的每一次步骤就像是气泡一样从一侧到另一侧。在头结点不为空的情况下,添加两个while循环,如果添加一个的话,从实现的角度来看只会出现一次排序过程,所以添加了两个循环内容,条件看似一样,但是在意义上,内循环通过temp1所指数字与temp的下一个进行大小比较,不符合就进行相邻元素的交换。然后往下执行输出的代码,然后在链表上继续向下遍历。直至跳出内循环,然后通过交换又从头开始进行遍历直至排序结束。为了表示第几次排序,特意添加一个单独的计数变量,进行输出次数。对于老师要求的在每一次显示的过程中也要显示元素的数量,觉得在排序过程中没有元素树木上的变化,就用变量nTanXin在每一次输出的中显示。
intNode temp1 = head, temp2 = null;
int num = 0;
while(temp1.next != temp2){
    while(temp1.next != temp2){
        if(temp1.next.getNumber() < temp1.getNumber()){
            int number = temp1.getNumber();
            temp1.setNumber(temp1.next.getNumber());
            temp1.next.setNumber(number);
        }
        temp1 = temp1.next;
        num++;
        intNode temp = head;
        System.out.print("第" + num + "次:(元素总数:" + nTanXin +")");
        while (temp != null) {
            System.out.print(temp.getNumber()+" ");
            temp = temp.next;
        }
        System.out.println();
    }
    temp2 = temp1;
    temp1 = head;
}

  • 问题2:IO流读写文件中内容
  • 问题2的解决方案:早在上学期就学过的东西,本学期运用的时候却处处碰壁,好在码云上有相关代码。从文件中读取的代码有了,但是如何创建文件,并往里面写入数字又是一个问题。BufferedReader对应的输入缓存流BufferedOutputStream可以将字符串以字节的形式写到指定文件中。所以,在读取文件之前我用BufferedOutputStream相关的方法进行写入,缓存流算有个特点就是需要刷新一下,而我第一次运行就因为没有刷新直接关闭导致文件建成但是内容没有,找了好半天才发现缺少刷新的相关代码。
从文件中读取内容:
File file = new File("sort.txt");
Reader reader = new FileReader(file);
BufferedReader bufferedreader = new BufferedReader(reader);
String string = bufferedreader.readLine();
往文件中写入内容:
File file = new File("sort.txt");
OutputStream outputstream = new FileOutputStream(file);
BufferedOutputStream bufferedoutputstream = new BufferedOutputStream(outputstream);
String str = "xxxxxxx";
bufferedoutputstream.write(str.getBytes());
bufferedoutputstream.flush();
bufferedoutputstream.close();
  • 问题3:关于数组的插入和删除
  • 问题3的解决方案:数组的插入和删除不同于链表的插入和删除,链表的插入直接串在一起就好,删除就是抠出去删除元素然后连接在一起。但是,数组的插入和删除需要进行移位,也考虑过环形数组在一定程度上可以避免移位,不过也只是在头尾进行添加和删除的。所以,不可避免的进行移位,想在循环体运用是三行代码进行一位一位的交换,可是调来调去都是在添加元素后面一成不变的都是同一个数。改了半天也没有一点变化,就换为暂时数组来解决了。暂时数组的商都就是插入或是删除的索引值与总数目的差。换成用暂时数组就好了。
交换的代码
temp = min;
min = num;
num = temp;

其他

实验一的五个实验在座的过程中发现对于上学期的只是还是有很多不足的,在学习新知识的同时还要兼顾温习旧知识,就像IO流的相关代码,如果好好温习的话就不会出现问题的。还有排序和插入、删除的问题全都是逻辑问题,考虑的一定要周到全面才不会处处碰壁。

参考资料

posted @ 2018-10-07 21:16  三金哥  阅读(219)  评论(0编辑  收藏  举报