20172323 2018-2019-1 《程序設計與數據結構》實驗一報告

20172323 2018-2019-1 《程序設計與數據結構》實驗一報告

課程:《程序設計與數據結構》
班級: 1723
姓名: 王禹涵
學號:20172323
實驗教師:王志強
實驗日期:2018年10月6日
必修/選修: 必修php

1.實驗內容

線性結構之鏈表
鏈表練習,要求實現下列功能:
(1)經過鍵盤輸入一些整數,創建一個鏈表;
這些數是你學號中依次取出的兩位數再加上今天的時間。html

例如你的學號是 20172301
今天時間是 2018/10/1, 16:23:49秒
數字就是
20, 17,23,1, 20, 18,10,1,16,23,49java

打印全部鏈表元素, 並輸出元素的總數。
在你的程序中,請用一個特殊變量名來紀錄元素的總數,變量名就是你的名字。
例如你叫 張三, 那麼這個變量名就是int nZhangSan = 0;//初始化爲 0.
作完這一步,把你的程序簽入源代碼控制(git push)。
(2)實現節點插入、刪除、輸出操做;
繼續你上一個程序, 擴展它的功能,每作完一個新功能,或者寫了超過10行新代碼,就簽入代碼,提交到源代碼服務器;git

從磁盤讀取一個文件, 這個文件有兩個數字。 
從文件中讀入數字1,  插入到鏈表第 5 位,並打印全部數字,和元素的總數。 保留這個鏈表,繼續下面的操做。 
從文件中讀入數字2, 插入到鏈表第 0 位,並打印全部數字,和元素的總數。 保留這個鏈表,並繼續下面的操做。 
從鏈表中刪除剛纔的數字1.  並打印全部數字和元素的總數。

簽入全部代碼。
(3)使用冒泡排序法或者選擇排序法根據數值大小對鏈表進行排序;
若是你學號是單數, 選擇冒泡排序, 不然選擇選擇排序。
在排序的每個輪次中, 打印元素的總數,和目前鏈表的全部元素。
在(2)獲得的程序中繼續擴展, 用同一個程序文件,寫不一樣的函數來實現這個功能。 仍然用 nZhangSan (你的名字)來表示元素的總數。web


線性結構之數組
數組練習,要求實現下列功能:
(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分);
若是你學號是單數, 選擇選擇排序, 不然選擇冒泡排序。
在排序的每個輪次中, 打印元素的總數,和目前數組的全部元素。
在(2)獲得的程序中繼續擴展, 用同一個程序文件,寫不一樣的函數來實現這個功能。 仍然用 nZhangSan (你的名字)來表示元素的總數。

2. 實驗過程及結果

鏈表

鏈表部分的實現依託以前作過的實踐鏈表插入。所以本次實驗要求的建立鏈表、插入、刪除、選擇排序等等都已經解決,參照以前寫過的課堂實踐,只有幾個小地方須要編寫
從磁盤文件中讀入數字
String path = "C:\\Users\\10673\\IdeaProjects\\20172323_wang_yuhan_new\\src\\Week03\\number.txt";//引號內是所讀磁盤文件的地址
File file = new File(path);
BufferedReader bw = new BufferedReader(new FileReader(file));
String line = bw.readLine();
要讀入的文件

冒泡排序
雖然最後要求能夠不用冒泡排序,可是我仍是想嘗試一下。

冒泡排序算法的原理以下:
1.比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。
2.對每一對相鄰元素作一樣的工做,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
3.針對全部的元素重複以上的步驟,除了最後一個。
4.持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較。

明白了基本原理,再參見了一些經驗Java中的經典算法之冒泡排序(Bubble Sort)。我大體明白瞭如何完成冒泡排序的操做。首先是要實現一個雙重循環語句,內層控制一個數與以後的數值進行比較,若是前一個值大於後一個值就交換順序,若是小於就進行外層循環,變換執行內層循環的值(當前數字集合的第一個值),直到排序完成。

for(int i=1;i<arr.length;i++){

    for(int j=1;j<arr.length-i;j++){

    //交換位置

}

進行內層的比較時須要設置一箇中間變量temp,由於是用數組來存儲這一串數字。具體代碼以下

if (Integer.parseInt(arr[j]) > Integer.parseInt(arr[j + 1])){
                    String temp = arr[j];
                    arr[j] =arr[j + 1];
                    arr[j + 1] = temp;
                }

同時爲了知足「在排序的每個輪次中, 打印元素的總數,和目前數組的全部元素。」須要在每一個內層循環中輸出,元素總數用數組的長度表示。

System.out.println("(第" + n +"次排序)");//n在每次循環後加一表示循環的次數
                System.out.println("當前鏈表爲:");
                for(String num:arr){
                    System.out.print(num + " ");
                }
                System.out.println("當前有" + wangyuhan + "個元素在鏈表中");

最終排序的結果如圖

記錄元素總數
一開始設置int nWangYuHan = 0每執行一次添加或插入操做nWangYuHan加一,每執行一次刪除操做nWangYuHan減一。

數組

數組實現以上要求操做的核心我認爲在於建立兩個數組array以及temp。進行添加操做時即把全部數字添加到array數組裏,執行插入時將插入位置及之後的數字存入temp數組內,插入新數字以後,再將temp數組內的數字一一添加到array數組內。一樣地,執行刪除時,把刪除位置以後的全部數字存入temp數組內,再從array的刪除位置開始一一存入。代碼如圖

選擇排序
簡單選擇排序的基本思想:給定數組:int[] arr={裏面n個數據};第1趟排序,在待排序數據arr[1]~arr[n]中選出最小的數據,將它與arrr[1]交換;第2趟,在待排序數據arr[2]~arr[n]中選出最小的數據,將它與r[2]交換;以此類推,第i趟在待排序數據arr[i]~arr[n]中選出最小的數據,將它與r[i]交換,直到所有排序完成。
關鍵的比較的代碼以下

for (int i = 0; i < array.length - 1; i++){
            for (int j = i + 1;j < size();j++){
                if (array[i] > array[j]){
                    int temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                }

3.代碼託管

線性結構之鏈表
線性結構之鏈表測試類
線性結構之數組
線性結構之數組測試類

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

問題1:執行排序算法過程當中要求打印元素,使用array.toString方法會出現異常,具體是會出現亂碼,或者部分toString方法不顯示任何東西
問題1解決方案:選擇其餘的輸出方式,如

for(int num:arr){
      System.out.print(num+" ");
    }
String str = "";
                for (int x = 0; x < size(); x++){
                    str += array[x]+ " ";
                }

這樣的輸出就沒有問題。
問題2:冒泡排序的最後1,順序已經從小到大排好,但依然在進行排序操做

問題2解決方案:表面上看順序已經排好,可是雙重循環操做還須要繼續進行下去,計算機不可能直接識別這一串數字,只能按既定的操做走完,只要是排序次數小於最大值(數字從大到小排列經過冒泡排序變爲從小到大排列的次數)就是正確的。

5.其餘

本次實驗還算沒有遇到大的挫折,比較順利的作了下來。在完成的過程當中學到了很多新知識也鞏固了以前所學的東西,同時也發現了以前代碼中的很多問題也一一進行了改正。

6.參考資料

相關文章
相關標籤/搜索