20172311 實驗一《程序設計與數據結構》線性結構 實驗報告

20172311 實驗一《程序設計與數據結構》線性結構 實驗報告

課程:《程序設計與數據結構》
班級: 1723
姓名: 趙曉海
學號:20172311
實驗教師:王志強
實驗日期:2018年9月30日
必修/選修: 必修html


1.實驗內容

  • 線性結構之鏈表(1):經過鍵盤輸入一些整數,創建一個鏈表,打印全部鏈表元素, 並輸出元素的總數。
  • 線性結構之鏈表(2):實現節點插入、刪除、輸出操做,擴展功能,從磁盤讀取一個文件,從鏈表中刪除剛纔的數字1. 並打印全部數字和元素的總數。
  • 線性結構之鏈表(3):使用選擇排序法根據數值大小對鏈表進行排序,在排序的每個輪次中, 打印元素的總數,和目前鏈表的全部元素。
  • 線性結構之數組(4):經過鍵盤輸入一些整數,創建一個數組,打印全部數組元素, 並輸出元素的總數;實現數組插入、刪除、輸出操做, 擴展功能,從磁盤讀取一個文件,從鏈表中刪除剛纔的數字1. 並打印全部數字和元素的總數。
  • 線性結構之數組(5):使用選擇排序法根據數值大小對數組進行排序,在排序的每個輪次中, 打印元素的總數,和目前數組的全部元素。

2.實驗過程及結果

鏈表與數組練習,全部功能在一個程序中完成,每完成一個功能簽入一次碼雲

  • 線性結構之鏈表(1):
    1.經過鍵盤輸入一些整數,創建一個鏈表
    2.這些數是學號中依次取出的兩位數,再加上今天的時間
    3.打印全部鏈表元素, 並輸出元素的總數
    4.用一個特殊變量名來記錄元素的總數,變量名是你的名字
  • 結果提交截圖
    java

  • 本實驗小結:
    本實驗要求完成鏈表類的初步建立,須要完成toString()size()兩個方法。在鏈表類的建立方面,我採用了泛型的方式,建立了一個ADT,而後採用了泛型,以便於在鏈表中添加任何數據,方便後期的使用。git


  • 線性結構之鏈表(2):
    1.實現節點插入、刪除、輸出操做
    2.繼續上一個程序,擴展它的功能,每作完一個新功能,或者寫了超過10行新代碼,就簽入代碼,提交到源代碼服務器
    3.從磁盤讀取一個文件, 這個文件有兩個數字
    4.從文件中讀入數字1, 插入到鏈表第5位,並打印全部數字,和元素的總數。保留這個鏈表,繼續下面的操做
    從文件中讀入數字2, 插入到鏈表第 0 位,並打印全部數字,和元素的總數。 保留這個鏈表,繼續下面的操做
    5.從鏈表中刪除剛纔的數字1. 並打印全部數字和元素的總數
  • 結果提交截圖:

  • 本實驗小結
    本實驗要求對實驗(1)中建立的鏈表類進行功能的拓展,首先要添加節點插入、刪除的功能。還要求有一個讀取文件內容的方法,這個方法我直接在測試類里加了一個靜態方法,由於我以爲把這個方法放到鏈表類裏並不合適。

  • 線性結構之鏈表(3):
    1.使用冒泡排序法或者選擇排序法根據數值大小對鏈表進行排序
    2.學號是雙數, 使用選擇排序
    3.在排序的每個輪次中, 打印元素的總數,和目前鏈表的全部元素數組

  • 結果提交截圖:


    服務器

本實驗小結:

本實驗要求在鏈表類里加一個冒泡排序的方法,該方法實現了冒泡排序,並且返回每一步排序後的結果,對選擇排序的方法進行適當的修改便可完成。數據結構


  • 線性結構之數組(4):
    1.經過鍵盤輸入一些整數,創建一個數組
    2.這些數是學號中依次取出的兩位數,再加上今天的時間
    3.打印全部數組元素, 並輸出元素的總數
    4.用一個特殊變量名來記錄元素的總數,變量名是你的名字
    5.實現數組插入、刪除、輸出操做
    6.繼續上一個程序, 擴展它的功能,每作完一個新功能,或者寫了超過10行新代碼,就簽入代碼,提交到源代碼服務器
    7.從磁盤讀取一個文件, 這個文件有兩個數字
    8.從文件中讀入數字1, 插入到數組第 5 位,並打印全部數字,和元素的總數。 保留這個數組,繼續下面的操做
    從文件中讀入數字2, 插入到數組第 0 位,並打印全部數字,和元素的總數。 保留這個數組,繼續下面的操做
    9.從數組中刪除剛纔的數字1. 並打印全部數字和元素的總數測試

  • 結果提交截圖:

    .net

本實驗小結:

我的覺得本實驗能夠經過建立一個可以對數組操做的類來實現,聲明該類也就建立也一個數組,而後該類中還具有節點的插入和刪除以及toStringsize()方法,經過調用這些方法便可以完成本實驗設計


  • 線性結構之數組(5):
    1.使用插入排序法或者選擇排序法根據數值大小對數組進行排序
    2.學號是雙數, 使用插入排序
    3.在排序的每個輪次中, 打印元素的總數,和目前數組的全部元素
  • 結果提交截圖:


    3d

  • 本實驗小結:
    本實驗要求在建立的數組操做類中新建一個選擇排序的方法,該方法不只要完成選擇排序,還要返回選擇排序的每一步過程,對選擇排序進行必定的修改便可完成。


3.實驗代碼連接


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

  • 問題:鏈表類的刪除方法有問題,簡單來講就是刪除一個小一點的數沒有問題,刪除一個大點的數就會有問題。
  • 有bug刪除方法代碼以下:
//刪除某一元素,一次刪一個且就近
    public void deleteNumber(T t) {

            LinearNode temp = head;

            if(temp.getElement()==t)
            {
                head = temp.next;
            }
            else {
                while (!(temp.next.getElement() == t))
                {
                    temp = temp.next;
                }
                temp.next = temp.next.next;
            }
            nZhaoXiaoHai--;
    }
  • 使用有bug方法運行結果如圖(刪除的數較大時):

  • 使用有bug方法運行結果如圖(刪除的數較小時):

  • 看到這個就真的很蒙圈了,一樣的代碼,數大了會有bug,我真的佛了,要是我測試的時候用的數不是500而是20,那我這個bug可就真的可能看不到了,真的挺有意思!!!!

  • 解決方案:經過單步調試發現當數小時,連表中的數和方法引用裏的數的地址同樣,可是當數比較大時,二者的地址就不同了,也就完成不了正確的刪除功能了。最終經過老師的指導問題獲得瞭解決,只須要把代碼中的==改成使用.equals方法判斷是否相等便可,由於==是用來判斷地址是否相同的,而.equals方法則是判斷元素是否相同。
  • 修復後的刪除方法代碼以下:
//刪除某一元素,一次刪一個且就近
    public void deleteNumber(T t) {

            LinearNode temp = head;

            if(temp.getElement().equals(t))
            {
                head = temp.next;
            }
            else {
                while (!(temp.next.getElement().equals(t)))
                {
                    temp = temp.next;
                }
                temp.next = temp.next.next;
            }
            nZhaoXiaoHai--;
    }
  • 無bug方法運行結果如圖:

5.感想

從對鏈表和數組的陌生到對他們的熟悉,真的頗有成就感,有點小激動!要走的路還很長,繼續努力吧!

6.參考資料

相關文章
相關標籤/搜索