18 / 5 / 2
Регистрация: 24.10.2018
Сообщений: 132
1

Создать класс обобщённый однонаправленный список

05.02.2020, 19:34. Показов 6898. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создать заданный в варианте обобщенный класс. Определить в классе индексаторы, конструкторы, деструктор, необходимые функции и заданные перегруженные операции. В методах класса для работы с аргументами используйте ref‐ и out‐параметры и операторы is или as, foreach. Используйте обработку исключительных ситуаций.

Класс – однонаправленный список list. Дополнительно перегрузить следующие операции: + – объединить два списка; ‐ – удалить элемент; ==, != – проверка на равенство, неравенство; ~– проверка, пустой ли список

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class List1<T>
    {        
        List<int> list = new List<int>();
        public List1(List<int> list)
        {
            this.list = list;
        }
 
        ~List1()
        {
 
        }
 
        public static List1<T> operator +(List1<T> a, List1<T> b)
        {
            a.list.Union(b.list);
            return new List1<T>(a.list);
        }
        public static List1<T> operator -(List1<T> a, int index)
        {
            a.list.Remove(index);
            return new List1<T>(a.list);
        }
              
       public static bool operator ==( List1<T> a1, List1<T> a2)
        {
            return a1.list.SequenceEqual(a2.list);
        }
 
        public static  bool operator !=(List1<T> a1, List1<T> a2)
        {
            return !a1.list.SequenceEqual(a2.list);
        }
 
        public static bool operator ~(List1<T> a)
        {
            return a.list.Any();
        }
      
        public void Print()
        {
            foreach (var u in list)
            {
                Console.Write(u + " ");
            }
            Console.WriteLine();
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
                                
        }
    }
А вопрос у меня такой,как реализовать эти = ,!=,+,- ,~ в main,помогите пожалуйста

Добавлено через 5 часов 4 минуты
Короче,кому интересно,сам додумал,может кому надо будет.(Это ответ):
C#
1
2
3
4
5
6
7
8
9
10
11
12
static void Main(string[] args)
        {
            List1 <int> list1 = new List1 <int>(new List<int> {1,2,3,4,5,6,7,8});
            List1<int> list2 = new List1<int>(new List<int> { 1, 2, 3, 4, 5 });
            List1<int> list3 = list1 + list2;
            list3 = list3 - 2;
            Console.WriteLine(list3 == list2);
            Console.WriteLine(list3 != list2);
            List1<int> list4 = new List1<int>(new List<int> {});
            Console.WriteLine(~list4);
            list3.Print();
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2020, 19:34
Ответы с готовыми решениями:

Создать обобщенный класс, содержащий список элементов (List <T>)
Народ нужна помощь Нужно создать обобщенный класс, содержащий список элементов (List &lt;T&gt;). ...

Создать обобщенный класс прямой на плоскости
Создать обобщенный класс прямой на плоскости. В классе предусмотреть 2 поля типа обобщенной...

Обобщенный и не обобщенный класс с одинаковым именем
Добрый день! Task&lt;int&gt; task = Task.Run(() =&gt; { Console.WriteLine(&quot;Foo&quot;); return 3; }); Как такое...

Создать линейный однонаправленный список из целых чисел
Создать линейный однонаправленный список из целых чисел. Удалить из списка первый четный элемент,...

9
352 / 247 / 76
Регистрация: 18.03.2016
Сообщений: 979
05.02.2020, 19:53 2
Angelosus, это не должно работать
C#
1
2
3
4
5
        public static List1<T> operator +(List1<T> a, List1<T> b)
        {
            a.list.Union(b.list);
            return new List1<T>(a.list);
        }
сделай так
C#
1
2
3
4
5
        public static List1<T> operator +(List1<T> a, List1<T> b)
        {
            var t = a.list.Union(b.list).ToList();
            return new List1<T>(t);
        }
Добавлено через 53 секунды
а вообще это не похоже на однонаправленный список
0
18 / 5 / 2
Регистрация: 24.10.2018
Сообщений: 132
05.02.2020, 20:00  [ТС] 3
jester, почему не должно,и так и так работает?Я просто не понял зачем ToList,результат один же/

Добавлено через 1 минуту
jester, я же внутри класса создал лист,зачем делать из него лист?Не догоняю/
0
352 / 247 / 76
Регистрация: 18.03.2016
Сообщений: 979
05.02.2020, 20:47 4
Angelosus, у тебя правильно работает сложение?
Union вроде должен создавать новую последовательность а не изменять старую.
0
18 / 5 / 2
Регистрация: 24.10.2018
Сообщений: 132
05.02.2020, 21:13  [ТС] 5
jester, да, типо я создаю объект из двух объектов, обьеденяя их, дальше идёт удаление элемента, потом два сравнения, и проверка на пустоту
0
Модератор
Эксперт .NET
15462 / 10707 / 2786
Регистрация: 21.04.2018
Сообщений: 31,521
Записей в блоге: 2
05.02.2020, 21:25 6
Цитата Сообщение от Angelosus Посмотреть сообщение
я же внутри класса создал лист,зачем делать из него лист?Не догоняю/
Union - это метод расширения LINQ, а не метод List.
Методы расширения LINQ не изменяют исходные последовательности, а возвращают новые последовательности как результат операции.
Вы этот результат ни где не сохраняете, он просто теряется.

И по смыслу вы какую-то ерунду делаете.

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

Вы используете List для ОДНОСВЯЗНОЙ (однонаправленной) коллекции.
Это не правильно. List реализует полностью интерфейсы IList и ICollection. Односвязный список не должен их реализовывать.
На месте вашего преподавателя я не зачёл выполнение задания таким образом.
Скорее всего, в задании подразумевается создание кастомного типа для списка и для элемента списка.
0
352 / 247 / 76
Регистрация: 18.03.2016
Сообщений: 979
05.02.2020, 22:17 7
Элд Хасп,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
List реализует полностью интерфейсы IList и ICollection. Односвязный список не должен их реализовывать.
почему?
0
Модератор
Эксперт .NET
15462 / 10707 / 2786
Регистрация: 21.04.2018
Сообщений: 31,521
Записей в блоге: 2
05.02.2020, 22:50 8
Angelosus, вот делал когда-то базовый класс для односвязного списка
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
    /// <summary>Базовый класс односвязного списка</summary>
    /// <typeparam name="T">Тип элемента списка</typeparam>
    public class SinglyLinkedList<T> : IEnumerable<T>
    {
        /// <summary>Внутренний класс элемента списка</summary>
        private class Node
        {
            /// <summary>Ссылка на следующий элемент</summary>
            public Node Next { get; set; }
            /// <summary>Значение элемента</summary>
            public T Value { get; set; }
        }
 
        /// <summary>Первый элемент списка</summary>
        private Node Head { get; set; }
        /// <summary>Последний элемент списка</summary>
        private Node Tail { get; set; }
 
        /// <summary>Добавление элемента в конец списка</summary>
        /// <param name="t">Значение элемнта</param>
        public void Add(T t)
        {
            Node node = new Node() { Value = t };
            if (Head == default)
                Head = Tail = node;
            else
            {
                Tail.Next = node;
                Tail = node;
            }
        }
 
        /// <summary>Добавление последовательности элементов в конец списка</summary>
        /// <param name="items">Последовательность элементов</param>
        public void AddRange(IEnumerable<T> items)
        {
            if (items == null)
                throw new ArgumentNullException(nameof(items));
 
            foreach (T item in items)
                Add(item);
        }
 
        /// <summary>Безпараметрический конструктор</summary>
        public SinglyLinkedList() { }
        /// <summary>Конструктор с заданием начальной коллекции</summary>
        /// <param name="items">Начальная коллекция элементов</param>
        public SinglyLinkedList(IEnumerable<T> items)
            => AddRange(items);
 
 
        public IEnumerator<T> GetEnumerator()
            => new SinglyLinkedListEnumerator(this);
 
        IEnumerator IEnumerable.GetEnumerator()
            => GetEnumerator();
 
        /// <summary>Перечислитель класса SinglyLinkedList</summary>
        public sealed class SinglyLinkedListEnumerator : IEnumerator<T>
        {
            public T Current => CurrentNode == null
                ? throw new InvalidOperationException()
                : CurrentNode.Value;
 
            object IEnumerator.Current => Current;
            private readonly SinglyLinkedList<T> Nodes;
            private Node CurrentNode;
 
            public SinglyLinkedListEnumerator(SinglyLinkedList<T> nodes)
                => Nodes = nodes;
 
            public void Dispose()
            { }
 
            public bool MoveNext()
            {
                if (Nodes == null)
                    return false;
 
                if (CurrentNode == null)
                {
                    if (IsReset)
                    {
                        CurrentNode = Nodes.Head;
                        IsReset = false;
                        return true;
                    }
                    return false;
                }
 
                if (CurrentNode != Nodes.Tail)
                {
                    CurrentNode = CurrentNode.Next;
                    return true;
                }
                CurrentNode = null;
                return false;
            }
            private bool IsReset = true;
            public void Reset()
            {
                CurrentNode = null;
                IsReset = true;
            }
        }
 
    }
Пример использования
C#
1
2
3
4
            SinglyLinkedList<int> list = new SinglyLinkedList<int>() { 1, 3, 2, 5, 4, 7, 6, 9, 8, 0 };
            list.AddRange(new int[] {12, 34, 56, 78, 90, 10, 32, 54, 76, 98 });
 
            Console.WriteLine(string.Join(", ", list));
Теперь вам надо добавить в него (лучше в производный от этого класса) методы нужные вам.

Добавлено через 6 минут
Цитата Сообщение от jester Посмотреть сообщение
почему?
Потому, что IList имеет индесато, а значит можно получить произвольный элемент. А односвязный список подразумевает только возможность последовательного получения элементов.
То есть кроме перечислителя возвращаемого методом GetEnumerator() в односвязном списке ничего быть не должно. Иначе это уже не односвязный список.

Насчёт ICollection, возможно, погорячился.
Думал, там тоже есть метод получения произвольного элемента по индексу.
1
653 / 589 / 171
Регистрация: 17.07.2012
Сообщений: 1,670
Записей в блоге: 1
05.02.2020, 23:26 9
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Потому, что IList имеет индесато, а значит можно получить произвольный элемент. А односвязный список подразумевает только возможность последовательного получения элементов.
То есть кроме перечислителя возвращаемого методом GetEnumerator() в односвязном списке ничего быть не должно. Иначе это уже не односвязный список.
Я присоединяюсь к вопросу. И что? Что мешает получить элемент по индексу в односвязном списке? Алгоритмическая сложность?
0
Модератор
Эксперт .NET
15462 / 10707 / 2786
Регистрация: 21.04.2018
Сообщений: 31,521
Записей в блоге: 2
06.02.2020, 00:57 10
Цитата Сообщение от Cupko Посмотреть сообщение
Я присоединяюсь к вопросу. И что? Что мешает получить элемент по индексу в односвязном списке? Алгоритмическая сложность?
Чем тогда односвязный список отличается от List<T>?
Тогда бы в задании так и было бы сказано "Определить List<T> с дополнительными методами".
Раз в задании написано "Односвязный список", то это и значит "Односвязный список", а не список "List<T>", не массив "T[]" или что-то аналогичное.

Дело не в сложности, а в учебном задании.
На практике такой односвязный список на фиг ни кому не нужен.
Но в таком УЧЕБНОМ задании проверяется навык обучаемого создавать подобные типы, реализовывать, наверное, самый широко используемый интерфейс, типовой инициализатор последовательности и т.д.
А что толку от такого кода?
C#
1
2
3
4
public class MyList<T> : List<T>
{
   /// Здесь добавить перегрузку операторов
}
Что такое выполнение задания может показать, какие навыки студента проверить?
И при чём здесь ОДНОСВЯЗНЫЙ СПИСОК ?
0
06.02.2020, 00:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.02.2020, 00:57
Помогаю со студенческими работами здесь

Обобщенный класс
Задание: Создать обобщенный класс для хранения объектов-исключений. Тип исключения задается при...

Создать класс Кольцевой однонаправленный список
Создать класс Кольцевой_однонаправленный_список, используя для связи элементов списка указатели....

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

Создать класс для работы со стеком, организованным как связный однонаправленный список
Люди помогите, не могу сделать лабораторную, отчисляют из универа дали 2 дня на сдачу долгов, все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru