有人可以用列表元素的物理地址(C#)帮助我吗?

时间:2014-12-23 13:47:35

标签: c# linked-list

我需要在C#中创建一个项目,以显示链接列表的工作原理。

我想做出这样的事情:

root -> (address ffff) value: 5; next: fff1; 
                  -> (address fff1) value: 4; next: fff2; 

......等等...... 这可能在C#中吗?有人能告诉我它是如何完成的吗?

好的,这是我到目前为止所做的:

class ListaSI
{
    public class element
    {
        public element next = null;
        public object data;
    }

    private element root = null;

    public element First { get { return root; } }

    public element Last
    {
        get
        {
            element currentElement = root;
            if (currentElement == null)
                return null;
            while (currentElement.next != null)
                currentElement = currentElement.next;
            return currentElement;
        }
    }

    // basic operations ( add, delete, etc... )

好吧,我需要“数据”字段的地址。我试试这个:http://msdn.microsoft.com/en-US/library/zcbcf4ta%28v=vs.80%29.aspx,但它不起作用。

不允许我这样做:

int *p = &currentElement.next;  // I'm sure this is wrong! :)

但我需要这样的东西吗?

以下是我的尝试:

public string displayList()
    {
        string myString = "";
        element currentElement = this.root;
        while (true)
        {
            if (currentElement.next != null)
            {
                // i'm stuck here
            }



        }

        return myString;
    }

1 个答案:

答案 0 :(得分:1)

没有数据项的元素是没有意义的,因此您应该修改element构造函数以包含数据项的参数。

public class element
{
    public element next = null;
    public object data = null;

    public element(object dataItem)
    {
        this.data = dataItem;
    }
}

然后使用你的displayList方法访问列表的内容 - 我已经对你想要显示的内容做了一些假设,但你会明白这一点。

public string displayList()
{
    // Use a StringBuilder to concatenate strings from the list
    StringBuilder myString = new StringBuilder();

    // Iterate through the list, starting at the root.
    element currentElement = this.root;
    while (currentElement != null)
    {
        // Add the data item from the current element
        String dataString = currentElement.data as String;
        if(null != dataString)
        {
            myString.Add(dataString + Environment.NewLine);
        }
        else
        {
            myString.Add("null" + Environment.NewLine);
        }

        // Try the next element in the list.
        currentElement = currentElement.next;
    }

    return myString.ToString();
}

为了澄清指针和C#,有一些方法可以在C#中搜索指针(在这里搜索IntPtrPInvoke例如:有很多),但一般情况下你不会需要它们。正如评论中所提到的,C#是一种托管语言,为您提供对象引用而不是指针,处理大多数mallocfree以及与指针和动态内存分配相关的其他恶意内容(请注意: IDisposable接口,因为这不普遍,特别是在处理非托管资源时,例如某些类型的流的句柄,数据库会话等)。当您将变量声明为从System.Object派生的任何类型时,该变量将是对象的引用,而不是对象本身。因此,object.member访问对象成员,而不会在C和C ++中找到object->member运算符的C#版本。

(上面的解释有些简化,我做了几个全面的概括,但这个主题远远超出了这个简短答案可以涵盖的范围,如果你需要进一步阅读,还有很多好书。)