2017-07-26 49 views
-1

我有這個代碼在前面,但我不能建立一個鏈接列表與多個元素。我看到在方法「einsetzenNach」中if語句中的代碼塊將永遠不會執行。原因是光標永遠不會得到!= 0 原始代碼是用Java編寫的。 我很感激任何提示。新手在LinkedList代碼C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace EinfachVerketteteListe 
{ 


class Program 
{ 
    static void Main(string[] args) 
    { 

     Liste myList = new Liste(); 

     myList.einsetzenVor(1, "Nr01"); 
     myList.einsetzenVor(2, "Nr02"); 
     myList.einsetzenNach(2, "Nr02"); 
     myList.einsetzenNach(3, "Nr03"); 
     myList.inhalt(3); 
     myList.laenge(); 
     myList.ToString(); 
    } 
} 

這裏是Cell類

class Zelle 
{ 
    // Contents 
    public Object inhalt; 
    // Next cell 
    public Zelle next; 

    public Zelle(Object el) 
    { 
     inhalt = el; 
    } 
    public Zelle(Object el, Zelle z) 
    { 
     inhalt = el; 
     next = z; 
    } 
    public Zelle(Zelle z) 
    { 
     next = z; 
    } 
} 

我們的自定義列表類

public class Liste 
{ 
    // Start element 
    private Zelle anfang; 
    // Current Element 
    private Zelle cursor; 

    /// <summary> 

    /// There are no more items in the list, start is null 
    /// </summary> 
    /// <returns>start == null</returns> 
    public Boolean IstLeer() 
    { 
     return anfang == null; 
    } 

    /// <summary> 
    /// Length of the list 
    /// </summary> 
    /// <returns>l = listlenght</returns> 
    public int laenge() 
    { 
     Zelle cur = anfang; 
     int l = 0; 
     while (cur != null) 
     { 
      l++; 
      cur = cur.next; 
     } 
     return l; 
    } 

    /// <summary> 
    /// Check of the declared position is valid 
    /// </summary> 
    /// <param name="p">Position</param> 
    /// <returns>true/false</returns> 
    public Boolean istGueltigePosition(int p) 
    { 
     return (p >= 1) && (p <= laenge()); 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="p">Set cursor on a specific position</param> 
    public void setzeCursor(int p) 
    { 
     cursor = null; 
     if (istGueltigePosition(p)) 
     { 
      Zelle cur = anfang; 

      // cur.next is null. The reason is that there is only one element in the list 
      // How can I fix this block. However I assume the code will work. 
      // Maybe I handle something not in the correct order. 

      for (int i = 0; i < p; i++) 
      { cur = cur.next; } 
      cursor = cur; 
     } 
    } 

也許了Methode initCursor()的答案是我的理解問題。 但是我不知道用什麼方法可以用這種方法打印出第一個元素。

/// <summary> 
    /// Initial Position Cursor 
    /// </summary> 
    public void initCursor() 
    { 
     cursor = anfang; 
    } 

    /// <summary> 
    /// Search for specific object and return it's index 
    /// </summary> 
    /// <param name="e">Zu findende Daten</param> 
    /// <returns>p = Index</returns> 
    public int suche(Object e) 
    { 
     cursor = null; 
     int p = 0, l = 0; 
     Zelle z = anfang; 

     while (z != null) 
     { 
      l++; 
      if (z.inhalt == e) 
      { 
       p = l; 
       cursor = z; 
       break; 
      } 
      z = z.next; 
     } 
     return p; 
    } 

    /// <summary> 
    /// Insert cell after element p 
    /// </summary> 
    /// <param name="p">Position</param> 
    /// <param name="e">Daten</param> 
    public void einsetzenNach(int p, Object e) 
    { 
     setzeCursor(p); 

這如果statment將永遠不會得到!= 0

 if (cursor != null) 
     { 
      Zelle z = new Zelle(e, cursor.next); 
      cursor.next = z; 
     } 
    } 

    /// <summary> 
    /// Insert cell after element p 
    /// </summary> 
    /// <param name="p">Position</param> 
    /// <param name="e">Daten</param> 

    public void einsetzenVor(int p, Object e) 
    { 
     if (p > 1) einsetzenNach(p-1,e); 
     else 
     { 
      // Insert at the beginning 
      Zelle z = new Zelle(e, anfang); 
      anfang = z; 
     } 
    } 

    public void loesche(int p) 
    { 
     if (istGueltigePosition(p)) 
     { 
      if (p == 1) // Lösche 1. Object 
       anfang = anfang.next; 
      else 
      { 
       setzeCursor(p - 1); 
       cursor.next = cursor.next.next; 
      } 
     } 
    } 

    /// <summary> 
    /// Show the content 
    /// </summary> 
    /// <param name="p">position</param> 
    /// <returns></returns> 
    public Object inhalt(int p) 
    { 
     setzeCursor(p); 
     if (cursor == null) return null; 
     return cursor.inhalt; 
    } 

    /// <summary> 
    /// next cell/data 
    /// </summary> 
    /// <returns>Daten</returns> 
    public Object naechstes() 
    { 
     if (cursor == null) return null; 
     Object e = cursor.inhalt; 
     cursor = cursor.next; 
     return e; 
    } 
    } 
} 
+4

如果將代碼翻譯爲英文將會非常有幫助。 – juharr

+0

只顯示代表您問題的代碼的相關部分 – arielnmz

+0

也許有人可以給我看最簡單的代碼來創建鏈接列表,它提供了以下方法:在特定位置插入元素,在特定位置上刪除元素,顯示數據特定元素。 – ChrieJ

回答

0

假設你成功添加了第一個元素到列表中,現在你要添加的第二個元素。

檢查有效位置後,將當前單元格設置爲開始(Zelle cur = anfang;)。之後,您想要到達想要插入對象的位置。但是因爲它是你的第一個元素,所以沒有以下元素。因此cur將在循環後始終爲null

由於您的列表沒有從零開始的索引,因此應該從列表的第一個索引開始循環。嘗試以下循環:

for (int i = 1; i < p; i++) 
{ 
    if (cur.next == null) 
    { 
     break; 
    } 

    cur = cur.next; 
} 
cursor = cur; 
+0

你的答案可以幫助我很多,現在我可以使用代碼。現在還不清楚如何查看第一個「Zelle」(例如,我創建了一個調用「inhalt」方法的for循環,但是如代碼中所示,它不是從啓動單元開始的,有「inhalt」和「naechstes」展臺無法顯示第一個元素,原因是所謂的「istGueltigePosition」,它檢查「postion> = 1」 – ChrieJ

+0

@ChrieJ請爲您的新問題發佈一個新問題並將此答案標記爲解決方案,如果它解決了你在問題中提出的問題。 – Aurril