Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 12.10.2020
Сообщений: 30
1

Создать список без использования библиотек

11.12.2020, 13:12. Показов 1042. Ответов 2
Метки list (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, эксперты! Была мне дана данная задача:

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

Написала я, значит, следующий код:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace List
{
    class Program
    {
        static void Main(string[] args)
        {
            
            List<char> letters = new List<char>();
 
            char letter; //переменная для букв
            char spec; //переменная для спец символа
            Console.WriteLine("Enter spec symbol");
            spec = Convert.ToChar(Console.ReadLine()); //ввод спецсимвола
            Console.WriteLine("Enter any symbol");
            do
            {
                letter = Convert.ToChar(Console.ReadLine()); //ввод букв
                letters.Add(letter); //добавление букв в список
                int index = letters.IndexOf(spec); //нахождение индекса спец символа
                if (letter == spec) //если введенная буква равна ранее веденному спец символу
                {
                    letters.RemoveAt(index - 1); //то удалить букву, стоящую перед спец символом
                }
            }
 
            while (letter != '.'); //вводить до тех пор пока не встретиться точка
                        
            foreach(char i in letters) //покажи список
            {
                Console.WriteLine(i);
            }
            Console.ReadLine();
 
       //это уже доп задания, где говорится, что также должна быть возможность удалять/добавлять 
        //элементы в список, выводить список            
            int check; 
            do 
            {
                Console.WriteLine("1-add new element");
                Console.WriteLine("2-delete element");
                Console.WriteLine("3-print List");
                Console.WriteLine("0-exit");
                check.Convert.ToInt32(Console.ReadLine());
                switch (check);
                {case 1:
                Console.WriteLine("symbol = ");
                letter = Convert.ToChar(Console.ReadLine());
                letters.Add(letter);
                break;
                case 2:
                char delEl;
                Console.WriteLine("symbol = ");
                delEl = Convert.ToChar(Console.ReadLine());
                if (delEl == letter)
                {
                    letters.RemoveAt(letter);
                }
                break;
                case 3:
                listprint(head);
                break;
                }
            } 
    
                while(check!=0);
                return 0;
 
                
            
        }
    }
}
Но, оказалось, что это было слишком просто и список нужно было создавать самим, без использования стандартных библиотек

Наклепала следующий код, но, естественно, у меня куча ошибок

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ListCsharp2;
 
namespace ListCsharp2
{
    //-----------------РЕАЛИЗАЦИЯ ПРОСТОГО АЛГОРИТМА СПИСКА--------------------------------------
 
 
    public class DoublyNode<T>
    {
        public DoublyNode(T data)
        {
            Data = data;
        }
        public T Data { get; set; }
        public DoublyNode<T> Previous { get; set; }
        public DoublyNode<T> Next { get; set; }
    }
    public class DoublyLinkedList<T> : IEnumerable<T>  // двусвязный список
    {
        DoublyNode<T> head; // головной/первый элемент
        DoublyNode<T> tail; // последний/хвостовой элемент
        int count;  // количество элементов в списке
 
        // добавление элемента
        public void Add(T data)
        {
            DoublyNode<T> node = new DoublyNode<T>(data);
 
            if (head == null)
                head = node;
            else
            {
                tail.Next = node;
                node.Previous = tail;
            }
            tail = node;
            count++;
        }
        public void AddFirst(T data)
        {
            DoublyNode<T> node = new DoublyNode<T>(data);
            DoublyNode<T> temp = head;
            node.Next = temp;
            head = node;
            if (count == 0)
                tail = head;
            else
                temp.Previous = node;
            count++;
        }
        // удаление
        public bool Remove(T data)
        {
            DoublyNode<T> current = head;
 
            // поиск удаляемого узла
            while (current != null)
            {
                if (current.Data.Equals(data))
                {
                    break;
                }
                current = current.Next;
            }
            if (current != null)
            {
                // если узел не последний
                if (current.Next != null)
                {
                    current.Next.Previous = current.Previous;
                }
                else
                {
                    // если последний, переустанавливаем tail
                    tail = current.Previous;
                }
 
                // если узел не первый
                if (current.Previous != null)
                {
                    current.Previous.Next = current.Next;
                }
                else
                {
                    // если первый, переустанавливаем head
                    head = current.Next;
                }
                count--;
                return true;
            }
            return false;
        }
 
        public int Count { get { return count; } }
        public bool IsEmpty { get { return count == 0; } }
 
        public void Clear()
        {
            head = null;
            tail = null;
            count = 0;
        }
 
        public bool Contains(T data)
        {
            DoublyNode<T> current = head;
            while (current != null)
            {
                if (current.Data.Equals(data))
                    return true;
                current = current.Next;
            }
            return false;
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return ((IEnumerable)this).GetEnumerator();
        }
 
        IEnumerator<T> IEnumerable<T>.GetEnumerator()
        {
            DoublyNode<T> current = head;
            while (current != null)
            {
                yield return current.Data;
                current = current.Next;
            }
        }
 
        public IEnumerable<T> BackEnumerator()
        {
            DoublyNode<T> current = tail;
            while (current != null)
            {
                yield return current.Data;
                current = current.Previous;
            }
        }
 
        public System.Collections.IEnumerator GetEnumerator()  //вот это исключение выскакивало, мне было не понятно почему, поэтому я решила заткнуть его
        {
            return null; // TODO Implement Foo() method
            //throw new NotImplementedException();
        }
    }
}
//-----------------РЕАЛИЗАЦИЯ ПРОСТОГО АЛГОРИТМА СПИСКА--------------------------------------
 
class Program
    {
        static int Main(string[] args)
        {
       
        DoublyLinkedList<char> letterS = new DoublyLinkedList<char>();
 
            char letter;
            char spec;
            Console.WriteLine("Enter spec symbol");
            spec = Convert.ToChar(Console.ReadLine());
            Console.WriteLine("Enter any symbol");
            do
            {
                letter = Convert.ToChar(Console.ReadLine());
                letterS.Add(letter);
            int index = letterS.IndexOf(spec);
            if (letter == spec)
            {
                letterS.Remove(index - 1);
            }
        }
 
            while (letter != '.');
 
        foreach (char i in letterS)
            {
                Console.WriteLine(i);
            }
            Console.ReadLine();
 
            int check;
            do
            {
                Console.WriteLine("1-add new element");
                Console.WriteLine("2-delete element");
                Console.WriteLine("3-print List");
                Console.WriteLine("0-exit");
                check = Convert.ToInt32(Console.ReadLine());
                switch (check)
                {
                    case 1:
                        Console.WriteLine("symbol = ");
                        letter = Convert.ToChar(Console.ReadLine());
                        letterS.Add(letter);
                        break;
                    case 2:
                        char delEl;
                        Console.WriteLine("symbol = ");
                        delEl = Convert.ToChar(Console.ReadLine());
                        if (delEl == letter)
                        {
                            letterS.Remove(letter);
                        }
                        break;
                    case 3:
                        foreach (char i in letterS)
                        {
                            Console.WriteLine(i);
                        }
                        break;
                    default:
                        break;
                }
            }
 
            while (check != 0);
            return 0;
 
 
 
        }
    }
//}
У меня вопрос по двум ошибкам:
1. Которая возникает в фориче
Создать список без использования библиотек

Я знаю, что там все по-русски написано, но я не понимаю что делать нужно создать метод, выводящий список на экран в классе? Или что-то где-то не дообъявила?
2. Которая возникает в самой сути задания
Создать список без использования библиотек

Поскольку по заданию надо использовать двусвязный список, то потребность в использовании индекса отпадает? Теперь, чтобы удалить элемент, который находится до специального символа надо знать previous специального символа? Но как?
Заранее спасибо!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2020, 13:12
Ответы с готовыми решениями:

Как сделать архиватор без использования библиотек zip, для всех типов файлов?
Как сделать архиватор на c# без использования библиотек zip, для всех типов файлов?

Добавить элементы в двусвязный список без использования коллекций
Добрый день. Как можно добавить элементы в двусвязный список без использования коллекций?

Как создать приложение, решения уравнения в полных дифференциалах (без библиотек)?
пример решения тут https://function-x.ru/differential_equations5.html Добавлено через 5 часов 22...

Архивирование каталога без использования сторонних библиотек
может кто сталкивался...кодом поделится;)

2
454 / 278 / 163
Регистрация: 17.04.2019
Сообщений: 1,637
11.12.2020, 13:42 2
Pincd, а зачем усложнили себе задачу и сделали двусвязный список? Гораздо проще было сделать список на основе массива, который более прост для понимания.

По теме:
1) Cначала удалите метод со 147 строчки вашего кода, он как раз и вызывает первое исключение.
2) Сделайте поиск по списку, который будет возвращать индекс найденного элемента. Это и будет вашей реализацией метода IndexOf.
0
0 / 0 / 0
Регистрация: 12.10.2020
Сообщений: 30
12.12.2020, 21:35  [ТС] 3
а зачем усложнили себе задачу и сделали двусвязный список?
Не я усложнила, а преподаватель) помимо того, что нужно было самой реализовать создание списка так еще и двусвязный.

И, я думаю, что двусвязный нужно было использовать не просто так и то что я использовала метод IndexOf для задачи думаю не правильно.

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

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

Например список:
a
b
/
c

где "/" - специальный символ. И чтобы удалить символ, предшествующий ему (то есть символ "b"), необходимо указатель prev символа "/" на символ "b" поменять на символ "a". Таким образом мы, получается, удалим символ "b". Но я не понимаю как это осуществить в коде, звучит сложно
0
12.12.2020, 21:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2020, 21:35
Помогаю со студенческими работами здесь

Парсинг HTML без использования сторонних библиотек
Доброго времени суток всем кто читает сеё сообщение %) Прошу помочь кодом, советами, примером,...

Рисование 3D фигур без использования сторонних библиотек
в последнее время стало интересно как рисовать математически 3D фигуры в c# при этом не используя...

Как реализовать на C# алгоритм blockchain без использования сторонних библиотек?
Добрый день! Хочу реализовать алгоритм blockchain в своём приложении (не для денежных операций)....

Чтение ID3v2 в MP3 тегов без использования сторонних библиотек
Здравствуйте господа. Я столкнулся с проблемой при чтении ID3v2 тегов: в случае использования...

Создать список без использования STL
Составьте программу, которая: - создает список из 10-ти элементов; - удаляет 1-й элемент...

Создать список из четных чисел без использования if
Скажите пожалуйста,как создать список, например из 40 четных чисел, без использования if?


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

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