2011-08-05 11 views
-2

私はチュートリアルを読んでいて、私はグーグル上を見渡しましたが、リンクされたリストの仕組みについての詳細な解説が見つかりませんでした...私は構造/フォーマットについて本当に混乱しています。彼らが素晴らしいと思うように私に感謝しました、サイズ変更可能であり、変更可能な配列である...あなたが私が何を話しているのかを知る必要がある場合は、私はツタンカーメンからいくつかのコードです。私は方法を追加する方法や削除する方法、彼らが何をするのか、リストの仕事の中でどのように尾を立てるかなどの方法について混乱しています...リンクされたリストはどのように機能しますか?

助けてください混乱..

class ListEntry 
{ 
    int data; 
    ListEntry next; 

    public ListEntry(int d) 
    { 
     data = d; 
     next = null; 
    } 

    public int Data 
    { 
     get{ return data; } 
     set{ data = value; } 
    } 

    public ListEntry Next 
    { 
     get{ return next; } 
     set{ next = value; } 
    } 

    public override string ToString() 
    { 
     return(data.ToString()); 
    } 
} 


class TestProgram 
    { 
     static void Main() 
     { 
      List list = new List(); 

      list.Append(3); 
      Console.WriteLine(list); 

      list.Append(1); 
      Console.WriteLine(list); 

      list.Append(6); 
      Console.WriteLine(list); 

      list.Prepend(4); 
      Console.WriteLine(list); 

      // continued… 

// Continued… 

     list.Prepend(5); 
     Console.WriteLine(list); 

     list.DeleteFirst(4); 
     Console.WriteLine(list); 

     list.Prepend(2); 
     Console.WriteLine(list); 

     Console.WriteLine("Head data = " + list.Head); 
     Console.WriteLine("Tail data = " + list.Tail); 

     list.Clear(); 
     Console.WriteLine(list); 

     Console.WriteLine("IsEmpty = " + list.IsEmpty); 
    } 
} 



using System; 

class List 
{ 
    ListEntry head; 
    ListEntry tail; 

    class ListEntry 
    { 
     // Put declaration of ListEntry here. Nesting of the classes is valid. In fact, class nesting is 
     // preferable if one class is only used within the context of another class. 
    } 

    public List() 
    { 
     head = null; 
     tail = null; 
    } 

    // Continued… 


public int Head 
{ 
    get{ return head.Data; } 
} 

public int Tail 
{ 
    get{ return tail.Data; } 
} 

public bool IsEmpty 
{ 
    get{ return(head == null); } 
} 

public override string ToString() 
{ 
    string tmp = ""; 

    ListEntry current = head; 
    if(current == null) 
    { 
     tmp = "Empty"; 
    } 
    while(current != null) 
    { 
     tmp += current + " "; 
     current = current.Next; 
    } 
    return(tmp); 
} 

public void Append(int i) 
{ 
    ListEntry tmp = new ListEntry(i); 

    tmp.Next = null; 

    if(head == null) 
    { 
     head = tmp; 
    } 
    else 
    { 
     tail.Next = tmp; 
    } 
    tail = tmp; 
} 

public void Prepend(int i) 
{ 
    ListEntry tmp = new ListEntry(i); 

    tmp.Next = head; 

    if(head == null) 
    { 
     tail = tmp; 
    } 
    head = tmp; 
} 

public void DeleteFirst(int i) 
{ 
    ListEntry current = head; 
    ListEntry previous = null; 

    while(current != null && current.Data != i) 
    { 
     previous = current; 
     current = current.Next; 
    } 
    if(current == null) 
    { 
     throw new ArgumentException("List entry not found"); 
    } 

    // Continued… 


// Continued… 

    if(current == head) 
    { 
     head = current.Next; 
    } 
    else 
    { 
     previous.Next = current.Next; 
    } 
    if(current == tail) 
    { 
     tail = previous; 
    } 
} 

ような他の方法がある: ソート()メソッド A関数は、FindFirst()メソッド A FindNextの()メソッド アンのinsertBefore()メソッド アンInsertAfter()メソッド

しかし、今のところ彼は基本的なものです。

+3

はこの宿題ですか?もしそうなら、そのようにタグを付けてください。 – FishBasketGordo

+2

http://en.wikipedia.org/wiki/Linked_listを試しましたか? –

+2

写真とすべてのもの:http://en.wikipedia.org/wiki/Linked_list –

答えて

4

リンクリストは、一連のオブジェクトを収集するために使用される構造化されたデータです。 "Head"はシーケンスの最初の項目です。 「テール」はシーケンス内の最後のオブジェクトです。リンクされたリスト(ノード)の各アイテムは、リスト内の次または前のアイテムを指し示す次(および二重にリンクされている場合は前)というプロパティを持ちます。これらの次の項目と前の項目は、コレクション内の次の項目または前の項目を指しているだけなので、それらを反復するためには、順番にそれを行う必要があります。

チェーン内のリンクのようなリンクリストを考えてみましょう。リストの5番目の項目に移動するには、チェーンの最初のリンクから開始し、5番目の項目に到達するまで追跡します。これが少し助けてくれることを願って。

http://en.wikipedia.org/wiki/Linked_list

+1

多くの感謝をしてくれてありがとう...私は彼らがHead.LinkとTail.Linkをどのように使用するかについて少し混乱しているが、 – Bulvak

2

(ジェネリック)C#で簡単な単一リンクリストの実装:

public class LinkedList<T> 
{ 
    private Node<T> head; 

    public void AddAtFront(T data) 
    { 
     this.head = new Node<T>(data, this.head); 
    } 

    public void AddAtBack(T data) 
    { 
     var node = new Node<T>(data); 
     var current = this.head; 

     if (current == null) 
     { 
      this.head = node; 
     } 
     else 
     { 
      while (current.Next != null) 
      { 
       current = current.Next; 
      } 

      current.Next = node; 
     } 
    } 

    public Node<T> Front 
    { 
     get 
     { 
      return this.head; 
     } 
    } 

    public Node<T> Back 
    { 
     get 
     { 
      var current = this.head; 

      if (current != null) 
      { 
       while (current.Next != null) 
       { 
        current = current.Next; 
       } 
      } 

      return current; 
     } 
    } 

    public Node<T> RemoveAtFront() 
    { 
     var node = this.head; 

     if (node != null) 
     { 
      this.head = node.Next; 
     } 

     return node; 
    } 

    public Node<T> RemoveAtBack() 
    { 
     var current = this.head; 

     if (current != null) 
     { 
      if (current.Next == null) 
      { 
       this.head = null; 
      } 
      else 
      { 
       Node<T> nextToLast = null; 

       while (current.Next != null) 
       { 
        nextToLast = current; 
        current = current.Next; 
       } 

       nextToLast.Next = null; 
      } 
     } 

     return current; 
    } 
} 

public class Node<T> 
{ 
    private readonly T data; 

    private Node<T> next; 

    public Node(T data) 
    { 
     this.data = data; 
    } 

    public Node(T data, Node<T> next) 
    { 
     this.data = data; 
     this.next = next; 
    } 

    public T Data 
    { 
     get 
     { 
      return this.data; 
     } 
    } 

    public Node<T> Next 
    { 
     get 
     { 
      return this.next; 
     } 

     set 
     { 
      this.next = value; 
     } 
    } 
} 
関連する問題