试图理解链表+Class的概念
Trying to understand linked list + Class concept
我正在学习C#中的Lists,我有一个很大的疑问,你看到这里,属性 "Siguiente" 是相同的类型class,我不明白怎么这会影响内部代码,实际上意味着列表有效,即 属性 用于在列表中创建指针。我的疑惑是
- 在同一个 class 中有一个 class 类型的变量在哪个方面有影响?
- 系统如何知道这是一个指针?
- 是否在 "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
下图大致描述了引用和对象的存储位置
链表的概念强烈依赖于这个逻辑,因为你不在对象内部存储对象——你存储引用
此外,与难以理解的大问题相比,用更少的代码创建更容易理解的问题会更好
我正在学习C#中的Lists,我有一个很大的疑问,你看到这里,属性 "Siguiente" 是相同的类型class,我不明白怎么这会影响内部代码,实际上意味着列表有效,即 属性 用于在列表中创建指针。我的疑惑是
- 在同一个 class 中有一个 class 类型的变量在哪个方面有影响?
- 系统如何知道这是一个指针?
- 是否在 "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
下图大致描述了引用和对象的存储位置
链表的概念强烈依赖于这个逻辑,因为你不在对象内部存储对象——你存储引用
此外,与难以理解的大问题相比,用更少的代码创建更容易理解的问题会更好