我需要在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 = ¤tElement.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;
}
答案 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#中搜索指针(在这里搜索IntPtr
和PInvoke
例如:有很多),但一般情况下你不会需要它们。正如评论中所提到的,C#是一种托管语言,为您提供对象引用而不是指针,处理大多数malloc
,free
以及与指针和动态内存分配相关的其他恶意内容(请注意: IDisposable接口,因为这不普遍,特别是在处理非托管资源时,例如某些类型的流的句柄,数据库会话等)。当您将变量声明为从System.Object
派生的任何类型时,该变量将是对象的引用,而不是对象本身。因此,object.member
访问对象成员,而不会在C和C ++中找到object->member
运算符的C#版本。
(上面的解释有些简化,我做了几个全面的概括,但这个主题远远超出了这个简短答案可以涵盖的范围,如果你需要进一步阅读,还有很多好书。)