Untitled

mail@pastecode.io avatar
unknown
plain_text
7 months ago
7.4 kB
4
Indexable
Never
using System;

class Program
{
    private class ElementListy : IComparable<ElementListy>
    {
        public double Wartość { get; private set; }
        public ElementListy Następny { get; set; }

        public ElementListy(double x)
        {
            Wartość = x;
            Następny = null;
        }

        public void Usuń()
        {
            if (Następny != null)
            {
                if (Następny.Następny != null)
                {
                    Następny.Usuń();
                }
                Następny = null;
            }
        }

        public bool Szukaj(double x)
        {
            bool wynik = false;

            if (Wartość == x)
            {
                wynik = true;
            }

            if (!wynik && Następny != null)
            {
                wynik = Następny.Szukaj(x);
            }

            return wynik;
        }

        public void Dopisz(double x)
        {
            if (Następny == null)
            {
                Następny = new ElementListy(x);
            }
            else
            {
                Następny.Dopisz(x);
            }
        }

        public int CompareTo(ElementListy other)
        {
            if (other == null) return 1;
            return Wartość.CompareTo(other.Wartość);
        }
    }

    private class ListaJednokierunkowa
    {
        private ElementListy głowa;

        public ListaJednokierunkowa()
        {
            głowa = null;
        }

        public void DodajNaPoczątek(double wartość)
        {
            ElementListy nowyElement = new ElementListy(wartość);
            nowyElement.Następny = głowa;
            głowa = nowyElement;
        }

        private ElementListy DodajNaPoczątekRekurencyjnie(ElementListy obecny, double wartość)
        {
            if (obecny == null)
            {
                return new ElementListy(wartość);
            }

            obecny.Następny = DodajNaPoczątekRekurencyjnie(obecny.Następny, wartość);
            return obecny;
        }

        public void Wyświetl()
        {
            WyświetlRekurencyjnie(głowa);
            Console.WriteLine("null");
        }

        private void WyświetlRekurencyjnie(ElementListy obecny)
        {
            if (obecny != null)
            {
                Console.Write($"{obecny.Wartość} -> ");
                WyświetlRekurencyjnie(obecny.Następny);
            }
        }

        public void Usun(double wartość)
        {
            głowa = UsunRekurencyjnie(głowa, wartość);
        }

        public void Dopisz(double wartość)
        {
            if (głowa == null)
            {
                głowa = new ElementListy(wartość);
            }
            else
            {
                głowa.Dopisz(wartość);
            }
        }

        private ElementListy UsunRekurencyjnie(ElementListy obecny, double wartość)
        {
            if (obecny == null)
            {
                return null;
            }

            if (obecny.Wartość.Equals(wartość))
            {
                ElementListy pomocniczy = obecny.Następny;
                obecny = null;
                return pomocniczy;
            }

            if (obecny.Następny != null && obecny.Następny.Wartość.Equals(wartość))
            {
                if (obecny.Następny.Następny == null)
                {
                    obecny.Następny = null;
                }
                else
                {
                    obecny.Następny = obecny.Następny.Następny;
                }
                return obecny;
            }

            if (obecny.Następny != null && obecny.Następny.Wartość.Equals(wartość))
            {
                if (obecny.Następny.Następny != null)
                {
                    ElementListy pomocniczy = obecny.Następny;
                    obecny.Następny = obecny.Następny.Następny;
                    pomocniczy = null;
                }
            }

            obecny.Następny = UsunRekurencyjnie(obecny.Następny, wartość);
            return obecny;
        }

        public void Usuń()
        {
            if (głowa != null)
            {
                głowa.Usuń();
                głowa = null;
            }
        }

        public bool Szukaj(double x)
        {
            if (głowa != null)
            {
                return głowa.Szukaj(x);
            }

            return false;
        }

        public void Sortuj()
        {
            głowa = SortujRekurencyjnie(głowa);
        }

        private ElementListy SortujRekurencyjnie(ElementListy lista)
        {
            if (lista == null || lista.Następny == null)
                return lista;

            ElementListy posortowanaLista = null;
            ElementListy obecny = lista;

            while (obecny != null)
            {
                ElementListy następny = obecny.Następny;
                posortowanaLista = Wstaw(posortowanaLista, obecny);
                obecny = następny;
            }

            return posortowanaLista;
        }

        private ElementListy Wstaw(ElementListy posortowanaLista, ElementListy nowyElement)
        {
            if (posortowanaLista == null || posortowanaLista.CompareTo(nowyElement) >= 0)
            {
                nowyElement.Następny = posortowanaLista;
                return nowyElement;
            }

            ElementListy obecny = posortowanaLista;
            while (obecny.Następny != null && obecny.Następny.CompareTo(nowyElement) < 0)
            {
                obecny = obecny.Następny;
            }

            nowyElement.Następny = obecny.Następny;
            obecny.Następny = nowyElement;

            return posortowanaLista;
        }
    }

    static void Main(string[] args)
    {
        ListaJednokierunkowa lista = new ListaJednokierunkowa();

        lista.DodajNaPoczątek(3.5);
        lista.DodajNaPoczątek(2.2);
        lista.DodajNaPoczątek(1.1);

        Console.WriteLine("Lista jednokierunkowa przed usunięciem:");
        lista.Wyświetl();

        double elementDoUsunięcia = 2.2;
        Console.WriteLine($"\nUsuwam element {elementDoUsunięcia}");
        lista.Usun(elementDoUsunięcia);

        Console.WriteLine("\nLista jednokierunkowa po usunięciu:");
        lista.Wyświetl();

        double szukanaWartość = 3.5;
        Console.WriteLine($"\nCzy lista zawiera wartość {szukanaWartość}: {lista.Szukaj(szukanaWartość)}");
        szukanaWartość = 4.5;
        Console.WriteLine($"\nCzy lista zawiera wartość {szukanaWartość}: {lista.Szukaj(szukanaWartość)}");

        double nowaWartość = 4.4;
        Console.WriteLine($"\nDopisuję wartość {nowaWartość} na koniec listy:");
        lista.Dopisz(nowaWartość);
        lista.Wyświetl();

        Console.WriteLine("\nSortowanie listy:");
        lista.Sortuj();
        lista.Wyświetl();

        Console.WriteLine("\nUsuwanie całej listy z pamięci:");
        lista.Usuń();
        lista.Wyświetl();

        Console.ReadKey();
    }
}
Leave a Comment