试图理解链表+Class的概念

Trying to understand linked list + Class concept

我正在学习C#中的Lists,我有一个很大的疑问,你看到这里,属性 "Siguiente" 是相同的类型class,我不明白怎么这会影响内部代码,实际上意味着列表有效,即 属性 用于在列表中创建指针。我的疑惑是

  1. 在同一个 class 中有一个 class 类型的变量在哪个方面有影响?
  2. 系统如何知道这是一个指针?
  3. 是否在 "Trabajo" 中添加了值?

添加其余代码,我主要关心的是 "CNodo" 对象。

干杯

using System;
using System.Collections.Generic;
using System.Text;

    namespace Lista_Ligada
    {
        class CNodo
        {
            private int vDato;

            private CNodo vSiguiente = null;

            public int Dato1 
                {

                    get => vDato; 
                    set => vDato = value ;

                }

            internal CNodo Siguiente
                {

                get => vSiguiente;
                set => vSiguiente = value;

                }

            public override string ToString()
            {
                return string.Format("[{0}]", vDato);
            }


            public void TextoPrueba()
            {
                Console.WriteLine("Prueba");
            }



        }
    }

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace Lista_Ligada
    {
        class CListaLigada
        {
            private CNodo   Ancla;
            private CNodo   Trabajo ;   
            private CNodo   Trabajo2;

            public CListaLigada()
            {

                Ancla = new CNodo();
                Ancla.Siguiente = null;

            }

            public void Transversa()
            {
                Trabajo = Ancla;
                Console.WriteLine("El ancla tiene un valor de Siguiente de {0}", Trabajo.Siguiente);
                Console.WriteLine("El ancla tiene un valor de Dato de {0}", Trabajo.Dato1);

                while (Trabajo.Siguiente != null)
                {
                    Trabajo = Trabajo.Siguiente ;
                    int D   = Trabajo.Dato1     ;
                    Console.WriteLine("{0}", D) ;
                    Console.WriteLine("{0}", Trabajo.Siguiente);              
                }

                Console.WriteLine();    

            }

            public void Adicionar(int pDato)
            {
                Trabajo = Ancla;

                while (Trabajo.Siguiente != null)
                {
                    Trabajo = Trabajo.Siguiente;
                }

                CNodo Temp = new CNodo();  // ? 

                Temp.Dato1      = pDato;
                Temp.Siguiente  = null;

                Trabajo.Siguiente = Temp;       

            }


        }
    }
using System;

namespace Lista_Ligada
{
    class Program
    {
        static void Main(string[] args)
        {
            CListaLigada MiLista = new CListaLigada();

            CNodo Txt = new CNodo();

            MiLista.Adicionar(19);
            MiLista.Adicionar(3);
            MiLista.Adicionar(5);
            MiLista.Adicionar(7);
            MiLista.Adicionar(7);
            MiLista.Adicionar(5);
            MiLista.Adicionar(3);
            MiLista.Adicionar(1);
            MiLista.Adicionar(0);

            MiLista.Transversa();

            Txt.TextoPrueba();


            MiLista.Transversa();


        }
    }
}

Internet 上有很多关于链表如何工作的优秀教程——例如这个:https://www.tutorialspoint.com/data_structures_algorithms/linked_list_algorithms.htm。因此,现在让我向您推荐其中之一。

Class 实例 被实现为动态对象——想想malloc()——被指针引用。因此,您可以自己构建它们的链表。

现在,说了那么多,让我再说一下 "you don't have to do this in real life." 在提供 "Classes," 的面向对象语言中,您总会发现方便的 容器 类 这消除了您自己实际创建链表的苦差事......除了作为学习练习。您只需实例化一个具有适当风格的容器并将东西放入其中。如果使用得当,您知道容器 没有错误,并且您可以轻松访问某些容器实现中的一些非常复杂的数据结构。

A class 不是对象的实例 - class 描述对象的行为方式以及它将存储的数据。 如果你有一个 class,它是这样声明的:

    class MyClass
    {
        MyClass nextNode;
    }

这意味着,此 class 的实例将保存对其中相同 class 的对象的引用。 要创建 class 的实例,您可以使用关键字 new、f.e.:

调用构造函数

MyClass instance = new MyClass()

现在你的记忆中有一个 class 的实例,instance 是对它的引用。 您必须了解,instance 中的 nextNode 不是对象 - 它是对对象的引用。因此可以编写以下行:

    instance.nextNode = instance; //this will assign the same reference to nextNode as instance
    instance.nextNode = new MyClass(); //this will assign a reference to a different object with the same type MyClass

下图大致描述了引用和对象的存储位置

链表的概念强烈依赖于这个逻辑,因为你不在对象内部存储对象——你存储引用

此外,与难以理解的大问题相比,用更少的代码创建更容易理解的问题会更好