簡體   English   中英

c#中的雙循環鏈表

[英]doubly-circular linked list in c#

我正在使用一個雙循環鏈表。 添加值后,我正在從列表中檢索值。 我正在使用此代碼添加值:

public void Add(T data)
{
    if (root == null)
    {
        this.Add(data);
        root = new LinkedListNode<T>(data);
        last = root;
    }
    else
    {
        last.Next = new LinkedListNode<T>(data);
        last.Next.Previous = last;
        last = last.Next;
    }
}

我將數據提供為:

char[] dir = { 'n', 'w', 's', 'e' };
TestProject.classes.LinkedList<char> list = new TestProject.classes.LinkedList<char>();

foreach (char c in dir)
{
    list.Add(c);
}

我將列表數據檢索為:

public LinkedListNode<T> GetAt(int index)
{
    var current = root;
    for (int i = 0; i < index; i++)
    {
        if (current == null)
            return null;
        current = current.Next;
    }
    return current;
}

問題是它在檢索節點值時將current值設為null

該列表是 stackoverflow 本身的一個示例。

請幫我..

我的整個鏈表 class 如下:

public class LinkedList<T>
{
    protected LinkedListNode<T> root = null;
    protected LinkedListNode<T> last = null;
    public LinkedList()
    {
    }

    public string ToString()
    {
        StringBuilder sb = new StringBuilder();
        var node = root;
        while (node != null)
        {
            sb.Append("{ " + node.Data.ToString() + " } ");
            node = node.Next;
        }
        return sb.ToString();
    }

    public T this[int index]
    {
        get
        {
            var node = GetAt(index);
            if (node == null)
                throw new ArgumentOutOfRangeException();
            return node.Data;
        }
        set
        {
            var node = GetAt(index);
            if (node == null)
                throw new ArgumentOutOfRangeException();
            node.Data = value;
        }
    }

    public LinkedListNode<T> GetAt(int index)
    {
        var current = root;
        for (int i = 0; i < index; i++)
        {
            if (current == null)
                return null;
            current = current.Next;
        }
        return current;
    }

    public void Add(T data)
    {
        if (root == null)
        {
            this.Add(data);
            root = new LinkedListNode<T>(data);
            last = root;
        }
        else
        {
            last.Next = new LinkedListNode<T>(data);
            last.Next.Previous = last;
            last = last.Next;
        }
    }
}

public class LinkedListNode<T>
{
    public T Data { get; set; }

    public LinkedListNode(T data)
    {
        Data = data;
    }

    public LinkedListNode<T> Next { get; set; }
    public LinkedListNode<T> Previous { get; set; }
}

如果root == null當它被調用時,這個 function 沒有理由工作,它應該在它一遍又一遍地調用自己時導致堆棧溢出......

public void Add(T data)
{
    if (root == null)
    {
        this.Add(data);  // recurse?!?

因此,如果您成功調用它,似乎有三個選項:

  • 您已經設法配置編譯器優化,以便它刪除調用(這似乎不太可能,但我想可能)。
  • 你永遠不會用root==null調用它,這意味着其他東西正在修改root ,可能因為它受到保護,但是如果你提供的使用代碼是正確的,那不應該是這種情況,因為你沒有'沒有提到派生的 class。
  • 您的使用代碼被解釋了,實際上您是從 try/catch 塊中調用 add 並忽略拋出的異常。

正如我在評論中所說,刪除對this.add(data)的額外調用應該可以解決您的問題(填充列表),但是,我建議您逐步完成調試器中的 function 調用,以便你可以看到發生了什么。 我很想知道它是否真的調用了“添加”function。

就從列表中檢索信息而言,get function 看起來應該可以工作,假設信息已正確放入列表中,並且您在插入數據的同一列表中調用 get。 同樣,如果它不工作,調試器是你的朋友,當你試圖找出哪個位沒有按照你期望的方式填充時。

正如@forsvarir 所指出的:當不存在根節點時,您不應再次調用Add 只需刪除該呼叫,一切都會好起來的。

如果我是你,我不會將 Indexer 或GetAt方法添加到LinkedList實現中。 使用需要索引訪問的鏈表是非常低效的。

讓您的列表實現IEnumerable並讓用戶使用 LINQ。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM