20172304 2018-2019-1 實驗一博客

  • 課程:程序設計與數據結構
  • 班級:1723
  • 姓名:段志軒
  • 學號:20172304
  • 實驗老師:王志強
  • 助教:張之睿和張師瑜
  • 選修/必修:必修

    實驗要求

  • 實驗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)。

  • 實驗2
    鏈表練習,要求實現下列功能:

(2)實現節點插入、刪除、輸出操作(2分,3個知識點根據實際情況酌情扣分);

繼續你上一個程序, 擴展它的功能,每做完一個新功能,或者寫了超過10行新代碼,就簽入代碼,提交到源代碼服務器;

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

簽入所有代碼。

  • 實驗3
    鏈表練習,要求實現下列功能:

(3)使用冒泡排序法或者選擇排序法根據數值大小對鏈表進行排序(2分);
如果你學號是單數, 選擇冒泡排序, 否則選擇選擇排序。
在排序的每一個輪次中, 打印元素的總數,和目前鏈表的所有元素。

在(2)得到的程序中繼續擴展, 用同一個程序文件,寫不同的函數來實現這個功能。 仍然用 nZhangSan (你的名字)來表示元素的總數。

  • 實驗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)實現節點插入、刪除、輸出操作(2分,3個知識點根據實際情況酌情扣分);

繼續你上一個程序, 擴展它的功能,每做完一個新功能,或者寫了超過10行新代碼,就簽入代碼,提交到源代碼服務器;

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

簽入所有代碼。

  • 實驗5
    數組練習,要求實現下列功能:
    (3)使用冒泡排序法或者選擇排序法根據數值大小對數組進行排序(2分);
    如果你學號是單數, 選擇選擇排序, 否則選擇冒泡排序。
    在排序的每一個輪次中, 打印元素的總數,和目前數組的所有元素。

在(2)得到的程序中繼續擴展, 用同一個程序文件,寫不同的函數來實現這個功能。 仍然用 nZhangSan (你的名字)來表示元素的總數。

實驗思路以及實現過程

  • 實驗1:實驗一要求的是通過鍵盤輸入建立一個鏈表,然而老師並沒說不可以用插入的方法,於是在實驗一中我先行實現了鏈表的尾插法和打印方法。先通過Scanne類讀取通過鍵盤輸入的數據,然後通過StringTokenizer類將輸入的數據通過分隔符來進行分割,最後利用循環和鏈表的插入方法進行鏈表的創建。除此之外還需要進行總數的統計,所以我就在方法類中定義了一個整數型變量nDuanZhixuan,然後還創建了一個統計總數的方法。
  • 這是聲明的Scannner類以及使用Scanner類進行讀取的截圖。

  • 這是使用StringTokenier類進行分割以及循環插入的截圖。

  • 這是實現尾插法的截圖。具體思路爲先創造一個類這個類的構造函數中聲明瞭一個空的引用變量next以及一個int型變量的空間。然後使用指針指向下一個被插入的節點,以此往復。這個類的截圖我也會在下面進行給出。
    這是尾插法的截圖


    這是結點類的截圖

  • 這是實現打印的方法的截圖。這個具體的就不想解釋,但還是要說一說,主要就是通過一個while循環,在節點不爲空時將其中儲存的int性變量提取出來然後,儲存在一個String型變量中最後進行輸出。

  • 這是實現統計元素總量的方法,主要就是通過定義一個變量對頭結點進行引用,然後通過循環遍歷整個鏈表,同時在循環中對nDuanZhixaun變量進行自加運算,從而達到統計元素總量的目的。

  • 測試類代碼截圖以及測試結果截圖。


  • 實驗二
    在實驗二中我着重於實現按照索引插入,按索引刪除,按元素搜索刪除的方法。由於輸出操作在實驗一中就已經進行了,所以此時就不再贅言。着重介紹按索引插入,按索引刪除,按元素搜索刪除。至於文件讀寫的具體操作就不講了,主要介紹讀取文件的方法。
  • 按索引插入
    主要思路:首先考慮一下按索引插入的情況共分三種:從頭插入,從尾插入,還有從中間插入。
    用if條件語句判斷如果首節點爲空,在頭節點插入,直接令頭結點爲傳入數據的節點。如果頭結點不爲空,就令新引入的節點的指針指向頭結點,然後將引入的節點聲明爲頭結點。從中間插入,我則使用了兩個變量,一個引用頭結點,另一個引用頭結點的下一個節點。然後使用for循環,令兩個節點進行遍歷至輸入索引對應的節點處。兩個節點分別表示帶插入節點的前後節點。然後用前節點的指針指向新插入的節點,用新插入的節點的指針指向後節點。
    上截圖

  • 按索引刪除
    主要思路:首先考慮到了首先要找到要刪除的節點,通過循環進行遍歷同樣先定義前後節點等到找到要刪除的節點時,然後使用前節點的指針指向後節點。
    上截圖

  • 按搜索元素刪除
    主要思路:通過遍歷查找傳入元素所對應的節點同時遍歷前後節點,然後將前節點的指針指向後節點。
    上截圖

  • 文件讀取
    主要思路:這個我可以詳細解釋一下。首先聲明一個File形變量,並向構造函數中傳入需要讀取文件的絕對路徑(即從磁盤到文件夾到文件),以獲得文件的位置,然後使用Reader類讀取文件內容,然後使用BufferReader將文件內容存放在緩衝區。最後使用BufferReader類的readLine方法讀取文件。
    上截圖


    測試結果截圖

  • 實驗三
    進行排序由於我的學號是20172304,顯然這是一個偶數,顯然交給我的任務是選擇排序,選擇排序的方法我有點生疏就上網上查閱了一下,爲了證明自己已經懂了,決定要詳細的說明一下,首先要做嵌套循環,外循環遍歷整個鏈表,內循環,從外循環所在的節點,遍歷整個鏈表,並對節點儲存的數據進行比較,如果大於外循環所在的節點,則交換數據之。由於要求進行輸出元素總數,所以我在每次內循環結束時都調用了一次鏈表的打印方法。
    上截圖


    測試結果截圖

  • 實驗四
    實驗四的第一步就沒有什麼好說的了,就是創建一個數組,然後用Scanner類讀取,然後用StringTokenizer進行分割然後使用StringTokenizer類自帶的方法hasMoreTokens進行循環,然後使用nextToken的方法將輸入的字符串存入數組中。打印數組的方法我就不想加截圖了,主要就是通過循環遍歷曾哥
    上截圖

    然後第二步文件的讀寫和鏈表的相似,就不在贅言,主要介紹刪除,插入和打印的方法。刪除我做了兩個,一個是按索引刪除,另一個是按照搜索元素刪除。
  • 按索引插入
    主要思路:首先在方法內定義一個數組。然後將索引處的數據以及索引後數組內的數據通過循環存入新數組中,最後通過循環將新數組內的元素添加到原有的數組中。當然首先要檢查數組是否已滿,如果已滿就要進行擴容。我寫了一個擴容的方法。就是定義一個新數組是原有數組的容量的兩倍。然後通過循環將原有數組的元素複製到新數組對應的位置上。
    上截圖
    這是索引插入的截圖


    擴容的方法截圖

  • 按索引刪除
    主要思路:通過循環遍歷到索引對應的數組的位置所儲存的數值,然後將索引後的元素通過循環複製到新創建的數組對應位置,然後通過循環將新創建的數組的元素複製到原數組中。
    上截圖

  • 搜索元素進行刪除
    主要思路:做這個的時候我就有點偷懶了,通過遍歷找到傳入元素所在的索引值,然後調用之前寫的按照索引刪除的方法,你懂的‘’‘’‘’‘。
    上截圖


    測試結果截圖

  • 實驗五
    進行選擇排序,原理和鏈表相似。同樣是進行嵌套循環,然後外循環對整個數組有元素的部分進行遍歷,然後內循環在外循環索引的基礎上進行循環,遇到比外循環索引對應的元素小的元素就進行交換。同時在進行內循環一次是就將整個數組進行輸出。
    上截圖


    測試結果截圖

本次實現代碼的碼雲鏈接

實現鏈表的方法類
鏈表的測試類
數組的方法類和測試類

實驗中遇見的問題以及解決方案

  • 問題一:
    在實驗一中,有一步是將用戶傳進來的數據通過StringTokenizer類進行分割。這時要進行一步操作就是將數據存入鏈表節點中,如下圖,節點中儲存的數據類型是int型


    然而,用StringTokenizer分割出來的數據是實打實的String類型,所以一開始想用int來進行強轉。但是報錯。
    問題一解決方案:後來諮詢了同學
    XX:“String轉int怎麼轉來着?”
    XXX:“好像是用Integer什麼來着。”
    感謝萬能的IDEA,當我輸入"Integer."就立即顯示出了“paseInt(String s)”的字樣,然後就順理成章的成功了。只要進行一次裝箱,拆箱的操作,藉助中間媒介,就可以將String轉Int了。

  • 問題二
    在進行文件讀取時會發現有異常。如截圖。
  • 問題二解決方案
    這個,說了也許你可能不信,當時我進行了如下操作,那時並沒有多想。
    第一步:在java中右擊新創建的文本文件。


    然後點擊“Copy Path”,然後複製到Flie類的構造函數的括號裏。

    然後我就知道了,這一步需要的是絕對路徑。
    還有一些問題由於當時忘記截圖,所以準備採用口述的方式。

  • 問題三:在進行數組的插入方法時,一開始我的腦子秀逗了,想的是用數組本身進行自循環,即類似於

for(tnt b=index;b<nDuanZhixaun//數組的元素數量 ;b++)
a[b+1]=a[b]

這段代碼來解決,但是這個方法過於簡單粗暴,回饋給我的就是在索引值後面,會有一堆重複 的數字,當時我還記得那些數字是一堆“5”。

  • 問題三解決方案:首先分析錯誤類型,這應該是個邏輯錯誤,那就從邏輯上分析。分析中.......分析完畢。分析結果是,應該有個緩衝。所以我寫了如下代碼,添加了一個用於緩衝的數組。
 int []c=new int[a.length];
        int d=0;
        int f=0;
        for(int b=index;b<nDuanZhixuan;b++)
        {
            c[b]=a[b];
            d++;
        }

這樣我成功的解決了這個問題。

實驗感想

   本次實驗是對前面所學知識的一個總結,通過這次實驗,我對曾經學過的知識有了更深一步的瞭解同時對一些類的應用也更加熟悉,同時也弄懂了一些過去不是很懂的知識點可謂是受益匪淺。正所謂“溫故而知新,可以爲師矣”正是此理。

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章