Arhn - архитектура программирования

Создайте общий класс связанного списка, чтобы создать цепочку объектов

Объясните, пожалуйста, что это за задание?

"Создайте универсальный класс связанного списка, который позволит нам создавать цепочки объектов разных типов".

Нужно ли нам создавать класс типа linkedlist и реализовывать интерфейс списка?

class LinkedList<T>:IList<T>
{
   //implement interface methods here?
}

Пожалуйста, приведите пример.

10.03.2010

  • Можете ли вы уточнить, что, как правило, не требуется подкласс готового примера другой структуры данных, пожалуйста? 11.03.2010
  • Извините, неправильно истолковал это как список. На самом деле, я беру свои слова назад, теперь, когда я просмотрел историю редактирования... 11.03.2010
  • Пожалуйста, убедитесь, что ваше описание проблемы является точным. Вы имеете в виду, что можно создавать разные экземпляры класса списка, где каждый экземпляр может содержать элементы одного типа, но где разные экземпляры списка могут содержать разные элементы, или где каждый экземпляр класса списка может содержать элементы разных типов? Другими словами, вам нужен строго типизированный список или нет? (Подозреваю, что вам нужен строго типизированный список, но текст плохо сформулирован в этом отношении) 14.05.2010

Ответы:


1

Для связанного списка я бы обычно не рекомендовал реализовывать IList, поскольку IList строго подразумевает постоянный доступ к любому члену списка. Я бы порекомендовал реализовать ICollection, а затем добавить дополнительные методы, являющиеся неотъемлемой частью связанных списков, такие как PushFront, PopBack и т. д. Вы можете посмотреть документацию MSDN для класса LinkedList<T> для сравнения (http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx), хотя вам следует реализовать свой класс отдельно.

10.03.2010

2

Связанный список — это специальный список, в котором каждый элемент (или объект-контейнер для каждого элемента) в списке имеет прямую ссылку («ссылку») на следующий элемент в списке. Этот тип списка не реализуется с использованием массива.

Односвязный список обычно имеет только ссылку на следующий элемент, а последний элемент имеет значение null, чтобы указать конец списка.

Двусвязный список имеет ссылку как на следующий, так и на предыдущий элементы с нулевыми значениями для обозначения каждого конца списка.

Преимущество связного списка в том, что вставки и удаления выполняются чрезвычайно быстро. Итерация по всему списку также имеет хорошую производительность, но нелинейный поиск может быть медленным.

Обычно реализация связанного списка должна реализовывать интерфейс IEnumerable<T>. Реализация IList<T> будет способствовать использованию неэффективного линейного поиска.

Реализация связанного списка в .NET имеет следующее объявление (за вычетом некоторого не относящегося к делу хлама).

LinkedList<T> : ICollection<T>, IEnumerable<T>, ICollection, IEnumerable

Как и в случае с интерфейсом IList<T>, я не понимаю, почему реализованы интерфейсы ICollection и ICollection<T>, но они есть.

Объект-контейнер элементов (со ссылками) выглядит следующим образом:

public sealed class LinkedListNode<T>
{
    public LinkedListNode<T> Next { get; }
    public LinkedListNode<T> Previous { get; }
    public T Value { get; set; }
}

Как это?

10.03.2010

3

Вам нужно создать свой собственный новый класс общего связанного списка. вот полное решение. в соответствии с комментарием выше .. Надеюсь, это поможет ..

class Program
{

    static void Main(string[] args)
    {
       // string linked List
        GenericsLinkedList<string> stringLinkedList = new GenericsLinkedList<string>(); //object 1
        string s1 = "Yes";
        string s2 = "No";
        string s3 = "True";
        string s4 = "False";
        stringLinkedList.AddHead(s1);
        stringLinkedList.AddHead(s2);
        stringLinkedList.AddHead(s3);
        stringLinkedList.AddHead(s4);
        //display List
        foreach (string str in stringLinkedList)
        {
            Console.WriteLine("----"+str);
        }

        //Integer LinkedList
        GenericsLinkedList<int> integerList = new GenericsLinkedList<int>();
        int n1 = 1;
        int n2 = 2;
        int n3 = 3;

        integerList.AddHead(n1);
        integerList.AddHead(n2);
        integerList.AddHead(n3);

        foreach (int Intger in integerList)
        {
            Console.WriteLine("----" + Intger);
        }


        Console.ReadKey();


    }
}


// Generic Linked List
class GenericsLinkedList<T>
{
    class LinkedlistNode
    {
        private LinkedlistNode next;
        private T item;

        public LinkedlistNode(T t)
        {
            next = null;
            item = t;

        }
        public LinkedlistNode Next
        {
            get
            {
                return next;
            }
            set
            {
                next = value;
            }
        }
        public T Item
        {
            get
            {
                return item;
            }
            set
            {
                item = value;
            }
        }       
    }
   private LinkedlistNode head;
   public GenericsLinkedList()
   {
       head = null;
   }
   public void AddHead(T t)
   {
       LinkedlistNode node = new LinkedlistNode(t);
       node.Next = head;
       head = node;
   }
   public IEnumerator<T> GetEnumerator()
   {
       LinkedlistNode current = head;
       while(current != null)
       {
           yield return current.Item;
           current = current.Next;
       }

   }

}
23.06.2010

4

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

class Generic<T> 
{
    public  T t;

}
static void Main(string[] args)
{
    Generic<object>[] genericarray = new Generic<object>[3];
    for (int i = 0; i < genericarray.Length; i++)
        genericarray[i] = new Generic<object>();
    int a = 0;
    double b = 0.515151513163;
    string c = "s.dçfslsfn";
    genericarray[0].t = a;
    genericarray[1].t = b;
    genericarray[2].t = c;
}
16.10.2010

5

Это должно сделать это

http://msdn.microsoft.com/en-us/library/0x6a29h6.aspx

// type parameter T in angle brackets

public class GenericList { // Вложенный класс также является универсальным для T. private class Node { // T используется в неуниверсальном конструкторе. публичный узел (T t) { следующий = ноль; данные = т; }

    private Node next;
    public Node Next
    {
        get { return next; }
        set { next = value; }
    }

    // T as private member data type.
    private T data;

    // T as return type of property.
    public T Data  
    {
        get { return data; }
        set { data = value; }
    }
}

private Node head;

// constructor
public GenericList() 
{
    head = null;
}

// T as method parameter type:
public void AddHead(T t) 
{
    Node n = new Node(t);
    n.Next = head;
    head = n;
}

public IEnumerator<T> GetEnumerator()
{
    Node current = head;

    while (current != null)
    {
        yield return current.Data;
        current = current.Next;
    }
}

}

13.05.2010

6

Дополнительные функции со следующей реализацией http://msdn.microsoft.com/en-us/library/0x6a29h6.aspx

 public class GenericList<T>
{
   private class Node
    {

        public Node(T t)
        {
            next = null;
            data = t;
        }

        private Node next;
        public Node Next
        {
            get { return next; }
            set { next = value; }
        }


        private T data;


        public T Data
        {
            get { return data; }
            set { data = value; }
        }
    }

    private Node head;
    private Node tail;
    private int count;


    public GenericList()
    {
        head = null;
        tail = null;
        count = 0;
    }


    public void AddHead(T t)
    {
        if (head == null)
            head = tail = new Node(t);
        else
        {
            Node n = new Node(t);
            n.Next = head;
            head = n;
        }
        count++;
    }

    public void AddTail(T t)
    {
        if(tail == null)
        {
            head = tail = new Node(t);
        }
        else
        {
            Node n = new Node(t);
            tail.Next = n;
            tail = n;

        }
        count++;
    }


    public void InsertAt(T t,int index)
    {
        if (index < 0 || index > count)
            throw new ArgumentOutOfRangeException();
        else if (index == 0)
            AddHead(t);
        else if (index == count)
            AddTail(t);
        else
        {
            Node currentNode = head;
            for (int i = 0; i < index - 1; i++)
            {
                currentNode = currentNode.Next;
            }
            Node newNode = new Node(t);
            newNode.Next = currentNode.Next;
            currentNode.Next = newNode;
        }
        count++;
    }


    public void Reverse()
    {
        if (head == null || head.Next == null)
            return;
        tail = head;
       Node previousNode = null;
       Node currentNode = head;
      Node nextNode = head.Next;
        while (currentNode != null)
        {
            currentNode.Next = previousNode;
            if (nextNode == null)
                break;
            previousNode = currentNode;
            currentNode = nextNode;
            nextNode = nextNode.Next;

        }

        head = currentNode;

    }


    public IEnumerator<T> GetEnumerator()
    {
        Node current = head;

        while (current != null)
        {
            yield return current.Data;
            current = current.Next;
        }
    }
}
31.05.2017
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..