2017-07-26 16 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(); 
    } 
} 

セルクラス

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); 

これなステートメントを得ることはありません場合は!= 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ループを作成しましたが、コードスタンドでは開始セルではなく開始します。 "naechstes"ブースでは、最初の要素を表示できません。理由は、 "posttion> = 1"というチェックを行うistGueltigePositionメソッドです。 – ChrieJ

+0

@ChrieJ新しい問題の新しい質問を投稿し、あなたがあなたの質問で尋ねた問題を解決した場合。 – Aurril