Lista jednokierunkowa w C#

0

Czy w c# istnieje lista jednokierunkowa i jak ją zaimplementować?

0

istnieje typ generyczny List<T>
wewnetrznie wykorzystuje on tablice do przechowywania elementow

jesli chodzi ci o liste wskaznikowa jak w C/C++ to nie ma takiej struktury (bo zazwyczaj wystarcza List<T>)
jesli potrzebujesz taka, to powinienes zaimplementowac sobie wlasny typ generyczny, ktory bedzie wewnetrznie trzymal elementy w wezlach, ktore beda skladaly sie z elementu i referencji na kolejny wezel
oczywiscie zeby bylo to sensowne i uzyteczne w swiecie .net powinienes poimplmentowac rozne interfejsy, m.in. IList<T>

0

LinkedList<T>?

0

http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx
"Represents a doubly linked list."

Jednokierunkowych nie robią :P
Samemu trzeba zaimplementować.

0

No dobra, ale wystarczy wykorzystać ją w połowie. ;)

0

Ktoś mnie oświeci po co komu lista wskaźnikowa, skoro można użyć po prostu List<T>?

0

chyba jedynie po to zeby potrenowac sobie implementacje IList<T> i calej reszty :)

0

Albo do szybszego wstawiania i usuwania elementów.

0

Na studia, na algorytmike chociażby ;P

0

Azarien:
Gwarantowany stały czas dodawania elementu na koniec lub początek.

0

ja podzielam poglad Azarien'a, bo w projektach biznesowych do tej pory nigdy nie spotkalem sie z potrzeba uzycia takiej struktury (mowie o proj. w C# czy szerzej w .net)
w 95% przypadkach standardowe struktury kolekcji byly wystarczajace
chyba tylko dwa razy pokusilem sie o stworzenie jakis bardziej wyspecjalizowanych kolekcji (nie mowie o klasach na potrzeby jakis kontrolek etc., ktore byly standardowa List<T> z kilkoma dodatkowymi metodami)

0

http://www.cs.put.poznan.pl/msterna/index_pliki/Zadanie%203.pdf mamy z koleżanką to zadanie do zrobienia właśnie na algorytmy i struktury danych. Dlatego potrzebna jest nam lista jednokierunkowa. I proszę nie pisać, że możemy w C++ zrobić, bo my lubimy C# za prostotę

0

Google: "c# singly linked list"

0

podsumowywujac, listy jednokierunkowej nie ma, jest dwu
musisz ja sam zaimplmentowac, jest to zadanie proste na max 30 min
zasada ta sama co w c++ i innych jezykach obiektowych
jesli masz konkretny problem z implemntacja, zapytaj o niego
mozesz wzorowac sie na System.Collections.Generic.LinkedList<T>, ktora implementuje m.in. ICollection<T>, IEnumerable<T>, ICollection, IEnumerable
jej wezlami sa elementy klasy System.Collections.Generic.LinkedListNode<T>

1

Hmm, skoro masz ją zaimplementować to nawet jakby już była w .NET to nic by ci to nie dało ;)

Tak czy inaczej... W liście jednokierunkowej chodzi o coś takiego:?

class SingleListNode<T>
{
    public SingleListNode() { }
    public SingleListNode(T value)
    {
        this.Value = value;
    }

    public T Value { get; set; }
    public SingleListNode<T> Next { get; set; }
}

class SingleList<T>
{
    SingleListNode<T> head;
    SingleListNode<T> tail;

    private void Initialise(T firstElement)
    {
        head = new SingleListNode<T>(firstElement);
        tail = head;
    }

    public void Add(T val)
    {
        if (head == null)
        {
            Initialise(val);
        }
        else
        {
            tail.Next = new SingleListNode<T>(val);
            tail = tail.Next;
        }
    }

    public T Get(int ndx)
    {
        SingleListNode<T> current = head;

        if (head == null)
            throw new System.IndexOutOfRangeException();

        for (int i = 0; i < ndx; i++)
        {
            current = current.Next;
            if (current == null)
                throw new System.IndexOutOfRangeException();
        }

        return current.Value;
    }
}
0

Wszystko fajnie z tą klasą, tylko jak to sortować?
lista.Get(i) wywoła i-ty element, spoko. Tylko operacja lista.Get(i) = ... nie działa. Kompilator się czepia. Nie mogę nic wpisać zamiast obecnej wartości

0

czlowieku teraz to sie troche zaczynasz kompromitowac
nie rozumiesz jak dzialaja metody, ta Get zwraca wartosc (i przyjumuje jeden parametr)
tak sie nie robi przypisan
do klasy ktora zakproponowac MSM dodaj sobie indexer
poza tym MSM podal jakis wyjsciowy szkic klasy, a nie calosciowa implmentacje

0

Już zauważyłem, że Get(i) zwraca wartość, ale jak mam nadpisać ten element?

0

Napisałem sobie funkcję do podmiany wartości. Najlepiej wszystkie dane w obu klasach zrobić na public

public class SingleListNode<T>
    {
        public SingleListNode() { }
        public SingleListNode(T value)
        {
            this.Value = value;
        }

        public T Value { get; set; }
        public SingleListNode<T> Next { get; set; }
    }

    public class SingleList<T>
    {
        public SingleListNode<T> head;
        public SingleListNode<T> tail;

        public void Initialise(T firstElement)
        {
            head = new SingleListNode<T>(firstElement);
            tail = head;
        }
        public void Add(T val)
        {
            if (head == null)
            {
                Initialise(val);
            }
            else
            {
                tail.Next = new SingleListNode<T>(val);
                tail = tail.Next;
            }
        }

        public T Get(int ndx)
        {
            SingleListNode<T> current = head;

            if (head == null)
                throw new System.IndexOutOfRangeException();

            for (int i = 0; i < ndx; i++)
            {
                current = current.Next;
                if (current == null)
                    throw new System.IndexOutOfRangeException();
            }

            return current.Value;
        }
        public void Set(int ndx, T value)
        {
            SingleListNode<T> current = head;

            if (head == null)
                throw new System.IndexOutOfRangeException();

            for (int i = 0; i < ndx; i++)
            {
                current = current.Next;
                if (current == null)
                    throw new System.IndexOutOfRangeException();
            }

            current.Value = value;
        }
    } 

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