Program testujący działanie listy

0

Witam,

Nie mogę sobie samemu poradzić z tym (pewnie dla wielu prostym) programem, ale dopiero się uczę.
Mam napisać program który pozwala dodawać nowy element na końcu jak i na początku listy, pozwala usunąć dany element listy oraz cała listę i wyszukanie elementu. Chciałem sobie też napisać fragment aby wyświetlał mi cała listę ale również mi nie wychodzi.
Takie fragmenty metod w klasie pokazał mi prowadzący zajęcia, tzn miał w prezentacji i z tego korzystaliśmy.
Również nie wiem jak usunąć całą listę dlatego fragment w klasie głównej za komentowałem aby program działał poprawnie.
Mam nadzieję że bardzo nie zagmatwałem opisu sprawy, ale proszę o wybaczenie bo jest to mój pierwszy post tutaj :)

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

namespace ConsoleApplication1
{
    public class ElementListy
    {
        public double Wartość;
        public ElementListy Następny;
        public ElementListy Korzeń;
        public ElementListy NowyElement;

        public ElementListy(double x)
        {
            Wartość = x; //Zapamiętanie
            Następny = null; //Wskaźnik = null
        }//Koniec konstruktora

        public void Dopisz(double x) // na koncu listy
        {
            if (Następny == null)
            {
                Następny = new ElementListy(x);
            }
            else
            {
                Następny.Dopisz(x);
            }
        }//Koniec metody

        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 pokaż(double x)
        {
            Console.WriteLine("x= " + x);
            if (Następny != null)
                Następny.pokaż(x);
        }

        public void usuńelement(double x)
        {
            ElementListy Pomocniczy;  // na poczatku listy
            if (Korzeń.Wartość == x)
            {
                Pomocniczy = Korzeń.Następny;
                Korzeń = null;//Usuwanie z pamięci.
                Korzeń = Pomocniczy;
            }

            if (Następny != null)    // na koncu listy
            {
                if (Następny.Wartość == x)
                {
                    if (Następny.Następny == null)
                    {
                        Następny = null;
                    }
                }
            }

            ElementListy Pomoc;     // w srodku listy
            if (Następny.Wartość == x)
            {
                if (Następny.Następny != null)
                {
                    Pomoc = Następny;
                    Następny = Następny.Następny;
                    Pomoc = null;//Usunięcie z pamięci!!
                }
            }
        }

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

    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;
        }
    }





    class Program
    {
        static void Main(string[] args)
        {
            double x;
            int kontrol;
            int opcja;
           
            opcja = 0;
            kontrol = 0;
            x = 0;

            ElementListy Lista = new ElementListy(x);
            ListaNaPoczątku Poczatek = new ListaNaPoczątku();
            do
            {
                kontrol = 0;
                Console.WriteLine("Wybierz co chcesz zrobic:");
                Console.Write("1. Dopisz element na początku listy.\n2. Dopisz element na końcu listy.\n");
                Console.Write("3. Sprawdź czy dany element jest w liście.\n4. Pokaż listę.\n");
                Console.WriteLine("5. Usuń dany element.\n6. Usuń całą listę.");

                opcja = Convert.ToInt32(Console.ReadLine());

                switch (opcja)
                {
                    case 1:
                    {
                        Console.WriteLine("Podaj element do wpisania na początek listy");
                        x = Convert.ToDouble(Console.ReadLine());
                        Poczatek.Dodaj(x);
                        break;
                    }
                    case 2:
                    {
                        Console.WriteLine("Podaj element do wpisaniana koniec listy");
                        x = Convert.ToDouble(Console.ReadLine());
                        Lista.Dopisz(x);
                        break;
                    }
                    case 3:
                    {
                        Console.WriteLine("Podaj element aby sprawdzic czy znajduje się on w liście");
                        x = Convert.ToDouble(Console.ReadLine());
                        Lista.Szukaj(x);
                        break;
                    }
                    case 4:
                    {
                        Console.Clear();
                        Lista.pokaż(x);
                        break;
                    }
                    case 5:
                    {
                        Console.WriteLine("Podaj wartośc jaką mam usunąc z listy");
                        x = Convert.ToDouble(Console.ReadLine());
                        Lista.usuńelement(x);
                        break;
                    }
                    //case 6:
                    //{
                    //    Lista.UsuńListe(korzeń);
                    //    Console.WriteLine("Lista została usunięta");
                    //    break;
                    //}
                    default:
                    {
                        Console.WriteLine("Zła opcja");
                        break;
                    }
                }
                Console.WriteLine("Chcesz wrócic spowrotem do menu?\n1. TAK\n2. NIE");
                kontrol = Convert.ToInt32(Console.ReadLine());
                Console.Clear();
            }
            while (kontrol == 1);
            
            Console.ReadKey();
        }
    }
}

0

Wybacz ale nie mam ochoty przegryzać się przez cały twój kod więc konkretnie co ci nie działa ?
Żeby wypisać całą listę to wypisujesz korzeń a potem rekurencyjnie wywołujesz metodę wypisującą na następnym.

0

Mam taką małą klasę (wiem, mogę ją wrzucić do klasy element listy, już u siebie to zrobiłem) ListanaPoczątku, w niej metoda Dopisz aby dopisać element na początku listy i to nie działa. Wartość jest podana przez użytkownika a Korzeń i inne zostają null. Metoda Dodaj z dodawaniem na koniec listy też coś nie chce działać.
Wertując internet zauważyłem że listę można inaczej robić a nie jak mi tu wykładowca pokazywał i nie wiem czy jak bym zrobił inaczej to uzna bo z nimi to nie wiadomo.
Nie umiem wywołać metody usuwania całej listy, która jest w opcji 6, za komentowałem żeby się nie wykrzaczał program.
Wiem że jestem Newbie i pewnie zapominam o czymś ale nie od razu Rzym zbudowano :P.

Zagadałem jeszcze do brata informatyka i zobaczę co on wykombinuje, bo po przejrzeniu kodu stwierdził że gościu (że się wyrażę) c****o nazywa i pisze programy.

Dziękuję za ewentualną pomoc.

Edit:
Metoda dodawania elementu na końcu listy działa bo udało mi się poprawnie napisać wypisywanie listy, dopisywanie na początku nadal mi nie działa.
Usuwanie elementu z listy też nie działa, wywala błąd.

0

Ja tam ekspertem nie jestem, ale wydaje mi się, że tego listę wskaźnikową implementuje się w taki sposób, że następnikiem ostatniego elementu jest pierwszy, natomiast poprzednikiem pierwszego jest ostatni. Z tego wynika, że jeśli w liście jest tylko jeden element, to jest on swoim własnym następnikiem i poprzednikiem.

Przede wszystkim należy zrobić odpowiednią strukturę klas, bo ta tutaj jest masakryczna, całkowite pomieszanie z poplątaniem.
Klasa ElementListy ma posiadać: Wartość, Następny i Poprzedni (oba typu ElementListy), zaś klasa Lista ma mieć pole typu ElementListy wskazujące na pierwszy jej element. Wszystkie metody dodające, usuwające i szukające mają być w klasie Lista, a nie ElementListy!

Wziąwszy pod uwagę te założenia sama implementacja jest banalna, gdyż aby dodać element do listy na koniec wystarczy:

  1. jako jego następnik ustawić pierwszy element listy;
  2. jako jego poprzednik ustawić poprzednik pierwszego;
  3. dodawany element ustawić jako następnik poprzednika pierwszego;
  4. a także jako poprzednik pierwszego.
    W przypadku dodawania na początek, należy ponadto ustawić, aby pierwszy element listy był tym nowo dodanym.
    (Pierwszym elementem nazywam to, co u Ciebie jest korzeniem.)
    Usuwanie jest właściwie prostsze, bo dla usuwanego elementu należy:
  5. jako poprzednik następnika elementu ustawić poprzednik elementu;
  6. jako następnik poprzednika elementu ustawić następnik elementu.
    Oczywiście przy tym wszystkim trzeba obsłużyć przypadek dodawania do pustej listy (wówczas trzeba będzie stworzyć pierwszy element i ustawić go jako swój poprzednik i następnik) oraz usuwanie ostatniego elementu listy.
0

Dzięki za odpowiedź.
Z tego co rozumiem(albo mi się tylko tak wydaje) to jeśli ostatni element ma na pierwszy a nie na null to już chyba nie będzie listą jednokierunkową?
Tak, wiem, jest w tej klasie jeden wielki burdel, ale prowadzący nam pokazywał do jednej klasy to wszystko dać. Ale czy robienie nowych klas i innych rzeczy spodoba się mojemu prowadzącemu to wątpię. Trzeba tak jak on to sobie zażyczy ;/. Samemu najchętniej bym pokombinował z List<> czy coś takiego.
Przeanalizuję sobie to co mi napisałeś i może mi pomoże.
Ech a potem mam jeszcze dopisać metodę aby przepisywała mi tablicę to listy i odwrotnie też jak w erze kamienia łupanego, nie mogę używać żadnych Array-ów ;/

0
Kovalinio napisał(a):

Dzięki za odpowiedź.
Z tego co rozumiem(albo mi się tylko tak wydaje) to jeśli ostatni element ma na pierwszy a nie na null to już chyba nie będzie listą jednokierunkową?

No chyba tak, nie znam się na listach jednokierunkowych, ja dwukierunkową opisałem.

Tak, wiem, jest w tej klasie jeden wielki burdel, ale prowadzący nam pokazywał do jednej klasy to wszystko dać.

Dla mnie jest to co najmniej dziwne, i nie wiem czy w ogóle wykonalne.

Samemu najchętniej bym pokombinował z List<> czy coś takiego.

Takie coś byłoby bez sensu, przecież o to chodzi w ćwiczeniu, żeby nie używać gotowych implementacji, tylko samemu poznać i zrozumieć jak to wszystko działa. :)

Ech a potem mam jeszcze dopisać metodę aby przepisywała mi tablicę to listy i odwrotnie też jak w erze kamienia łupanego, nie mogę używać żadnych Array-ów ;/

No chyba jednak będziesz musiał użyć tablicy, skoro masz do niej przepisać listę. :)
Ale o co chodzi z kamieniem łupanym, to nie wiem.

0

No chyba tak, nie znam się na listach jednokierunkowych, ja dwukierunkową opisałem.

Szkoda, ale dzięki za opisanie dwukierunkowych bo z nimi też będę musiał zrobić zadanie.

Dla mnie jest to co najmniej dziwne, i nie wiem czy w ogóle wykonalne.

Zobaczę, pokombinuje, najwyżej zrobię dwie.

Takie coś byłoby bez sensu, przecież o to chodzi w ćwiczeniu, żeby nie używać gotowych implementacji, tylko samemu poznać i zrozumieć jak to wszystko działa. :)

Rozumiem. Dopiero jak będzie nam pokazane łopatologicznie jak działa i zakumamy to wtedy będziemy sobie mogli używać gotowców.

No chyba jednak będziesz musiał użyć tablicy, skoro masz do niej przepisać listę. :)
Ale o co chodzi z kamieniem łupanym, to nie wiem.

Ech mało precyzyjnie napisałem :P, wiem.
Chodziło mi o to że (również idąc na skróty) mógłbym do kopiowania itp. używać np. .ToArray() , czy jak to tam jest. Jeszcze się dokładnie w to nie zagłębiałem.

0
Kovalinio napisał(a):

Rozumiem. Dopiero jak będzie nam pokazane łopatologicznie jak działa i zakumamy to wtedy będziemy sobie mogli używać gotowców.

No mniej więcej tak. Dzięki temu będziesz wiedział, kiedy lepiej użyć listy wskaźnikowej, a kiedy tablicowej.

Chodziło mi o to że (również idąc na skróty) mógłbym do kopiowania itp. używać np. .ToArray() , czy jak to tam jest. Jeszcze się dokładnie w to nie zagłębiałem.

No mógłbyś. Ale najpierw musisz to zaimplementować, bo przecież w Twojej nowej klasie tego nie ma. ;P

0

Przesyłam kod po drobnych zmianach (nadal burdel :P). W punktach przesyłam problemy których na razie nie mogę rozwiącac:

  1. Co mam zrobić, zmienić abym nie miał zawsze zera na początku listy?
  2. Metoda Dodaj nie chce mi dodawać elementów na początku listy.
  3. Metoda UsuńElement również nie działa
  4. Nie umiem wywołać metody UsuńListe.
  5. Jeśli chodzi o metodę tabdolis kopiującą tablicę do listy do działa, później jeśli odpalę opcję pokaż do mi powiela cały czas jeden element, ale jeśli już cały program przeglądałem krok po kroku za pomocą F11 to wyświetla mi dobrze. Czym to jest spowodowane?
  6. Na razie nie mam pomysłu jak w podobny sposób napisać kopiowanie listy do tablicy.

Proszę o pomoc.
Oto mój kod:

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

namespace ConsoleApplication1
{
    public class ElementListy
    {
        public double Wartość;
        public ElementListy Następny;
        public ElementListy Korzeń;
        public ElementListy NowyElement;
        public int i;

        public ElementListy(double x)
        {
            Wartość = x; //Zapamiętanie
            Następny = null; //Wskaźnik = null
        }//Koniec konstruktora

        public ElementListy()
        {
        }

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

        public void Dopisz(double x) // na koncu listy
        {
            if (Następny == null)
            {
                Następny = new ElementListy(x);
            }
            else
            {
                Następny.Dopisz(x);
            }
        }//Koniec metody

        public bool Szukaj(double x)
        {
            bool wynik;
            wynik = false; //Domyślna wartość!
            if (Wartość == x)
            {
                wynik = true;
                Console.WriteLine("{0} znajduje sie w liście.", x);
            }
            if ((wynik == false) && (Następny != null))
            {
                wynik = Następny.Szukaj(x);
            }
            if ((wynik == false) && (Następny == null))
                Console.WriteLine("Brak podanej wartości w liście");
            return wynik;
        }//koniec metody

        public void pokaż()
        {
            Console.WriteLine("x= " + Wartość);
            if (Następny != null)
                Następny.pokaż();
        }

        public void usuńelement(double x)
        {
            ElementListy Pomocniczy;  // na poczatku listy
            if (Korzeń.Wartość == x)
            {
                Pomocniczy = Korzeń.Następny;
                Korzeń = null;//Usuwanie z pamięci.
                Korzeń = Pomocniczy;
            }

            if (Następny != null)    // na koncu listy
            {
                if (Następny.Wartość == x)
                {
                    if (Następny.Następny == null)
                    {
                        Następny = null;
                    }
                }
            }

            ElementListy Pomoc;     // w srodku listy
            if (Następny.Wartość == x)
            {
                if (Następny.Następny != null)
                {
                    Pomoc = Następny;
                    Następny = Następny.Następny;
                    Pomoc = null;//Usunięcie z pamięci!!
                }
            }
        }

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

        public void tabdolis(double [] Tablica, int liczbaelem) //kopiuje tablice do listy
        {
            double x;
            x = 0;

            for (i = 0; i < liczbaelem; i++)
            {
                x = Tablica[i];
                Dopisz(x);
            }
        }

        public void lisdotab() // kopiuje liste do tablicy
        {
            
            if (Następny != null)
                Następny.lisdotab();
        }
    }

  

    class Program
    {
        static void Main(string[] args)
        {
            double x;
            int kontrol;
            int opcja;
            int i;
            Random GeneratorLiczb;
            int LiczbaWylosowana;
            double[] Tablica;
            int liczbaelem;

            i = 0;
            opcja = 0;
            kontrol = 0;
            x = 0;
            liczbaelem = 20;
            Tablica = new double[liczbaelem];

            ElementListy Lista = new ElementListy();

            //generator losowej tablicy double
            for (i = 0; i < liczbaelem; i++)
            {
                GeneratorLiczb = new Random();
                LiczbaWylosowana = GeneratorLiczb.Next(1000);
                Tablica[i] = LiczbaWylosowana;
            }

            do
            {
                kontrol = 0;
                Console.WriteLine("Wybierz co chcesz zrobic:");
                Console.Write("1. Dopisz element na początku listy.\n2. Dopisz element na końcu listy.\n");
                Console.Write("3. Sprawdź czy dany element jest w liście.\n4. Pokaż listę.\n");
                Console.WriteLine("5. Usuń dany element.\n6. Usuń całą listę.");
                Console.WriteLine("7. Tablica do listy\n8. Lista do tablicy");

                opcja = Convert.ToInt32(Console.ReadLine());

                switch (opcja)
                {
                    case 1:
                    {
                        Console.WriteLine("Podaj element do wpisania na początek listy");
                        x = Convert.ToDouble(Console.ReadLine());
                        Lista.Dodaj(x);
                        break;
                    }
                    case 2:
                    {
                        Console.WriteLine("Podaj element do wpisaniana koniec listy");
                        x = Convert.ToDouble(Console.ReadLine());
                        Lista.Dopisz(x);
                        break;
                    }
                    case 3:
                    {
                        Console.WriteLine("Podaj element aby sprawdzic czy znajduje się on w liście");
                        x = Convert.ToDouble(Console.ReadLine());
                        Lista.Szukaj(x);
                        break;
                    }
                    case 4:
                    {
                        Console.Clear();
                        Lista.pokaż();
                        break;
                    }
                    case 5:
                    {
                        Console.WriteLine("Podaj wartośc jaką mam usunąc z listy");
                        x = Convert.ToDouble(Console.ReadLine());
                        Lista.usuńelement(x);
                        break;
                    }
                    //case 6:
                    //{
                    //    Lista.UsuńListe(korzeń);
                    //    Console.WriteLine("Lista została usunięta");
                    //    break;
                    //}
                    case 7:
                    {
                        Lista.tabdolis(Tablica, liczbaelem);
                        break;
                    }
                    case 8:
                    {
                        break;
                    }
                    default:
                    {
                        Console.WriteLine("Zła opcja");
                        break;
                    }
                }
                Console.WriteLine("Chcesz wrócic spowrotem do menu?\n1. TAK\n2. NIE");
                kontrol = Convert.ToInt32(Console.ReadLine());
                Console.Clear();
            }
            while (kontrol == 1);
            
            Console.ReadKey();
        }
    }
}

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