2014-03-07 22 views
-1

我給了一個任務如下:鏈接列表建議

我想建立一個鏈接列表的實現。具體而言,我希望它是一個雙向鏈接列表。

我的任務: 你的程序應該使用鏈表使用鏈表來模擬火車路線。 首先,用戶將輸入儘可能多的站點,因爲他們希望火車有,並且每個站點的名稱。然後程序應該打印路線圖。 一旦完成,他們然後輸入他們想要開始的停止的名稱。 從那裏他們可以輸入命令,將列車前進到下一站或後退到前一站。

我已經告訴我沒有做這個任務的權利,但我真的不明白怎麼沒有,我會很感激,如果有人可以解釋我沒有做我應該做的。

我Route類(還沒有完成,但它會一直接近完成,如果它是正確完成):

namespace TrainRoute 
{ 
    class Route 
    { 

     Stops root; 

     public LinkedList<Stops> linkedList = new LinkedList<Stops>(); 
     public Stops MakeNewStop(string stopName) 
     { 
      Stops stopWithStopName = new Stops(stopName); 
      return stopWithStopName; 
     } 


     public void AddStops(Stops stopIWantToAdd) 
     { 
      if (linkedList.Count == 0) 
      { 
       linkedList.AddFirst(stopIWantToAdd); 
      } 
      else 
      { 
       //stopIWantToAdd.prevStop = linkedList.Last(); 
       linkedList.AddLast(stopIWantToAdd); 
      } 
     } 
     public void StopRelationships() 
     { 

      for (int i = 0; i < linkedList.Count; i++) 
      { 
       if (linkedList.ElementAt<Stops>(i).nextStop == null && linkedList.ElementAt<Stops>((i + 1)) != null) 
       { 
        linkedList.ElementAt<Stops>(i).nextStop = linkedList.ElementAt<Stops>((i + 1)); 
       } 
       if (linkedList.ElementAt<Stops>((i - 1)) != null) 
       { 
        linkedList.ElementAt<Stops>(i).prevStop = linkedList.ElementAt<Stops>(i - 1); 
       } 
      } 
     } 

     public void Print() 
     { 
      if (linkedList != null) 
      { 

       foreach (var item in linkedList) 
       { 
        Console.WriteLine("Stop name: " + item.stopName); 
       } 
      } 
     } 


     public int StopPosition(string usersInput) 
     { 
      int position = 0; 
      for (int i = 0; i < linkedList.Count; i++) 
      { 
       if (linkedList.ElementAt<Stops>(i).stopName == usersInput) 
       { 
        position = i; 
        break; 
       } 
      } 
      return position; 
     } 
     public int MoveForward(int indexPosition) 
     { 
      Console.WriteLine("The train is now at " +linkedList.ElementAt<Stops>(indexPosition).nextStop.stopName); 
      return (indexPosition + 1); 
     } 

     public int MoveBackwords(int indexPosition) 
     { 
      Console.WriteLine("The train is now at " + linkedList.ElementAt<Stops>(indexPosition).prevStop.stopName); 
      return (indexPosition - 1); 
     } 

     public bool VerifyRoute(int indexPosition, string prevOrForward) 
     { 
      if (prevOrForward.Contains("forward")) 
      { 
       if (linkedList.ElementAt<Stops>((indexPosition+1)) != null) 
       { 
        return true; 
       } 
      } 
      else 
      { 
       if (linkedList.ElementAt<Stops>((indexPosition-1)) != null) 
       { 
        return true; 
       } 
      } 
      return false; 
     } 
    } 
} 

我也不允許使用鏈表類,但我m使用鏈表(我不是100%確定這意味着什麼)。

任何和所有的意見/幫助提供將不勝感激!

+4

您的任務是**使用**鏈接列表或**實現**鏈接列表? –

+1

聽起來像你的老師(假設這是家庭作業)期望你實現一個鏈表類,而不是使用提供的.NET類。 –

+0

@ LasseV.Karlsen我剛問過,得到了一個非常令人困惑的答案,但幸運的是,他說最好的學習方法是建立它。那麼,即刻使我的所有代碼無用:( – Zain

回答

3

讓我們拼湊這裏的麪包屑:

我想建一個鏈表的實現。

這:

我也不允許使用鏈表類

顯然這裏的任務是爲你實現自己的鏈表(類),而不是使用.NET提供的現有的。

我假設這裏的任務是不建程序處理的火車,而是要學會鏈表是如何工作的,以及你將如何去實現一個。

因此,簡單地抓住現有班級的快捷方式是工作的錯誤工具。如果你的任務是構建這個程序,那麼這將是完美的(可能),但在這種情況下,程序與你的任務是正交的,它在那裏爲你真正要求做的事情創建一個上下文:

實現你的自己的版本LinkedList<T>(儘管你可能不需要使其通用)。

維基百科有一個very good article on linked lists如果你難倒這樣的數據結構如何工作。毫無疑問,網絡上還有其他非常好的資源,可能還有你的教科書或其他資源。

此外,我會敦促你找一個同學同行,根據經驗我可以說,我在編程生涯中遇到的大部分真正困難的問題(通常)都是通過一個陪練夥伴來解決的與...合作。

+0

看來這是我誤解手頭的任務..再一次,我很幸運,沒有那麼幸運,因爲我已經知道如何做到這一點,因爲我已經完成了一些二進制搜索樹碼。但由於我沒有在教育(學徒)除了stackoverflow我實際上沒有幫助:(幸運的是堆棧上的人溢出是非常有幫助的。感謝您的幫助,我會接受你答案,當它讓我。 – Zain

0

實現鏈表並不困難。我假設你有一本教科書,它討論鏈接列表,仔細閱讀它,仔細。同時你也想向你的導師澄清你的鏈表需要實現多少功能。

基本上,你將從node類開始,如果你不需要它是通用的,那麼你可以創建一個StopNode類。您node類的基礎將是在列表中的下一個節點的引用,並且,由於這是一個雙向鏈表,前一節點的一個參考:

public class StopNode 
{ 
    public StopNode Next { get; set; } 
    public StopNode Previous { get; set; } 
    // whatever other properties your stop class needs - such as name 
} 

現在您的LinkedList類將管理的集合停止節點。它需要保留對第一個或「頭」節點的引用,並且可能還要對最後一個節點(或「尾」)進行引用。

public class StopLinkedList 
{ 
    private StopNode Head { get; } 
    private StopNode Tail { get; } 
} 

而且它將需要實現方法來添加和刪除節點(至少),也可能會插入。

添加很簡單 - 檢查頭是否爲空。如果是,只需將Head和Tail都設置爲等於新節點。如果不是,您將改爲將TailNext屬性設置爲新節點,然後將新節點的Previous設置爲Tail,然後更新Tail以引用新節點。

要刪除一個節點,如果有節點刪除,則需要檢查它的PreviousNext性能和(假設一個或兩個不爲空 - 你需要添加邏輯爲),您可以設置你的節點Previous.Next到你的節點Next和你的節點Next.Previous到你的節點Previous。這將導致您的節點不在列表中(如果需要,您可以將節點NextPrevious設置爲null,但除非刪除的節點要掛起,否則不是必須的)。

希望能讓你開始。與你的導師說清楚,檢查你的教科書(如果與我的術語不同,最好嘗試匹配他們的術語),並在互聯網上搜索「鏈接列表」和「雙向鏈接列表」。你應該找到很多資源。

+0

嗨,我會在OP中發佈我的代碼,也許你可以知道它是如何發生的(我有一個錯誤,但我會在OP中發佈它,我不幸有一個導師和課本。開發者告訴我可能最好使用遞歸,所以我會用它來保持他的快樂。編輯:我不能發佈在OP :(。 – Zain