20172302 《Java軟件結構與數據結構》實驗一:線性結構實驗報告

課程:《Java軟件結構與數據結構》

班級: 1723

姓名: 侯澤洋

學號:20172302

實驗教師:王志強老師

實驗日期:2018年9月26日

必修/選修: 必修

實驗內容

  • (1)鏈表練習,要求實現下列功能:經過鍵盤輸入一些整數,創建一個鏈表,這些數是你學號中依次取出的兩位數, 再加上今天的時間。打印全部鏈表元素, 並輸出元素的總數。php

  • (2)鏈表練習,要求實現下列功能:實現節點插入、刪除、輸出操做,繼續你上一個程序, 擴展它的功能,每作完一個新功能,或者寫了超過10行新代碼,就簽入代碼,提交到源代碼服務器。java

  • (3)鏈表練習,要求實現下列功能:使用插入排序法或者選擇排序法根據數值大小對鏈表進行排序。在排序的每個輪次中, 打印元素的總數,和目前鏈表的全部元素。web

  • (4)數組練習,要求實現下列功能:(1)經過鍵盤輸入一些整數,創建一個數組;(2)實現節點插入、刪除、輸出操做。簽入全部代碼。windows

  • (5)數組練習,要求實現下列功能:使用插入排序法或者選擇排序法根據數值大小對數組進行排序,在排序的每個輪次中, 打印元素的總數,和目前數組的全部元素。數組

實驗過程及結果

(1)實驗一

這裏是要求咱們創建一個整數的鏈表,並將它們打印出來,同時要記錄元素的總數。
咱們首先創建一個節點類,這是創建鏈表的一個前提基礎,在這個類裏要設置好兩個變量,一個是指向下一數字的節點next;另外一個就是咱們在鏈表存儲的整數。採用方法重載給出兩種構造函數。服務器

public class LinearNode<T> {
    public int number;
    public LinearNode next;

    public LinearNode()
    {
        next = null;
    }
    public LinearNode(int number) {
        this.number = number;
        next = null;
    }
}

接下來即是開始創建鏈表。數據結構

實驗結果截圖:
函數

(2)實驗二

首先咱們要進行從文件中讀取數字這一操做,這裏首先要建立File對象,採用輸出流進行讀取,這裏是以字符爲單位讀取文件內容,一次讀一個字節,而後將讀取出的字符轉換爲對應數字,並將它們儲存在一個int型數組中。this

File file = new File("D:\\JAVA程序設計\\Java-pro\\text.txt");
        Reader reader = null;
        try {
            System.out.println("以字符爲單位讀取文件內容,一次讀一個字節:");
            reader = new InputStreamReader(new FileInputStream(file));
            int tempchar;
            int[] array = new int[2];
            int x = 0;
            while ((tempchar = reader.read()) != -1)
            {
                if (((char) tempchar) != '\r'&&((char) tempchar) != '\n')
                {
                    {
                        array[x]=tempchar-(int)('0');
                        System.out.print((array[x])+" ");
                        x++;
                    }
                }
            }
            reader.close();
} catch (Exception e) {
            e.printStackTrace();
        }

而後咱們進行如下操做:
1.從文件中讀入數字1, 插入到鏈表第 5 位,並打印全部數字,和元素的總數。 保留這個鏈表,繼續下面的操做。.net

//將數字1插入到鏈表第5位,並打印全部數字,和元素的總數
            int index = 4;

            System.out.println();
            LinearNode<Integer> current = linearNode;
            LinearNode linearNode1 = new LinearNode(array[0]);
            for (int y= 0;y<index-1;y++)
            {
                current = current.next;
            }
            linearNode1.next = current.next;
            current.next = linearNode1;
            nHouZeYang++;
            result = "";
            i = 0;
            integerLinearNode = linearNode;
            while (i<nHouZeYang)
            {
                result += integerLinearNode.number+" ";
                integerLinearNode = integerLinearNode.next;
                i++;
            }
            System.out.println("插入數字1後全部鏈表元素爲:"+result);
            System.out.println("插入數字1後元素個數爲:"+nHouZeYang);

2.從文件中讀入數字2, 插入到鏈表第 0 位,並打印全部數字,和元素的總數。 保留這個鏈表,並繼續下面的操做。

// 將將數字2插入到鏈表第0位,並打印全部數字,和元素的總數
            LinearNode linearNode2 = new LinearNode(array[1]);
            System.out.println(array[1]);
            current = linearNode;
            linearNode = linearNode2;
            linearNode.next = current;
            nHouZeYang++;
            result = "";
            i = 0;
            integerLinearNode = linearNode;
            while (i<nHouZeYang)
            {
                result += integerLinearNode.number+" ";
                integerLinearNode = integerLinearNode.next;
                i++;
            }
            System.out.println("插入數字2後全部鏈表元素爲:"+result);
            System.out.println("插入數字2後元素個數爲:"+nHouZeYang);

3.從鏈表中刪除剛纔的數字1. 並打印全部數字和元素的總數

//從鏈表中刪除剛纔的數字1.  並打印全部數字和元素的總數
            current = linearNode ;
            while (current.next!=linearNode1)
            {
                current = current.next;
            }
            current.next = current.next.next;

            nHouZeYang--;
            result = "";
            i = 0;
            integerLinearNode = linearNode;
            while (i<nHouZeYang)
            {
                result += integerLinearNode.number+" ";
                integerLinearNode = integerLinearNode.next;
                i++;
            }
            System.out.println("刪除數字1後全部鏈表元素爲:"+result);
            System.out.println("刪除數字1後元素個數爲:"+nHouZeYang);

實驗結果截圖:

(3)實驗三

使用選擇排序法對鏈表中元素進行排序,咱們首先看如下選擇排序法如何實現.

int min;
      T temp;

      for (int index = 0; index < data.length-1; index++)
      {
         min = index;
         for (int scan = index+1; scan < data.length; scan++)
            if (data[scan].compareTo(data[min]) < 0)
               min = scan;

         // Swap the values
         temp = data[min];
         data[min] = data[index];
         data[index] = temp;
      }

接下來再來實現鏈表中元素排序:

LinearNode<Integer> current = linearNode;

       while (current.next!=null)
       {
           LinearNode temp = current.next;
           int minNumber = current.number;
           while (temp!=null)
           {
               if(minNumber>temp.number)
               {
                   minNumber = temp.number;
               }
               temp = temp.next;
           }

           LinearNode current0 = current;

           while (current0.number!=minNumber)
           {
               current0 = current0.next;
           }
           current0.number = current.number;
           current.number = minNumber;
           result = "";
           i = 0;
           integerLinearNode = linearNode;
           while (i<nHouZeYang)
           {
               result += integerLinearNode.number+" ";
               integerLinearNode = integerLinearNode.next;
               i++;
           }
           System.out.println("排序中全部鏈表元素爲:"+result+" 元素個數爲:"+nHouZeYang);
           System.out.println();

實驗結果截圖:

(4)實驗四

上面進行的是鏈表練習,這裏將進行一些數組的練習:
(1)經過鍵盤輸入一些整數,創建一個數組;(2)實現節點插入、刪除、輸出操做;

實驗結果截圖:

(5)實驗五

數組練習,要求實現下列功能:使用插入排序法對數組中元素進行排序,在排序的每個輪次中, 打印元素的總數,和目前數組的全部元素。

for (int index = 1; index <nHouZeYang; index++)
        {
            int key = array[index];
            int position = index;

            //  Shift larger values to the right
            while (position > 0 && key<array[position-1])
            {
                array[position] = array[position-1];
                position--;
            }

            array[position] = key;

            result = "";
            for (int i = 0; i < nHouZeYang; i++) {
                result += array[i] + " ";
            }
            System.out.println("排序中全部數組元素爲:" + result);
            System.out.println("排序中元素個數爲:" + nHouZeYang);
        }

實驗結果截圖:

實驗過程當中遇到的問題和解決過程

  • 問題1:首先是創建鏈表時,產生一些問題,遇到空指針錯誤。

  • 問題1解決方案:這裏主要是把問題太過簡單化了,使用了以前jsjf包中的LinearNode類,想直接把全部的數字直接用setNext方法給處理了,實際則否則。因而從新創建了節點類,並修改其中代碼
    若鏈表爲空,將鏈表賦值爲要添加節點,若不爲空,則循環找到鏈表中下一節點爲空的節點,將其next賦爲待添加節點,完成創建鏈表。
if(linearNode==null)
                linearNode=tLinearNode;
            else
            {
                LinearNode<Integer> current = linearNode;
                while (current.next != null)
                    current = current.next;
                current.next = tLinearNode;

            }
  • 問題2:從文件讀取文本,並將其轉化爲數字類型,上學期學過,這裏沒有記住。

  • 問題2解決方案:從網上找了一些資料,將這裏從新複習了一下,最後採用單個讀取字節的形式實現;
File file = new File(fileName);
        Reader reader = null;
        try {
            System.out.println("以字符爲單位讀取文件內容,一次讀一個字節:");
            // 一次讀一個字符           
            reader = new InputStreamReader(new FileInputStream(file));
            int tempchar;
            while ((tempchar = reader.read()) != -1) {
                // 對於windows下,\r\n這兩個字符在一塊兒時,表示一個換行。
                // 但若是這兩個字符分開顯示時,會換兩次行。
                // 所以,屏蔽掉\r,或者屏蔽\n。不然,將會多出不少空行。                
                 if (((char) tempchar) != '\r')
                {
                    System.out.print((char) tempchar);
                }
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

可是按照這樣代碼仍然會出現錯誤,讀取出來的有13這個數字,對照ASCII碼錶,發現這個數字是回車符的ASCII碼值,因而嘗試將if (((char) tempchar) != '\r'){}改成if (((char) tempchar) != '\r'&&((char) tempchar) != '\n),修改以後讀取內容是正確的。
- 關於char型轉int型

char ch = '9';
int n = int(ch) - int('0');
此處ch也是‘0’至‘9’的數字字符

  • 問題3:在數組練習中要在原數組中間插入一個數字,這裏一開始覺得很簡單,可作的過程遇到了問題,見下圖:

  • 問題3解決方案:看了兩遍代碼以後,我知道問題出在了哪裏,每次我都是存儲了當前y值做爲temp,又把數組中索引爲(y+1)的元素賦爲temp,進行下一次循環時,y=y+1,此時temp便成了以前數組中索引爲(y+1)的元素,也就至關於temp先後沒有變化,致使了插入後每一個元素都變成了同一個。找到了問題,又去嘗試了好些改代碼的方式,仍然沒有解決,大概卡了10多分鐘以後,纔有了另外一種思路,我一開始的思路是一個個地從前日後將索引爲4的元素空出來,可這樣不會作了,那我是否是能夠從後往前去挪元素,將最後一個元素挪至它的下一位置,依次類推,直至將索引爲4元素移至索引爲5處,最後將索引爲4處元素賦爲要插入元素,問題也就得以解決,最後修改後代碼爲
int index = 4;
            for (int y = nHouZeYang;y>=4;y--)
            {
                array[y+1] = array[y];
            }
            array[index] = nums[0];

其餘(感悟、思考等)

  • 本次實驗大部分是在複習上學期所學過的內容,包括鏈表的創建,插入,刪除等操做,以及文件的讀取。數組這裏以前沒有練習過,但難度不算大。關於鏈表的排序這裏,上個學期也作過,但那時我是將鏈表元素逐個取出放入數組之中,再進行排序的,此次是直接用鏈表進行排序這一操做,直接對鏈表元素進行比較,完成排序,這裏完成的要比以前好一些。

參考資料

相關文章
相關標籤/搜索