C# usunięcie elementu w liście jednokierunkowej

0

Witam, trafiłem tutaj z pewnym problemem - pomagam koleżance napisać program zajmujący się listą jednokierunkową. Doszedłem do tego że program pokazuje, dopisuje i wyszukuje elementy listy ale nie umiem sprawić aby usunąć konkretny element. Visual c# nie pokazuje błędu ale program nie usuwa liczby z listy.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication2
{
    class Program
    {
        public class ElementListy
        {
            public double Wartość;
            public ElementListy Następny;
            public ElementListy(double x)
            {
                Wartość = x; //Zapamiętanie
                Następny = null; //Wskaźnik = null
            }//Koniec konstruktora
            public void Dopisz(double x)
            {
                if (Następny == null)
                {
                    Następny = new ElementListy(x);
                }
                else
                {
                    Następny.Dopisz(x);
                }
            }   //Koniec metody
            public void Pokaż()
            {
                Console.WriteLine("Wartość = " + Wartość);
                if (Następny != null) Następny.Pokaż();
            }//Koniec pokazywania
 
 
            public bool Szukaj(double x)
            {
                bool wynik;
                wynik = false; //Domyślna wartość!
                if(Wartość == x)wynik = true;
                if((wynik == false) && (Następny != null))
                {
                    wynik = Następny.Szukaj(x);
                }
                return wynik;
            }//koniec metody
 
            public void UsuńWewnętrzny(double x)
            {
                ElementListy Pomoc;
                if (Następny.Wartość == x)
                {
                    if (Następny.Następny != null)
                    {
                        Pomoc = Następny;
                        Następny = Następny.Następny;
                        Pomoc = null;
                    }
                }
            }//Koniec metody UsuńWewnętrzny
        }
        public class ListaNaPoczątku
        {
            public ElementListy Korzeń;
            public ElementListy NowyElement;
            public ListaNaPoczątku(double x)
            {
                Korzeń = new ElementListy(x);
            }
            public void Dodaj(double x)
            {
                NowyElement = new ElementListy(x);
                NowyElement.Następny = Korzeń;
                Korzeń = NowyElement;
            }
 
}
        static void Main(string[] args)
        {
            double x = 5;
            ListaNaPoczątku Głowa;
            double i;
 
            Głowa = null;
            i = 0;
 
            for (i = 0; i < 10; i++)
            {
                if (Głowa == null) Głowa = new ListaNaPoczątku(i); else Głowa.Dodaj(i);
            }
 
            Głowa.Korzeń.Pokaż();
            Console.WriteLine(Głowa.Korzeń.Szukaj(x));
            Głowa.Korzeń.UsuńWewnętrzny(x);
            Głowa.Korzeń.Pokaż();
 
            Console.WriteLine(Głowa.Korzeń.Szukaj(x));
 
            Console.ReadKey();
        }
    }
}

Gdy coś pokombinuję to dostaję błąd w trakcie działania programu "Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu." ze wskazaniem na "Głowa.Korzeń.UsuńWewnętrzny(x);".

1

Moje uwagi:

  1. Element listy nie powinien manipulować danymi - to zadanie należy do listy.
  2. Metoda szukaj stwierdza tylko czy znalezione, a nie gdzie znalazł
  3. Metoda usuń wewnętrzny działa tylko na wskazanym elemencie i tylko gdy ma wartość x. Usuwa element następny, ale tylko wtedy gdy za tym elementem jest jeszcze jeden element
  4. Metoda dodaj nie ma większego sensu. Ustawia następny element nowego elementu na korzeń, po czym korzeń ustawia jako nowy element. Więc lista zawsze będzie miała jeden element: korzeń wskazujący na korzeń o wartości ostatnio dodanej do listy.
0

Ale to są metody podane przez nauczyciela i one działają. Problem jest w tym że nie umiem ich uruchomić w tym programie :(

Ciągle próbuje to zrobić, sprawdzam, kombinuję i nie wychodzi.

Można użyć metody Szukaj to znalezienia elementu który trzeba usunąć? Jeśli tak to jak to zrobić?

Po moim kombinowaniu program usuwa tylko cyfrę 8...

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

namespace z_prezentacji
{
    class Program
    {
        public class ElementListy
        {
            public double Wartość;
            public ElementListy Następny;
            public ElementListy(double x)
            {
                Wartość = x; //Zapamiętanie
                Następny = null; //Wskaźnik = null
            }//Koniec konstruktora
            public void Pokaż()
            {
                Console.WriteLine("Wartość = " + Wartość);
                if (Następny != null) Następny.Pokaż();
            }//Koniec pokazywania
            public bool Szukaj(double x)
            {
                bool wynik;
                wynik = false; //Domyślna wartość!
                if(Wartość == x)wynik = true;
                if((wynik == false) && (Następny != null))
                {
                    wynik = Następny.Szukaj(x);
                }
                return wynik;
            }//koniec metody
            public void UsuńWew(double x)
            {
                ElementListy Pomoc;
                bool wynik;
                wynik = false; //Domyślna wartość!
                if (Wartość == x) wynik = true;
                if ((wynik == false) && (Następny != null))
                {
                    wynik = Następny.Szukaj(x);
                    if(wynik == true)
                    {
                        Pomoc = Następny;
                        Następny = Następny.Następny;
                        Pomoc = null;//Usunięcie z pamięci!!
                    }
                }
             }//koniec metody
            public void Usuń(ElementListy Korzeń)
            {
                if(Następny != null)
                {
                    if(Następny.Następny != null)
                    {
                        Usuń(Następny);
                    }
                    Następny = null;
                }
            }
            public void UsuńWewnętrzny(double y)
            {
                ElementListy Pomoc;
                if (Następny.Wartość == y)
                {
                    if (Następny.Następny != null)
                    {
                        Pomoc = Następny;
                        Następny = Następny.Następny;
                        Pomoc = null;//Usunięcie z pamięci!!
                    }
                }//end if
            }
        }
        public class ListaNaPoczątku
        {
            public ElementListy Korzeń;
            public ElementListy NowyElement;

            public void Dodaj(double x)
            {
                NowyElement = new ElementListy(x);
                NowyElement.Następny = Korzeń;
                Korzeń = NowyElement;
            }

            public ListaNaPoczątku(double x)
            {
                Korzeń = new ElementListy(x);
            }
        }

        public static void Main(string[] args)
        {
            double x = 5;
            ListaNaPoczątku Głowa;
            double i;

            Głowa = null;
            i = 0;

            for (i = 0; i < 10; i++)
            {
                if (Głowa == null) Głowa = new ListaNaPoczątku(i); else Głowa.Dodaj(i);
            }

            Głowa.Korzeń.Pokaż();
            Console.WriteLine(Głowa.Korzeń.Szukaj(x));
            Głowa.Korzeń.UsuńWew(x);
            Głowa.Korzeń.Pokaż();
            Console.WriteLine(Głowa.Korzeń.Szukaj(x));
            Console.ReadKey();
        }
    }
}
0

Tak powinna wyglądać metoda szukaj:

 public ElementListy Szukaj(double x)
{
   ElementListy wynik = null; //Domyślna wartość - pusta
   if(Wartość == x) 
   {
       return this;//zwraca bieżący element i kończy metodę
   }
   if(Następny != null)
   {
      wynik = Następny.Szukaj(x);
   }
   return wynik;
}//koniec metody

Znajduje element listy. Można ją wtedy wykorzystać na przykład do usunięcia elementu. Twoja metoda natomiast stwierdza jedynie, że szukany element isntnieje, ale nie wiadomo gdzie.

0

Wielkie dzięki. :)

Jak użyć tej metody?

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

W programie mam wybrać?

            Głowa.Korzeń.Usuń();

To niestety nie działa... a nie mam pomysłu na parametr tej metody...

0

Ale co ta metoda ma robić? Ma usuwać wszystkie elementy listy?

0

Tak

0

To raczej będzie tak:

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

Każdy element sprawdza czy ma następnika i jeżeli ma to każe mu usunąć następnika. Czyli wywołania idą rekurencyjnie do końca i od końca wszystkie elementy zaczynają nullować "Następny". Na końcu zostanie Ci tylko korzeń

1 użytkowników online, w tym zalogowanych: 0, gości: 1