2018-2019-20172309 《程序设计与数据结构》实验一报告
2018-2019-20172309 《程序设计与数据结构》实验一报告
课程:《程序设计与数据结构(下)》
**班级: **1723
姓名: 王志伟
学号:20172309
实验教师:王志强老师
实验日期:2018年9月27日
必修/选修: 必修
1.实验内容
实验1.1:线性结构之链表:
- 实验要求:
- 通过键盘输入一些整数,建立一个链表(1分);
- 这些数是你学号中依次取出的两位数。 再加上今天的时间。
- 打印所有链表元素, 并输出元素的总数。
- 在你的程序中,请用一个特殊变量名来纪录元素的总数,变量名就是你的名字。
- 把程序签入源代码控制(git push)。
- 代码地址
- 运行结果:
实验1.2:线性结构之链表(拓展):
- 实验要求:
- 实现节点的插入,删除,输出操作(2分);
2.从磁盘读取一个文件, 这个文件有两个数字。 - 从文件中读入数字1, 插入到链表第 5 位,并打印所有数字,和元素的总数。 保留这个链表,继续下面的操作。
- 从文件中读入数字2, 插入到链表第 0 位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。
- 从链表中删除刚才的数字1. 并打印所有数字和元素的总数。
- 代码地址
- 运行结果:
实验1.3:线性结构之链表之排序:
- 实验要求:1. 使用冒泡排序法或者选择排序法根据数值大小对链表进行排序(2分);
- 使用冒泡排序法或者选择排序法根据数值大小对链表进行排序(2分);
- 在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。
- 代码地址
- 运行结果:
实验1.4:线性结构之数组:
- 实验要求:
1.通过键盘输入一些整数,建立一个链表(1分);
2.这些数是你学号中依次取出的两位数。 再加上今天的时间。
3.打印所有数组元素, 并输出元素的总数。
4.在你的程序中,请用一个特殊变量名来纪录元素的总数。 - (实验链接)[https://gitee.com/CS-IMIS-23/20172309_javaProgramming/commit/03080d4c3f312ecb813d9fbe330bfcc309157efb]
- 实验结果:
实验1.5:线性结构之数组之拓展:
- 实验要求:
1.使用冒泡排序法或者选择排序法根据数值大小对数组进行排序(2分);
2.如果你学号是单数, 选择选择排序, 否则选择冒泡排序。
3.在排序的每一个轮次中, 打印元素的总数,和目前数组的所有元素。 - (实验链接)[https://gitee.com/CS-IMIS-23/20172309_javaProgramming/commit/68e8b7a08bf2a3375969d1df774dcf7543a12a24]
- 实验结果:
2.遇到的问题及解决方案:
2.1实验01中遇到的问题:
- 问题一:在设置节点与结点之间的连接时出现了问题,结果输出链表时,只出现首尾结点。之后发现出现的问题是:直接使用了
head =head.next
正确的做法是:LinearNode temp = head
、temp = temp.next
- 问题二:在写方法的时候,记得以前可以在main函数中直接调用方法。但是不太记得怎么写这个方法,所以直接在main函数中直接调用了一下方法,之后说是不是静态方法。所以知道了相关知识是静态方法与实例方法,所以我去百度了一下相关知识:
个人觉得这篇讲的很好
总的来说是:
方法 | 对象.方法 | 直接调用方法 | 调用静态成员变量 | 调用实例成员变量 |
---|---|---|---|---|
静态方法 | √ | √ | √ | × |
实例方法 | √ | × | √ | √ |
做法: 所以我把静态方法里面用到的变量都加上了static
,之后就成功了。O(∩_∩)O哈哈~
2.2实验02中遇到的问题:
-
嗯,在进行插入是,插入的后一部分丢了!!!:
出现这个问题的原因是:当输入node.next =temp;
,node已经等于temp,temp.next = node.next.next;
此时temp.next为null,所以后面就没了,解决方法就是使用两个指针。 -
首先看到这个实验觉得很简单,但是我到了交作业的前两天才知道,实验要求的是在指定位置插入、删除元素。而我写的方法就像是栈里面的push、与pop。o(╥﹏╥)o,之后我只好重写,之后在写的过程中出现了这个问题:
这个问题是,在插入的不显示是什么,而是地址!!!!出现这个问题后我表示很茫然,之后使用双指针这个问题就没有了(以前用了一个指针)···· -
修改后的代码:
public void insert(int place,int element){
LinearNode node1,node2;
LinearNode temp = new LinearNode(element);
if (place==0){
temp.next = Head;
Head =temp;
}
else {
node1=Head;
node2=Head.next;
for (int i =0; i<place-1;i++){
node1=node1.next;
node2=node2.next;
}
if (node2!=null){
temp.next=node2;
node1.next=temp;
}
else {
node1.next=temp;
}
nWangZhiwei++;
}
}
2.3实验03中出现的问题及解决方案:
- 刚刚看到这个实验的时候感觉没什么思路,因为根本不知道冒泡排序是什么,之后学习了冒泡排序是什么之后还是很懵逼~~~~·因为不知道怎么对链表进行排序,一开始的时候以为要交换链表的位置,自己感觉很麻烦。之后不知道什么时候突然想到了可以直接把一个String型值传进去,再换成数组,再进行排序,这样就会很简单(因为以前做过,现在也是这么做的!)
- 其次就是很不理解这个条件
在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。
了,明明链表里的元素个数都没什么变化,为什么还要每次都打印出来? - 说了这么多直接写方法吧:
for(int i =0;i < score.length - 1;i++){//使用冒泡排序
for(int j = 0;j < score.length - 1-i;j++){ // j开始等于0,
if(score[j] < score[j+1]) {
int temp = score[j];
score[j] = score[j+1];
score[j+1] = temp;
for (int p =0 ;p<score.length;p++){
result+= score[p]+ " ";
}
result+="链表中的数量:"+nWangZhiwei;//每一部完成后都打印出来,并加上链表中元素个数。
result+="\n";
}
2.4实验04中出现的问题及解决方案:
- 在做这个实验的时候出现了一个问题:如图
就是在第四个位置插入元素,插入后原来的第四个元素丢了······
这是代码
之后把第二个框的i改成i-1 之后出现这个问题:
,原因是越界!!
之后仔细想想才知道了原因,自己的逻辑并没有什么问题只是应该这样改:
(出现越界的原因是当插入第一个元素时,它会进入到else
temp[i]=array[i-1];
此时i=0,i-1=-1。所以越界!!1)