2015-12-02 64 views
0

我在C#中实现链表所以我用两种方法链表实现在C#()

第一种方法

unsafe public struct Node 
     { 
      public int info; 
      public Node* link; 
     } 

这里是添加节点方法

public void AddNode(int a) 
     { 
      Node temp = new Node(); 
      temp.info = a; 
       if (Head == null) 
       { 
        Head = Current = &temp;   
       } 
      else 
      { 
        (*Current).link = &temp; 
        Current = &temp; 
       }           
      } 

当我运行此代码它不节省内存意味着它创建一个实例Node temp = new Node();结构,只要它里面ADDNODE它的内存是保存,但是当我打印出来使用这种方法以外的给我NullRefrenceException

第二种方法

使用类和对象

public class Node 
     { 
      public int info; 
      public Node link; 
     } 
     class Linked_list 
     { 
      public Node Head; 
      public Node Current; 



      public void insert_element_linkedlist(int a) 
      { 
       Node temp = new Node(); 
       temp.info = a; 
        if (Head == null) 
        { 
         Head = Current = temp;   
        } 
       else 
       { 
         Current.link = temp; 
         Current = temp; 
        }           
       } 
} 

第二种方法正常工作意味着每个临时节点Node temp = new Node();都保存在内存中。

问题: 为什么它不保存结构实例?

对不起,我的子标准英语。

+2

这只是一个练习来学习语言,或者你可以使用[LinkedList类](https://msdn.microsoft.com/en-us/library/he2s3bh7%28v=vs.110%29.aspx )?另外,在C#中使用指针是你应该只在非常奇怪的情况下做的事情;我不认为链表实现需要它。 – adv12

+0

它是一个数据结构的练习 –

+0

为什么它保存一个类的实例但不保存结构实例 这是什么 –

回答

1

结构实例是value type,在堆栈中创建,因此当AddNode返回时,它将被清除,并且指针指向内存中的随机位置。简单地创建一个指向变量的指针并不足以保持它的活力。

+0

是尼斯意味着结构就像'int float'所有其他数据类型一样。 –

+1

对象是[引用类型](https://msdn.microsoft.com/en-us/library/490f96s2.aspx)。对于结构体来说,数据实际上存储在堆栈中;对于一个对象,只有数据的*引用*被存储在堆栈上;数据分配在堆上。对象在它们“无法访问”之前不会消失(从活动对象或全局变量中没有未完成的引用),此时它们有资格进行垃圾回收。当存储数据的堆栈框架消失时,结构消失。 – adv12

+1

我应该补充一点,上面可能只是“大致”正确;我可能会使用一些错误的术语,但这是主旨。此外,结构体不一定存储在堆栈中,因为对象可以包含一个结构体,该结构体将成为堆中对象数据的一部分。但是他们的数据总是以“内联”的方式存储,而不是作为引用所指向的单独数据块存储。 – adv12