20192313 2020-2021-1 《数据结构与面向对象程序设计》实验六报告
课程:《程序设计与数据结构》
班级: 1923
姓名: 陈宇帆
学号:20192313
实验教师:王志强
实验日期:2020年11月5日
必修/选修: 必修
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)
实验要求
- 提交五个实验的运行结果截图以及代码截图。(后两个选做)
- 理解实验步骤和实验过程,通过实验中参考资料进行学习,并写出心得感悟。
2. 实验过程及结果
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)。
- 实验代码
package LinkList;
public class Node {
int data;
Node next=null;
public Node(int data){
this.data=data;
}
}
package LinkList;
public class input {
Node head=null;
Node temp=null;
public void addNode(int d){
Node N=new Node(d);
if (head==null)
{
head=N;
return;
}
temp=head;
while (temp.next!=null)
{
temp=temp.next;
}
temp.next=N;
}
}
package LinkList;
import java.util.Scanner;
public class Task1 {
public static void main(String[] args) {
Node node=null;
int cyf=0;
Scanner scan=new Scanner(System.in);
input add=new input();
int c[] = new int[11];
int i=0;
System.out.println("请按实验一的要求输入数字");
for (i=0;i<11;i++)
{
c[i]=scan.nextInt();
add.addNode(c[i]);
}
add.temp=add.head;
for (i=0;i<11;i++)
{
System.out.print(add.temp.data+" ");
add.temp=add.temp.next;
cyf++;
}
System.out.println("元素的总数是"+cyf);
}
}
- 实验运行截图
20192313是我的学号
2.链表练习,要求实现下列功能:
(2)实现节点插入、删除、输出操作(2分,3个知识点根据实际情况酌情扣分);
继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;
从磁盘读取一个文件, 这个文件有两个数字。
从文件中读入数字1, 插入到链表第 5 位,并打印所有数字,和元素的总数。 保留这个链表,继续下面的操作。
从文件中读入数字2, 插入到链表第 0 位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。
从链表中删除刚才的数字1. 并打印所有数字和元素的总数。
签入所有代码。
- 实验代码
package LinkList;
public class Task2_Node
{
Task2_Node next = null;
int data;
public Task2_Node(int data)
{
this.data = data;
}
}
package LinkList;
public class Task2_Link
{
Task2_Node head = null;
int cyf20192313 = 0;
public void AddNode(int d)
{
Task2_Node node = new Task2_Node(d);
if (head == null) {
head = node;
cyf20192313++;
return;
}
Task2_Node temp = head;
while (temp.next != null)
{
temp = temp.next;
}
temp.next = node;
cyf20192313++;
}
public void InsertNode(int index1,int d)
{
if (index1 > cyf20192313||index1 < 0)
{
System.out.println("超出范围!");
return;
}
int index = index1 - 1;
Task2_Node node = new Task2_Node(d);
Task2_Node temp = head;
int i;
for(i = 0;i < index-1;i++)
{
temp = temp.next;
}
node.next = temp.next;
temp.next = node;
cyf20192313++;
}
public boolean DeleteNode(int index)
{
if (index < 1 || index > Length())
{
System.out.println("超出范围!");
return false;
}
if (index == 1)
{
head = head.next;
cyf20192313--;
return true;
}
int i = 1;
Task2_Node preNode = head;
Task2_Node curNode = preNode.next;
while (curNode != null)
{
if (i == index-1)
{
preNode.next = curNode.next;
cyf20192313--;
return true;
}
preNode = curNode;
curNode = curNode.next;
i++;
}
return false;
}
public int Length()
{
return cyf20192313;
}
public boolean DeleteNode1(Task2_Node n)
{
if (n == null || n.next == null)
{
return false;
}
int tmp = n.data;
n.data = n.next.data;
n.next.data = tmp;
n.next = n.next.next;
System.out.println("删除成功!");
return true;
}
public void Print()
{
Task2_Node temp1 = head;
while (temp1 != null)
{
System.out.print(temp1.data+" ");
temp1 = temp1.next;
}
System.out.println();
}
public void Sort()
{
Task2_Node newHead = head;
int temp;
Task2_Node node = head;
while (node != null) {
Task2_Node reNode = node.next;
while (reNode != null) {
if (reNode.data < node.data) {
temp = reNode.data;
reNode.data = node.data;
node.data = temp;
}
reNode = reNode.next;
}
node = node.next;
}
}
}
package LinkList;
import java.io.*;
import java.util.Scanner;
public class Task3
{
public static void main(String[] args) throws IOException
{
Task2_Link link = new Task2_Link();
Scanner scan = new Scanner(System.in);
int n,a,b;
File file = new File("ShiYan6_2.txt");
if (!file.exists()){
file.createNewFile();
}
OutputStream outputStream1 = new FileOutputStream(file);
byte[] test1 = {'1','3'};
outputStream1.write(test1);
InputStream inputStream1 = new FileInputStream(file);
a = (char) inputStream1.read()-48;
b = (char) inputStream1.read()-48;
System.out.print("请输入整数,输入完毕请以0结束:");
for (;;)
{
n = scan.nextInt();
if (n == 0)
{
break;
}
link.AddNode(n);
}
System.out.println("输入完毕!");
System.out.print("输入的链表为:");
link.Print();
System.out.println("此时链表中的元素个数为:"+link.Length());
link.InsertNode(6,a);
System.out.print("将数据a添加进链表中:");
link.Print();
System.out.println("此时链表中的元素个数为:"+link.Length());
link.InsertNode(4,b);
System.out.print("将数据b添加进链表中:");
link.Print();
System.out.println("此时链表中的元素个数为:"+link.Length());
System.out.print("删除数据a:");
link.DeleteNode(2);
link.Print();
System.out.println("此时链表中的元素个数为:"+link.Length());
link.Sort();
System.out.print("使用选择排序对链表中的元素进行排序:");
link.Print();
}
}
- 实验运行截图
3.链表练习,要求实现下列功能:
(3)使用冒泡排序法或者选择排序法根据数值大小对链表进行排序(2分);
如果你学号是单数, 选择冒泡排序, 否则选择选择排序。
在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。
在(2)得到的程序中继续扩展, 用同一个程序文件,写不同的函数来实现这个功能。 仍然用 nZhangSan (你的名字)来表示元素的总数。
- 实验代码
package LinkList;
import java.io.*;
import java.util.Scanner;
public class Task3
{
public static void main(String[] args) throws IOException
{
Task2_Link link = new Task2_Link();
Scanner scan = new Scanner(System.in);
int n,a,b;
File file = new File("ShiYan6_2.txt");
if (!file.exists()){
file.createNewFile();
}
OutputStream outputStream1 = new FileOutputStream(file);
byte[] test1 = {'1','3'};
outputStream1.write(test1);
InputStream inputStream1 = new FileInputStream(file);
a = (char) inputStream1.read()-48;
b = (char) inputStream1.read()-48;
System.out.print("请输入整数,输入完毕请以0结束:");
for (;;)
{
n = scan.nextInt();
if (n == 0)
{
break;
}
link.AddNode(n);
}
System.out.println("输入完毕!");
System.out.print("输入的链表为:");
link.Print();
System.out.println("此时链表中的元素个数为:"+link.Length());
link.InsertNode(6,a);
System.out.print("将数据a添加进链表中:");
link.Print();
System.out.println("此时链表中的元素个数为:"+link.Length());
link.InsertNode(4,b);
System.out.print("将数据b添加进链表中:");
link.Print();
System.out.println("此时链表中的元素个数为:"+link.Length());
System.out.print("删除数据a:");
link.DeleteNode(2);
link.Print();
System.out.println("此时链表中的元素个数为:"+link.Length());
link.Sort();
System.out.print("使用选择排序对链表中的元素进行排序:");
link.Print();
}
}
- 实验运行截图
实验中遇到的问题和解决方法
实验还是挺顺畅的,没啥问题。
实验感悟
java学习可以这样比喻,看上去平平无奇,简单容易,一旦亲身实践起来会发现山重水复,一山放过一山拦。但也不是没有解决办法,因为java学习并不是一个人的学习,你只是在走别人走过的路,在觉得无路可走的时候,不妨问问过来人,你的学长学姐,你的老师,你的同学,你会很快发现新的办法,也就是柳暗花明。但同时,却不能轻易忽视动手锻炼的重要性,这绝不局限于老师课程要求的实验,平时还要勤加练习,敲敲课本代码就很关键,多练,多问,多总结,学习Java才能得心应手。