Попытка понять связанный список + Концепция класса - PullRequest
0 голосов
/ 31 марта 2020

Я изучаю списки в C#, у меня есть большие сомнения, вы видите здесь, свойство "Siguiente" относится к тому же классу, я не понимаю, как это влияет на код внутри и что на самом деле означает, список работает, это свойство используется для создания указателей в списке. Я сомневаюсь,

  1. На какое отношение это влияет, если переменная типа класса находится внутри одного и того же класса?
  2. Как система знает, что она действует как указатель ?
  3. Добавлены ли значения в "Trabajo"?

При добавлении остальной части кода моя главная задача - объект "CNodo".

Cheers

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();


        }
    }
}

Ответы [ 2 ]

3 голосов
/ 31 марта 2020

Класс не является экземпляром объекта - класс описывает, как будет вести себя объект и какие данные он будет хранить. Если у вас есть класс, который объявлен так:

    class MyClass
    {
        MyClass nextNode;
    }

Это означает, что экземпляр этого класса будет содержать ссылку на объект того же класса внутри него. Чтобы создать экземпляр класса, вы вызываете конструктор с ключевым словом new, например:

MyClass instance = new MyClass()

Теперь у вас есть экземпляр класса в вашей памяти, и instance это ссылка на него. Вы должны понимать, что nextNode внутри instance НЕ является объектом - это ссылка на объект. Таким образом, можно написать следующие строки:

    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

Изображение ниже приблизительно описывает, где хранятся ссылки и объекты

enter image description here

Концепция связанного списка сильно зависит от этой логики c, потому что вы не храните объекты внутри объектов - вы храните ссылки

enter image description here

Также вам лучше создавать более простые для понимания вопросы с меньшим количеством кода, чем с большим, который трудно понять

1 голос
/ 31 марта 2020

Inte rnet изобилует отличными учебниками о том, как работают связанные списки - например, этот: https://www.tutorialspoint.com/data_structures_algorithms/linked_list_algorithms.htm. Поэтому позвольте мне, пожалуйста, отослать вас к одному из них.

Класс экземпляры реализованы в виде динамических c объектов - думаю, mallo c () - на которые ссылаются указатели. Поэтому вы можете создавать их связанные списки самостоятельно.

Теперь, просто сказав все это, позвольте мне также сказать, что «вам не нужно делать это в реальной жизни». В объектно-ориентированных языках, которые предоставляют «Классы», вы также всегда найдете удобные контейнерные классы , которые избавят вас от необходимости go из-за рутинной работы по самому созданию связанного списка ... кроме в качестве учебного упражнения. Вы просто создаете контейнер соответствующего вкуса и помещаете в него вещи. При правильном использовании вы знаете, что контейнер будет не содержать ошибок, и у вас будет легкий доступ к некоторым очень сложным структурам данных в реализациях некоторых контейнеров.

...