20192314于鲲洋 2020-2021-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)。

1.程序代码

import java.util.Scanner;

public class ex61 {
public static void main(String[] args) {
    int[] x = new int[11];
    Scanner sc = new Scanner(System.in);
    int y = 0;
    for (y = 0; y <= 10; y++) {
        x[y] = sc.nextInt();
    }
    sc.close();
    ex61zhulei a = new ex61zhulei(x[0]);
    ex61zhulei b = new ex61zhulei(x[1]);
    ex61zhulei c = new ex61zhulei(x[2]);
    ex61zhulei d = new ex61zhulei(x[3]);
    ex61zhulei e = new ex61zhulei(x[4]);
    ex61zhulei f = new ex61zhulei(x[5]);
    ex61zhulei g = new ex61zhulei(x[6]);
    ex61zhulei h = new ex61zhulei(x[7]);
    ex61zhulei i = new ex61zhulei(x[8]);
    ex61zhulei j = new ex61zhulei(x[9]);
    ex61zhulei k = new ex61zhulei(x[10]);

    ex61zhulei head = a;
    a.next = b;
    b.next = c;
    c.next = d;
    d.next = e;
    e.next = f;
    f.next = g;
    g.next = h;
    h.next = i;
    i.next = j;
    j.next = k;

    ex61.Printlinkedlist(a);
}

public static void Printlinkedlist(ex61zhulei head) {
    ex61zhulei point = head;
    int Yukunyang = 0;
    while(point != null){
        System.out.println("number:"+point.number);
        point = point.next;
        Yukunyang++;
    }
    System.out.println("Yukunyang:"+Yukunyang);
}

}

public class ex61zhulei {
protected int number;
protected ex61zhulei next = null;

public ex61zhulei(int number) {
    this.number = number;
}


@Override
public String toString() {
    return "ex61zhulei{" +
            "number=" + number +
            ", next=" + next +
            '}';
}

}

2.运行截图



2.链表练习,要求实现下列功能:

实现节点插入、删除、输出操作;

继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;

从磁盘读取一个文件, 这个文件有两个数字。

从文件中读入数字1, 插入到链表第 5 位,并打印所有数字,和元素的总数。 保留这个链表,继续下面的操作。

从文件中读入数字2, 插入到链表第 0 位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。

从链表中删除刚才的数字1. 并打印所有数字和元素的总数。

3.链表练习,要求实现下列功能:

使用冒泡排序法或者选择排序法根据数值大小对链表进行排序;

如果你学号是单数, 选择冒泡排序, 否则选择选择排序。

在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。

在(2)得到的程序中继续扩展, 用同一个程序文件,写不同的函数来实现这个功能。 仍然用 nZhangSan (你的名字)来表示元素的总数。

我的(2)和(3)的功能在同一个程序中实现

1.程序代码

Main

import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
public static void main(String[] args) throws IOException {
    Scanner scan = new Scanner(System.in);
    System.out.println("Please input your studentnumber and the time (eg: 20,19,23,14,20,20,11,8,14,4,30)");
    String sen = scan.nextLine();
    int yky = 0, number2;
    int[] number = new int[100];//定义数组
    String[] numbers = sen.split(",");//用,分割字符串

    //将字符串转化为int型并且放入数组
    for (int m = 0; m < numbers.length; m++) {
        number[m] = Integer.parseInt(numbers[m]);
    }

    //实例化并且定义Head的表头
    Link Head = new Link(number[0]);

    //形成数组链表
    int nYukunyang = 1;
    for (int a = 1; a < numbers.length; a++) {
        Link node = new Link(number[a]);
        Head.BackLink(Head, node);
        nYukunyang++;
    }

    //创建文件
    File file = new File("LinkNum.txt");
    if (!file.exists()) {
        file.createNewFile();
    }
    Writer writer1 = new FileWriter(file);
    writer1.write("2019 ");
    writer1.flush();


    writer1.append("2330");
    writer1.flush();


    Reader reader = new FileReader(file);
    BufferedReader bufferedreader = new BufferedReader(reader);
    StringTokenizer stringTokenizer = new StringTokenizer(bufferedreader.readLine());
    number2 = stringTokenizer.countTokens();
    int[] ints = new int[number2];
    while (stringTokenizer.hasMoreTokens()) {
        ints[yky] = Integer.parseInt(stringTokenizer.nextToken());
        yky++;
    }

    Link q = new Link(ints[0]);
    Link p = new Link(ints[1]);

    System.out.println("The list is: ");
    Head.toString();
    System.out.println();
    System.out.println("There are " + nYukunyang + " numbers in the list");

    Link Head1= Link.HeadInsert(Head, p);
    System.out.println("There are " + nYukunyang++ + " numbers in the list");
    System.out.println();


    Link.MidInsert(Head1, q, 5);
    System.out.println("There are " + nYukunyang++ + " numbers in the list");
    System.out.println();

    Link.DeleteLink(Head1, 5);
    System.out.println("There are " + nYukunyang-- + " numbers in the list");
    System.out.println();

    Link.SelectionSort(Head1);
    System.out.println("There are " + nYukunyang + " numbers in the list");
    System.out.println();
}

}

public class Link {
protected int number;
protected Link next = null;

public Link(int number){
    this.number = number;
}

public String toString()
{
    Link node =this;
    while (node!=null) {
        System.out.print(node.number+" ");
        node = node.next;
    }
    System.out.println();
    return null;
}

//尾插法
public void BackLink(Link Head,Link node1){
    Link temp=Head;
    while(temp.next!=null)
        temp=temp.next;

    temp.next=node1;
}

//头插法
public static Link HeadInsert(Link Head,Link node){
    System.out.println("The list headinserted is: ");
    node.next=Head;
    Head=node;
    Head.toString();
    return Head;
}

//中间插入
public  static void MidInsert(Link Head,Link node1,int place){
    System.out.println("The list midinserted is: ");
    Link temp= Head;

    int a=1;
    while(a<4){
        temp= temp.next;
        a++;
    }
    node1.next=temp.next;
    temp.next=node1;
    Head.toString();

}

//删除
public static void DeleteLink(Link Head, int t) {//删除可以指向他的下一个元素
    System.out.println("The list deleted is: ");
    Link temp = Head;
    Link temp1=Head;
    Link node=Head;
    for (int i = 0; i < t-2; i++) {
        temp1 = temp1.next;
    }
    temp1.next = temp1.next.next;
    while (temp1!=null) {
        temp1 = temp1.next;
    }
    Head.toString();
}

//选择排序
public static void SelectionSort(Link Head) {
    System.out.println("The list after selectiondort is: ");
    int temp;
    Link node = Head;
    while (node != null) {
        Link reNode = node.next;
        while (reNode != null) {
            if (reNode.number > node.number) {
                temp = reNode.number;
                reNode.number = node.number;
                node.number = temp;
            }
            reNode = reNode.next;
        }
        node = node.next;
    }
    Head.toString();
}

}

2.运行截图



实验问题解决和心得体会

在做第一个任务时,遇到的问题是输入11个数之后无法输出任何内容,后来加上了ex61.Printlinkedlist(a),将代码前后两部分连起来,正常输出了结果。任务三中我需要使用选择排序法,但是打一下学C语言时我只会冒泡排序法。之后我借助百度和同学的帮助学会了选择排序法。我对栈和链表的使用还十分低级,比如任务一需要输入11个数,我就重复了11次.next,如果想要更简捷应该使用数组,这些都是我需要学习掌握的地方。不能只满足于实现功能,应该追求更加高效简捷地实现功能。

posted @ 2020-11-11 22:21  √子非鱼  阅读(110)  评论(0编辑  收藏  举报