20202302 2021-2022-1 《数据结构与面向对象程序设计》实验五和六报告
课程:《程序设计与数据结构》
班级: 2023
姓名: 吉相融
学号:20202302
实验教师:王志强
实验日期:2021年11月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.链表练习,要求实现下列功能:
- 实现节点插入、删除、输出操作;
继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;
从磁盘读取一个文件, 这个文件有两个数字。
从文件中读入数字1, 插入到链表第 5 位,并打印所有数字,和元素的总数。 保留这个链表,继续下面的操作。
从文件中读入数字2, 插入到链表第 0 位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。
从链表中删除刚才的数字1. 并打印所有数字和元素的总数。
3.链表练习,要求实现下列功能:
- 使用冒泡排序法或者选择排序法根据数值大小对链表进行排序;
如果你学号是单数, 选择冒泡排序, 否则选择选择排序。
在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。
在(2)得到的程序中继续扩展, 用同一个程序文件,写不同的函数来实现这个功能。 仍然用 nZhangSan (你的名字)来表示元素的总数。
4.在android上实现实验(1)和(2)
5.在android平台上实现实验(3)
<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)。
public class Chain { protected int element; protected Chain next = null; public Chain(int element) { this.element = element; this.next = next; } public int getElement() { return element; } public void setElement(int element) { this.element = element; } public Chain getNext() { return next; } public void setNext(Chain next) { this.next = next; } }
public class Chain { protected int element; protected Chain next = null; public Chain(int element) { this.element = element; this.next = next; } public int getElement() { return element; } public void setElement(int element) { this.element = element; } public Chain getNext() { return next; } public void setNext(Chain next) { this.next = next; import java.util.public class Chain_public static Chain head;
public static int nJiXiangRong = 0; public static void main(String[] args) { Scanner scan=new Scanner(System.in); System.out.println("请输入编号为("+(nJiXiangRong + 1)+")的数字.输入stop以停止"); String str = scan.nextLine(); Chain chain0 = new Chain(Integer.parseInt(str)); head = chain0; do{ nJiXiangRong++; System.out.println("请输入编号为("+(nJiXiangRong + 1)+")的数字.输入stop以停止"); str = scan.nextLine(); if(str.equals("stop")){ break; } Chain chain = new Chain(Integer.parseInt(str)); connect(head, chain); }while (!str.equals("stop")); System.out.println("Delete?(y/n)"); if (scan.nextLine().equals("y")){ System.out.println("请输入想删除元素的编号"); int node = scan.nextInt(); delete(head, node); } PrintLinkedList(head); System.out.println("元素的个数为: " + nJiXiangRong); } public static void connect(Chain head, Chain chain2){ Chain head2 = head; while (head2.getNext() != null){ head2 = head2.getNext(); } head2.setNext(chain2); } public static void PrintLinkedList(Chain head){ Chain temp = head; String list = ""; while (temp != null){ list = list + " " + temp.getElement(); temp = temp.getNext(); } System.out.println(list); } public static void delete(Chain head, int node){ Chain temp = head; if(node == 1) {
Chain_2.head = head.getNext(); } else { for(int i = 1; i < node - 1; i++){ temp = temp.getNext(); } } temp.setNext(temp.getNext().getNext()); } }
<2>.链表练习,要求实现下列功能:
- 实现节点插入、删除、输出操作;
继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;
从磁盘读取一个文件, 这个文件有两个数字。
从文件中读入数字1, 插入到链表第 5 位,并打印所有数字,和元素的总数。 保留这个链表,继续下面的操作。
从文件中读入数字2, 插入到链表第 0 位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。
从链表中删除刚才的数字1. 并打印所有数字和元素的总数。
- 代码如上,不再粘贴。

<3>.链表练习,要求实现下列功能:
- 使用冒泡排序法或者选择排序法根据数值大小对链表进行排序;
如果你学号是单数, 选择冒泡排序, 否则选择选择排序。
在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。
在(2)得到的程序中继续扩展, 用同一个程序文件,写不同的函数来实现这个功能。 仍然用 nZhangSan (你的名字)来表示元素的总数。
- 码云地址:
- https://gitee.com/jixiangrong/jxr20202302/blob/master/%E5%AE%9E%E9%AA%8C%E4%BA%94%E5%AE%9E%E9%AA%8C%E5%85%AD/Chain_2.java
- 我的学号是双数,所以选择排序。
public static void main(String[] args) throws IOException { Scanner scan=new Scanner(System.in); System.out.println("请输入编号为("+(nJiXiangRong + 1)+")的数字.输入stop以停止"); String str = scan.nextLine(); Chain chain0 = new Chain(Integer.parseInt(str)); head = chain0; do{ nJiXiangRong++; System.out.println("请输入编号为("+(nJiXiangRong + 1)+")的数字.输入stop以停止"); str = scan.nextLine(); if(str.equals("stop")){ break; } Chain chain = new Chain(Integer.parseInt(str)); connect(head, chain); }while (!str.equals("stop")); System.out.println("Delete?(y/n)"); if (scan.nextLine().equals("y")){ System.out.println("请输入想删除元素的编号:"); int node = scan.nextInt(); delete(head, node); } //插入 System.out.println("Insert?(y/n)"); if(scan.next().equals("y")){ //此处不可next.Line,否则会读走剩下的链表 System.out.println("请输入你想插入编号的位置:"); int node = scan.nextInt(); System.out.println("请输入你要在该位置插入的元素: "); int element = scan.nextInt(); insert(head, element, node); } PrintLinkedList(head); File file = new File("C:\\Users\\Jixiangrong\\Desktop\\study\\java\\实验五六","Chain.txt"); OutputStream outputStream = new FileOutputStream(file); byte[] insert2 = {55,66}; outputStream.write(insert2); InputStream inputStream = new FileInputStream(file); int[] num = new int[2]; int by = 0; while (inputStream.available() > 0){ num[by] = inputStream.read(); by++; } outputStream.close(); inputStream.close(); System.out.print("File content is: "); for(int i = 0; i < 2; i++) { System.out.print(num[i] + " "); } System.out.print("\n"); insert(head, num[0], 5); PrintLinkedList(head); insert(head, num[1], 1); PrintLinkedList(head); delete(head, 6); PrintLinkedList(head); rank(); PrintLinkedList(head); } public static void connect(Chain head, Chain chain2){ Chain head2 = head; while (head2.getNext() != null){ head2 = head2.getNext(); } head2.setNext(chain2); } public static void PrintLinkedList(Chain head){ Chain temp = head; String list = ""; while (temp != null){ list = list + " " + temp.getElement(); temp = temp.getNext(); } System.out.println(list); System.out.println("元素的个数为:" + nJiXiangRong); } public static void delete(Chain head, int node){ Chain temp = head; if(node == 1) { Chain_2.head = head.getNext(); } else { for(int i = 1; i < node - 1; i++){ temp = temp.getNext(); } } temp.setNext(temp.getNext().getNext()); nJiXiangRong--; } public static void insert(Chain head, int element, int node){ Chain insert = new Chain(element); Chain temp = head; if(node == 1){ insert.setNext(head); Chain_2.head = insert; } else { for(int i = 0; i < node - 2; i++){ temp = temp.getNext(); } insert.setNext(temp.getNext()); temp.setNext(insert); } nJiXiangRong++; } public static void rank(){ Chain temp = Chain_2.head; Chain temp1 = Chain_2.head; int t , w = 1, e = 1; for(int i = 1; i < nJiXiangRong; i++){ t = temp.getElement(); while (temp1.getNext() != null){ temp1 = temp1.getNext(); w++; if(temp1.getElement() > t){ t = temp1.getElement(); e = w + 1; } } insert(head, t, i); delete(head, e); PrintLinkedList(head); w = i + 1; if(e <= w) temp = temp.getNext(); temp1 = temp; if(temp1.getNext() == null) break; } } }
运行结果:
## 3. 实验过程中遇到的问题和解决过程

由于本机的芯片为AMD,所以虚拟机总是无法仿真成功。我也找了许多方法以求解决,比如:
调整SDK Tools来试图适配AMD,然而,结果却丝毫未变:
随后,我又尝试了用命令行解决问题,然而:
(完全安装不进去)
然后我便四处问同学问学长学姐,然而他们竭尽全力也没能为我提供有力的帮助。。。。。此时我的内心已经接近崩溃。
然后我看到网上一个帖子,说可以通过设置允许AMD与Android互通,于是:
然而结果依旧没有任何改变。
后来我看到一个CSDN是这样说的:AMD可以直接连接安卓手机
然后更有意思的事情发生了
我问了一圈,不是苹果的IOS就是鸿蒙。
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,果然苹果和华为基本占领了市场呢
安装的genymotion又是这副德行:
........
十九年间几乎没有怎样体验过绝望,这两天彻彻底底体验了一把。
望着加分实验,心里不由地涌起一种无力感。
现在离截止时间只剩几十分钟了......罢了罢了,缘分未到
我觉得这两天的实验,自己的能力不论提升没有,心态绝对是被练了一把
感谢Android Studio,感谢java。
## 其他(感悟、思考等)
学海无涯,仍需努力。这次实验锻炼了我的心态,我觉得非常可贵。可能这就是学习的本质吧,或许也是生活的本质。
# 参考资料
- [《Java和Andriod开发学习指南(第二版)人民邮电出版社》]
- [《Java软件结构与数据结构(第三版)清华大学出版社》]
CSDN